从u-boot打印信息可以看到,使用网卡是cs8900,但开发板上集成的是dm000,需要修改代码以支持dm9000(使用内核自带dm9000驱动)
1、修改配置更换网卡
cs8900的源文件放在drivers/net中
找到宏CONFIG_CS8900
cat drivers/net/Makefile | grep cs8900
为了使用网卡cs8900,需要定义宏CONFIG_CS8900 ,它定义在include/configs/smdk2440.h
修改include/configs/smdk2440.h,取消cs8900的配置,配置上dm9000
#if 0
#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 */
#endif
#define CONFIG_DRIVER_DM9000
重新编译uboot,遇到错误
dm9000x.c:156: error: 'DM9000_DATA' undeclared (first use in this function)
可能是缺乏一些宏的定义
2、修改代码
通过下面命令发现其它单板会在include/configs/配置文件中定义DM9000_DATA
grep “DM9000_DATA” * -nR
搜索到的定义格式如下:
#define CONFIG_DRIVER_DM9000
#define CONFIG_DM9000_BASE xxx
#define DM9000_IO xxx
#define DM9000_DATA xxx
在include/configs/smdk2440.h中补充上述定义
#define CONFIG_DM9000_BASE 0x20000000 //从S3C2440内存分布图知道
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE+4)//原理图中可以看到LADDR2接到DM9000的CMD引脚
除此以外,因为网卡是内存设备,不同网卡、不同单板可能内存控制器配置参数不同,修改board/samsung/smdk2440/lowlevel_init.S
/*
.long 0x22011110 //BWSCON
.long 0x00000700 //BANKCON0
.long 0x00000700 //BANKCON1
.long 0x00000700 //BANKCON2
.long 0x00000700 //BANKCON3
.long 0x00000700 //BANKCON4
.long 0x00000700 //BANKCON5
.long 0x00018005 //BANKCON6
.long 0x00018005 //BANKCON7
.long 0x008C04F4 // REFRESH
.long 0x000000B1 //BANKSIZE
.long 0x00000030 //MRSRB6
.long 0x00000030 //MRSRB7
*/
.long 0x22011110 //BWSCON
.long 0x00000700 //BANKCON0
.long 0x00000700 //BANKCON1
.long 0x00000700 //BANKCON2
.long 0x00000700 //BANKCON3
.long 0x00000740 //BANKCON4
.long 0x00000700 //BANKCON5
.long 0x00018005 //BANKCON6
.long 0x00018005 //BANKCON7
.long 0x008C04F4 // REFRESH
.long 0x000000B1 //BANKSIZE
.long 0x00000030 //MRSRB6
.long 0x00000030 //MRSRB7
重新编译烧写试验,提示
Net: No ethernet found.
通过下面命令定位到arch/arm/lib/board.c:600
grep "Net:" * -nR | grep arm
定位位置后就是网卡初始化
eth_initialize(gd->bd);
找不到网卡的原因可能是初始化不正确,跟踪调用过程
eth_initialize
board_eth_init
cs8900_initialize
网卡初始化用的是cs8900的初始化,将其修改为dm9000的初始化
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;
}
重新编译烧写试验,uboot能够找到网卡
设置IP地址(与虚拟机处于同一网段)
set ipaddr 192.168.0.200
ping虚拟机时提示错误
*** ERROR: ‘ethaddr’ not set
设置 ethaddr:在虚拟机中输入ifconfig找到HWaddr,修改最后一位数字即可用于设置开发板ethaddr
set ethaddr 00:0c:29:4c:4b:85
设置好后即可ping通虚拟机,也可以通过tftp下载uboot或者其它文件(下载时要保证下载文件处于Tftpd32这个软件的Current Directory中)
下载之前还要设置服务器ip(windows pc的命令行输入ipconfig可以查看,必须与开发板处于同一网段)
set serverip 192.168.0.100