一、移植環(huán)境
- 主 ?機(jī):VMWare--Fedora 9
- 開發(fā)板:Mini2440--64MB Nand,Kernel:2.6.30.4
- 編譯器:arm-linux-gcc-4.3.2.tgz
- u-boot:u-boot-2009.08.tar.bz2
二、移植步驟
在這一篇中,我們首先讓開發(fā)板對CS8900或者DM9000X網(wǎng)卡的支持,然后再分析實(shí)現(xiàn)u-boot怎樣來引導(dǎo)Linux內(nèi)核啟動。因?yàn)闇y試u-boot引導(dǎo)內(nèi)核我們要用到網(wǎng)絡(luò)下載功能。
7)u-boot對CS8900或者DM9000X網(wǎng)卡的支持。
u-boot-2009.08版本已經(jīng)對CS8900和DM9000X網(wǎng)卡有比較完善的代碼支持(代碼在drivers/net/目錄下),而且在S3C24XX系列中默認(rèn)對CS8900網(wǎng)卡進(jìn)行配置使用。只是在個別地方要根據(jù)開發(fā)板的具體網(wǎng)卡片選進(jìn)行設(shè)置,就可以對S3C24XX系列中CS8900網(wǎng)卡的支持使用。代碼如下:
?
現(xiàn)在修改對我們開發(fā)板上DM9000X網(wǎng)卡的支持。首先,我們看看drivers/net/目錄下有關(guān)DM9000的代碼,發(fā)現(xiàn)dm9000x.h中對CONFIG_DRIVER_DM9000宏的依賴,dm9000x.c中對CONFIG_DM9000_BASE宏、DM9000_IO宏、DM9000_DATA等宏的依賴,所以我們修改代碼如下:
#gedit include/configs/my2440.h
/* * Hardware drivers */? 屏蔽掉u-boot默認(rèn)對CS8900網(wǎng)卡的支持
//#define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */
//#define CS8900_BASE????????? 0x19000300
//#define CS8900_BUS16???????? 1 /* the Linux driver does accesses as shorts */
?
//添加u-boot對DM9000X網(wǎng)卡的支持
#define CONFIG_DRIVER_DM9000??? 1?
#define CONFIG_NET_MULTI??????? 1
#define CONFIG_DM9000_NO_SROM?? 1
#define CONFIG_DM9000_BASE????? 0x20000300? //網(wǎng)卡片選地址
#define DM9000_IO?????????????? CONFIG_DM9000_BASE
#define DM9000_DATA???????????? (CONFIG_DM9000_BASE + 4)?? //網(wǎng)卡數(shù)據(jù)地址
//#define CONFIG_DM9000_USE_16BIT 1
注意:
u-boot-2009.08 可以自動檢測DM9000網(wǎng)卡的位數(shù),根據(jù)開發(fā)板原理圖可知網(wǎng)卡的數(shù)據(jù)位為16位,并且網(wǎng)卡位于CPU的BANK4上,所以只需在 board/samsung/my2440/lowlevel_init.S中設(shè)置 #define B4_BWSCON?(DW16)?即可,不需要此處的?#define CONFIG_DM9000_USE_16BIT 1
?
//給u-boot加上ping命令,用來測試網(wǎng)絡(luò)通不通
#define CONFIG_CMD_PING?
?
//恢復(fù)被注釋掉的網(wǎng)卡MAC地址和修改你合適的開發(fā)板IP地址
#define CONFIG_ETHADDR???08:00:3e:26:0a:5b? //開發(fā)板MAC地址
#define CONFIG_NETMASK???255.255.255.0
#define CONFIG_IPADDR??? 192.168.1.105????? //開發(fā)板IP地址
#define CONFIG_SERVERIP??192.168.1.103????? //Linux主機(jī)IP地址
添加板載DM9000網(wǎng)卡初始化代碼,如下:
#gedit board/samsung/my2440/my2440.c
#include
#include
?
#ifdef CONFIG_DRIVER_DM9000
int board_eth_init(bd_t *bis)
{
??? return dm9000_initialize(bis);
}
#endif
?
修改MD9000網(wǎng)卡驅(qū)動代碼,如下:
#gedit drivers/net/dm9000x.c
#if 0? //屏蔽掉dm9000_init函數(shù)中的這一部分,不然使用網(wǎng)卡的時候會報(bào)“could not establish link”的錯誤
????i = 0;
????while (!(phy_read(1) & 0x20)) {????/* autonegation complete bit */
????????udelay(1000);
????????i++;
????????if (i == 10000) {
????????????printf("could not establish link ");
????????????return 0;
????????}
????}
#endif
然后重新編譯u-boot,下載到Nand中從Nand啟動,查看啟動信息和環(huán)境變量并使用ping命令測試網(wǎng)卡,操作如下:
?
使用: 中括號括起來的是可選的
mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image
選項(xiàng):
-A:set architecture to 'arch'?????? //用于指定CPU類型,比如ARM
-O:set operating system to 'os'???? //用于指定操作系統(tǒng),比如Linux
-T:set image type to 'type'???????? //用于指定image類型,比如Kernel
-C:set compression type 'comp'????? //指定壓縮類型
-a:set load address to 'addr' (hex) //指定image的載入地址
-e:set entry point to 'ep' (hex)??? //內(nèi)核的入口地址,一般為image的載入地址+0x40(信息頭的大?。?br>-n:set image name to 'name'???????? //image在頭結(jié)構(gòu)中的命名
-d:use image data from 'datafile'?? //無頭信息的image文件名
-x:set XIP (execute in place)?????? //設(shè)置執(zhí)行位置
mkimage -n 'linux-2.6.30.4' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage uImage.img
???????? 起始地址??????結(jié)束地址
uboot : 0x00000000??? 0x00030000
param : 0x00030000??? 0x00040000 //注意這個環(huán)境變量的地址范圍要與上一節(jié)補(bǔ)充內(nèi)容中配置的CONFIG_ENV_OFFSET一致
kernel: 0x00050000??? 0x00200000
root? : 0x00250000??? 0x03dac000
//設(shè)置啟動參數(shù),意思是將nand中0x50000-0x00200000(和kernel分區(qū)一致)的內(nèi)容讀到內(nèi)存0x31000000中,然后用bootm命令來執(zhí)行
set bootcmd 'nand read 0x31000000 0x50000 0x00200000;bootm 0x31000000'
saveenv? //保存設(shè)置
tftp 0x30000000 uImage.img? //將uImage.img下載到內(nèi)存0x30000000處
nand erase 0x50000 0x200000 //擦除nand的0x50000-0x200000的內(nèi)容
nand write 0x30000000 0x50000 0x200000 //將內(nèi)存0x30000000處的內(nèi)容寫入到nand的0x50000處
#define MACH_TYPE_SMDK2440 1008? //針對2440的MACH_TYPE碼的值定義為1008
#gedit board/samsung/my2440/my2440.c?? //修改board_init函數(shù)
/* arch number of SMDK2410-Board */
//gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
改為:
gd->bd->bi_arch_number = MACH_TYPE_SMDK2440;
smdk2440??MACH_SMDK2440???SMDK2440???1008
#gedit arch/arm/mach-s3c2440/mach-smdk2440.c?? //修改文件最后面
//MACHINE_START(S3C2440, "SMDK2440")
改為:
MACHINE_START(SMDK2440, "SMDK2440")
#gedit arch/arm/kernel/head.S? //在ENTRY(stext)下添加如下代碼(紅色部分)
ENTRY(stext)
??? mov??? r0, #0
??? mov??? r1, #0x3f0?? //上面的MACH_TYPE值1008換成十六進(jìn)制就是0x3f0
??? ldr??? r2, =0x30000100
?
??? msr?cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE
??? .......
#gedit drivers/net/dm9000x.c? //屏蔽掉dm9000_halt函數(shù)中的內(nèi)容
/*
??Stop the interface.
??The interface is stopped when it is brought.
*/
static void dm9000_halt(struct eth_device *netdev)
{
????//DM9000_DBG("%sn", __func__);
????///* RESET devie */
????//phy_write(0, 0x8000);????/* PHY RESET */
????//DM9000_iow(DM9000_GPR, 0x01);????/* Power-Down PHY */
????//DM9000_iow(DM9000_IMR, 0x80);????/* Disable all interrupt */
????//DM9000_iow(DM9000_RCR, 0x00);????/* Disable RX */
}
?
#gedit include/configs/my2440.h
/*
?* Hardware drivers
?*/
#define CONFIG_DRIVER_CS8900??1????????/* we have a CS8900 on-board */
#define CS8900_BASE???????????0x19000300 //注意:對不同的開發(fā)板就是要修改這個片選地址參數(shù),這個參數(shù)值就看開發(fā)板上網(wǎng)卡的片選引腳是接到ARM芯片存儲控制器的哪個Bank上
#define CS8900_BUS16??????????1????????/* the Linux driver does accesses as shorts */
評論
查看更多