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)在这个函数中,仅仅有对cs9000的初始化,而且还被我们给去掉了,查看一下 DM9000x.c ,寻找DM9000的初始化函数,修改。board\samsung\smdk2440\smdk2440.c
{
int rc = 0;
#ifdef CONFIG_CS8900
rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif
return rc;
}
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;}
至此,nor启动版本的u-boot似乎移植完了,其实还没有,如果你save一下环境变量的话,就会破坏nor中Uboot的代码,因此环境变量存放的位置我们需要修改一下,顺便修改一下默认的环境变量。
common\Env_flash.c
int env_init(void)默认的环境变量数组 default_environment 在 common\Env_common.c ,但是只有当我们定义了那些环境变量的时候,他们才会被添加到 default_environment 中去。我们在配置文件 smdk2440.h 中添加修改相关定义。
{
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;
}
#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)在 saveenv 中,up_data 是环境变量的存放地址,flash_addr 为环境变量的起始地址 CONFIG_ENV_ADDR,CONFIG_ENV_SIZE 是环境变量的大小。
{
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);
....
在 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