移植u-boot2012.04.1 -》2440 (四)DM9000移植,环境变量设置

时间:2022-05-18 17:12:29

    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之后,重启,使用默认的环境变量就会看到了哦!