天天看點

移植u-boot2012.04.1 -》2440 (四)DM9000移植,環境變量設定

    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 才會被編譯。剩下的如果不加則會編譯報錯咯!

移植u-boot2012.04.1 -》2440 (四)DM9000移植,環境變量設定

    因為我們的 DM9000 是接在 bank4 上的,bank4 的起始位址是 0x20000000 

    是以 CONFIG_DM9000_BASE  == 0x20000000

    那麼 DM9000_IO  DM9000_DATA 為何如此取值呢?我在DM9000晶片手冊找到了這麼一段話

移植u-boot2012.04.1 -》2440 (四)DM9000移植,環境變量設定

    cmd == 0 是 Index 索引端口,索引端口的内容是資料端口的寄存器位址。

    cmd == 1 是 資料端口。

    我們可以看到 DM9000 晶片 cmd 引腳接的是 lddr2 ,lddr2 == 0 索引端口,lddr2 == 1 資料端口

    發送位址 0x20000000 lddr2 == 0 索引端口 DM9000_IO

    發送位址 0x20000004 lddr2 == 1 資料點口 DM9000_DATA

    make 編譯通過 燒寫

移植u-boot2012.04.1 -》2440 (四)DM9000移植,環境變量設定

    直接沒有識别到網卡,搜尋一下,看看是在哪裡進行初始化的。

    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;
}
           
移植u-boot2012.04.1 -》2440 (四)DM9000移植,環境變量設定

    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

移植u-boot2012.04.1 -》2440 (四)DM9000移植,環境變量設定

     第一個目标,終于完成了~下一個目标,使他支援兩種啟動方式。上面這個圖中并未列印出網卡MAC位址是因為我們的環境變量已經存在,擦出整片Norflash之後,重新開機,使用預設的環境變量就會看到了哦!