移植u-boot-2016.11到JZ2440(五:修改源码之支持DM9000C网卡)
目录
5. 修改源码之支持DM9000C网卡
5.1 分析网卡初始化过程
5.2 修改源码
5.2.1 修改相关宏
5.2.2 修改BANK4控制寄存器
5.2.3 修改使用dm9000网卡驱动函数
5.3 测试
5. 修改源码之支持DM9000C网卡
U-Boot已经带有dm9000网卡的驱动,位于drivers/net/目录下的dm9000x.h、dm9000x.c文件中。只需修改部分硬件相关代码就可以让U-Boot支持DM9000C网卡。
JZ2440开发板上的dm9000C相关内容看二十一、Linux驱动之移植DM9000C网卡驱动(下)该文章。从该文章可知:
1. DM9000C是放在2440的bank4(0X20000000)的片选上面,也就是说DM9000C芯片物理基地址应设为0x20000000;
2. DM9000的CMD引脚接在bank4的LADDR2上面,也就是说当向0X20000000地址上读写数据时,此时CMD为低,则读写的便是DM9000C的地址;向0X20000000+4地址上读写数据时,此时CMD为高,则读写的便是DM9000C的数据。
下面开始分析并修改代码使U-Boot支持DM9000C网卡。
5.1 分析网卡初始化过程
查找源码知道“Net:”是在第二阶段调用board_init_r()函数时循环调用init_sequence_r数组里的函数,调用到initr_net函数时输出的,代码如下所示(common/board_r.c文件中):
static int initr_net(void)
{
puts("Net: ");
eth_initialize();
return 0;
}
显然是在eth_initialize()函数中初始化网卡的,该函数代码如下(net/eth_legacy.c文件中):
int eth_initialize(bd_t *bis)
{
... ...
if (board_eth_init != __def_eth_init) {
if (board_eth_init(bis) < 0)
printf("Board Net Initialization Failed\n");
} else if (cpu_eth_init != __def_eth_init) {
if (cpu_eth_init(bis) < 0)
printf("CPU Net Initialization Failed\n");
} else
printf("Net Initialization Skipped\n");
... ...
接着调用board_eth_init()函数,代码如下(board/samsung/jz2440/jz2440.c文件):
int board_eth_init(bd_t *bis)
{
int rc = 0;
#ifdef CONFIG_CS8900
rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif
return rc;
}
可见只调用了CS8900相关的网卡驱动。
5.2 修改源码
下面接着修改源码使U-Boot支持DM9000C网卡。
5.2.1 修改相关宏
查看drivers/net/目录下的Makefile有如下:
源码默认使用的是CS8900网卡驱动,下面修改相关宏使U-Boot使用dm9000网卡驱动。修改include/configs/jz2440.h文件如下内容:
改为:
#define CONFIG_DRIVER_DM9000
#define CONFIG_DM9000_BASE 0x20000000
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE + 4)
5.2.2 修改BANK4控制寄存器
因为网卡接在bank4上,BANKCON4寄存器要设置正确,确保以下内容(board/samsung/jz2440/lowlevel_init.S文件):
在start.S启动文件中bl cpu_init_crit时就会设置BANKCON4寄存器了。
5.2.3 修改使用dm9000网卡驱动函数
修改board_eth_init()函数代码如下(board/samsung/jz2440/jz2440.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
rc = dm9000_initialize(bis);
#endif
return rc;
}
5.3 测试
重新编译,按照移植u-boot-2016.11到JZ2440(三:修改源码之实现NOR启动与NAND启动)的3.3.7 测试NAND Flash启动内容进行烧写启动,串口输出如下:
下面测试DM9000C网卡,输入print命令查看:
修改开发板IP地址与MAC网关,输入如下命令:
set ipaddr 192.168.1.17 (设置开发板IP地址为192.168.1.17)
set ethaddr 00:0c:29:15:ee:31 (设置MAC网关,可以在虚拟机上ifconfig查看MAC)
ping 192.168.1.12 (ping主机IP地址)
可以看到成功ping通了。使用网卡的TFTP下载功能如下:
set serverip 192.168.1.12 (设置tftp服务器的IP地址,然后打开电脑上的tftp软件)
tftp 30000000 uImage (下载tftp软件里设置的路径下的名为“uImage”的内核文件)