u-boot-2012.04.01移植(九)提供dm9000网卡支持

从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

 

 

 

你可能感兴趣的:(uboot)