SMDK2410 預設使用的網卡是 CS8900 ,而我們的 2440 則是 DM9000 ,uboot 中已經完美支援 DM9000 ,是以我們隻需要把 CS8900 換成 DM9000即可。
在 smdk2440.h 中
去掉:
#define CONFIG_CS8900
#define CONFIG_CS8900_BASE
#define CONFIG_CS8900_BUS16
添加:
#define CONFIG_DRIVER_DM9000
#define CONFIG_DM9000_BASE 0x20000000
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE+4)
有些同學可能要問為什麼添加這些寄存器,CONFIG_DEVICE_DM9000 是必須要添加的,根據 makefile ,隻要定義了 CONFIG_DEVICE_DM9000 時,DM9000x.c 才會被編譯。剩下的如果不加則會編譯報錯咯!
因為我們的 DM9000 是接在 bank4 上的,bank4 的起始位址是 0x20000000
是以 CONFIG_DM9000_BASE == 0x20000000
那麼 DM9000_IO DM9000_DATA 為何如此取值呢?我在DM9000晶片手冊找到了這麼一段話
cmd == 0 是 Index 索引端口,索引端口的内容是資料端口的寄存器位址。
cmd == 1 是 資料端口。
我們可以看到 DM9000 晶片 cmd 引腳接的是 lddr2 ,lddr2 == 0 索引端口,lddr2 == 1 資料端口
發送位址 0x20000000 lddr2 == 0 索引端口 DM9000_IO
發送位址 0x20000004 lddr2 == 1 資料點口 DM9000_DATA
make 編譯通過 燒寫
直接沒有識别到網卡,搜尋一下,看看是在哪裡進行初始化的。
arch\arm\lib\board.c -> board_init_r
puts("Net: ");
eth_initialize(gd->bd); -> board_eth_init
int board_eth_init(bd_t *bis)
{
int rc = 0;
#ifdef CONFIG_CS8900
rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif
return rc;
}
在這個函數中,僅僅有對cs9000的初始化,而且還被我們給去掉了,檢視一下 DM9000x.c ,尋找DM9000的初始化函數,修改。board\samsung\smdk2440\smdk2440.c
int board_eth_init(bd_t *bis)
{
int rc = 0;
#ifdef CONFIG_CS8900
rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif
#ifdef CONFIG_DRIVER_DM9000
dm9000_initialize(bis);
#endif
return rc;
}
DM9000 已經能夠正确識别,可以使用 tftp 進行下載下傳,但是這個版本的 nfs 好像不太好用。
至此,nor啟動版本的u-boot似乎移植完了,其實還沒有,如果你save一下環境變量的話,就會破壞nor中Uboot的代碼,是以環境變量存放的位置我們需要修改一下,順便修改一下預設的環境變量。
common\Env_flash.c
int env_init(void)
{
if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc) {
gd->env_addr = (ulong)&(env_ptr->data);
gd->env_valid = 1;
return 0;
}
gd->env_addr = (ulong)&default_environment[0];
gd->env_valid = 0;
return 0;
}
預設的環境變量數組 default_environment 在 common\Env_common.c ,但是隻有當我們定義了那些環境變量的時候,他們才會被添加到 default_environment 中去。我們在配置檔案 smdk2440.h 中添加修改相關定義。
#define CONFIG_BOOTARGS "noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200"
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.1.253
#define CONFIG_SERVERIP 192.168.1.15
#define CONFIG_ETHADDR 00:50:C2:1E:AF:FE //抄的uboot中其它開發闆
#define CONFIG_DM9000_NO_SROM //不加這個宏會列印一個警告資訊
int saveenv(void)
{
env_t env_new;
ssize_t len;
int rc = 1;
char *res, *saved_data = NULL;
#if CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE
ulong up_data = 0;
up_data = end_addr + 1 - ((long)flash_addr + CONFIG_ENV_SIZE);
....
在 saveenv 中,up_data 是環境變量的存放位址,flash_addr 為環境變量的起始位址 CONFIG_ENV_ADDR,CONFIG_ENV_SIZE 是環境變量的大小。
在 smdk2440.h 中
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x070000)//CONFIG_SYS_FLASH_BASE == 0
#define CONFIG_ENV_SIZE 0x10000
也就是說環境變量存放在 Nor flash 448k 的地方,空間大小為 64k ,我的norflash 是2M 的索性将它放在2M的最後,也就是 0x1F0000 處。
修改 #define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE +0x1F0000 )
同時,關閉debug開關。include/common.h
第一個目标,終于完成了~下一個目标,使他支援兩種啟動方式。上面這個圖中并未列印出網卡MAC位址是因為我們的環境變量已經存在,擦出整片Norflash之後,重新開機,使用預設的環境變量就會看到了哦!