五,移植uboot-支持DM9000网卡
文档时间:2018-08-13
交叉编译器:arm-linux-gcc-4.3.2
Ubuntu版本:16.04
uboot版本:2013.10
1,修改代码,把 DM9000 编译进 uboot
uboot-2013.10本身就带有 dm9000网卡驱动的支持,相关代码位于 drivers/net 下的 dm9000x.c 和 dm9000x.h 文件
前面章节修改的 uboot 打印信息如下:
uboot 默认支持的网卡是 CS8900,打开 drivers/net 目录下的 Makefile,找到与 cs8900 和 dm9000 有关的语句:
可以看出要想将 dm9000x.c 文件编译进去,必须包含 CONFIG_DRIVER_DM9000 这个宏,搜索 CONFIG_CS8900 位于 include/configs/jz2440.h 文件中,仿照其它单板对 dm9000 网卡的支持,
修改 include/configs/jz2440.h,修改代码如下(红色部分为修改部分):
/* * Hardware drivers */ //#define CONFIG_CS8900 /* we have a CS8900 on-board */ //#define CONFIG_CS8900_BASE 0x19000300 //#define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */ #define CONFIG_DRIVER_DM9000 1 #define CONFIG_DM9000_BASE 0x20000000 /* CS4 */ #define DM9000_IO (CONFIG_DM9000_BASE) #define DM9000_DATA (CONFIG_DM9000_BASE + 4)
CONFIG_DM9000_BASE 和 DM9000_DATA 值得确定是参照 JZ2440原理图设定,如下图所示:
CS 信号接的是 nGS4 引脚,因此值为 0x20000000,LADDR2 接 CMD 引脚,因此偏移量为 4
2,分析网卡驱动的启动流程,加载 DM9000 的初始化
uboot 第二阶段的入口函数为 board_init_r (位于 arch/arm/lib/board.c 文件中),打开 board_init_r 函数:
此句为以太网初始化函数,打开 board_init_r->eth_initialize 函数(位于 net/eth.c 文件中):
然后打开 board_init_r->eth_initialize->board_eth_init 函数(位于 board/samsung/jz2440.c 文件中):
可以看出只有对 CS8900 网卡的支持,没有 DM9000的初始化,仿照其它单板对 DM9000 的初始化,修改代码(红色为修改部分):
#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 #ifdef CONFIG_DRIVER_DM9000 rc = dm9000_initialize(bis); #endif return rc; } #endif
然后编译,烧写,测试,打印如下图所示:
已经识别出 DM9000 ,接下来实验能不能 ping 通 PC机,输入命令:
set ipaddr 192.168.2.90 ping 192.168.2.101
出现如下错误:
说明未设置 MAC 地址,参考别人设置的 MAC 地址,设置如下:
set ethaddr 00:0c:29:3b:22:2a //设置MAC地址 ping 192.168.2.101 //重新ping
可以 ping 成功:
(PS:如果还是不能ping成功,检查一下lowlevel_init.S 中内存控制器的位宽有没有设置正确)
使用 tftp 烧写u-boot.bin(烧写之前需要打开tftp PC端的服务):
set ipaddr 192.168.2.90 //设置本机ip地址
set serverip 192.168.2.101 //设置服务器ip地址
set ethaddr 00:0c:29:3b:22:2a //设置MAC地址
tftp 30000000 u-boot.bin nand erase 0 80000 nand write 30000000 0 80000
成功烧写。。。说明DM9000网卡驱动移植成功