前言:DM9000C网卡移植
1.添加uboot中网卡的驱动到工程中
由于uboot已经有支持DM9000C的网卡驱动,所以我么这里先把驱动添加到makefile中。
从上面makefile可以看到,只要添加了CONFIG_DRIVER_DM9000这个宏,就能把改驱动增加进去,所以我们先去添加这个宏,我们先全局搜一下这个宏,看看还需要定义哪些相关的东西。
找到别人使用该网卡定义的宏,我们这里也这样定义
2.修改宏定义
首先修改基地址,根据原理图我们知道,在2440上网卡是在back4区域,所以基地址是0x20000000
DM9000的地址线和数据线是分离的,但是数据线上可以传输命令或者数据,需要使用信号线CMD区分,查看原理图,方便起见将 LADDR2 信号线接到 CMD 引脚上,当作控制信号来用。
所以当发出的地址中 bit2 为0时,表示数据线上传输的命令,当发出地址中 bit 2 为1时,表示传输的是数据,DM9000_DATA宏定义就表示发数据时地址应该有什么变化,将bit 2置为1即可:
综合以上修改,最后修改结果如图:
3.设置内存控制器支持网卡
根据原理图,网卡DM9000是接到内存控制器的BANK4的,所以需要设置内存控制器中BANK4的位宽参数和时序参数。
通过内存控制器的 BWSCON 寄存器来设置数据总线位宽:
通过内存控制器的 BANKCON4 来设置 BANK4 的时序参数:
根据DM9000的时序性能,此寄存器的值可以设置为0x00000740。
在uboot中修改内存控制器设置:
B4_BWSCON寄存器的设置是DW16,和DM9000一致,不用修改:
时序参数宏定义中只需要修改一处即可:
编译之后,结果还是不符合预期,提示找不到网卡,根据启动过程进行错误分析。
4.修改初始化函数
在uboot启动的第二阶段board_init_r函数中,网卡初始化调用的是eth_initialize函数:
分析代码发现有一个板载相关的初始化函数,追进去发现是在smdk_2440.c文件中
#ifdef CONFIG_CMD_NET
int board_eth_init(bd_t *bis)
{
int rc = 0;
#ifdef CONFIG_CS8900
rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif
return rc;
}
#endif
这里我们发现我们已经注释掉了CONFIG_CS8900,所以这里肯定找不到网卡,我们替换掉这里的宏
重新编译,没有问题。