u-boot-2014.10移植第18天----添加DM9000网卡支持(二)

时间:2021-10-18 10:07:59

硬件平台:tq2440

开发环境:Ubuntu-3.11

u-boot版本:2014.10

本文允许转载,请注明出处:http://blog.csdn.net/fulinus


修改代码

一不小心把这篇本已写好的博客删除了,回收站竟然没有保存草稿的东西。现在只能重新写了!

DM9000自身也有基地址,这个基地址是由TXD[3:0](strap pins)引脚来约束的,满足公式:

IO base = (strap pin value of TXD[2:0]) * 10H + 300H

TXD[2:0]引脚有8中状态,故IO基地址有8种基地址,它们是300H,310H,320H,340H,350H,360H和370H。

毕竟有些应用场合会用到多片DM9000网卡,因此需要根据每个网卡的基地址来选择需要操作的网卡,SA4~9是地址总线,用来选择DM9000,当SA9和SA8引脚高电平,SA7和AEN处于低电平,SA6~4引脚状态与TXD2~0(strap pins)引脚状态匹配时,该DM9000网卡就会被选中。

TQ2440原理图上面DM9000部分电路图表明TXD2~0引脚是悬空的,那他是处于什么状态呢?SA7~4引脚是直接地的,即低电平的,因此推测悬空的TXD2~0引脚状态为低电平,要不然,dm9000网卡就不会被选中。SA9~8是接3.3V电压,故为高电平。因此推断DM9000基地址是300H。

考虑到DM9000被2440映射到BANK4,空间,即0x2000 0000 ~ 0x2FFF FFFF空间,映射的基地址是0x2000 0000,加上DM9000网卡自身的IO基地址,所以TQ2440开发板上的网卡的基地址是0x2000 0300。

因此我们在include/configs/tq2440.h头文件中定义IO基地址如下:

#define NONE_FLAG 0#if NONE_FLAG  
#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 */
#else
#define CONFIG_DRIVER_DM9000
+ #define CONFIG_DM9000_BASE 0x20000300
#endif
很多文档和网上的博客都是0x2000 0000这个基地址,有的网友说0x2000 0300这个基地址是因为CMD引脚被接到了LADDR8的缘故。我认为这种说法是不对的,原因如前面分析。可能我的推测不正确,但是又能怎么样呢?如果错了就当做是移除失败的经历吧!SA9~8接高电平,这样SA9~4用二进制表示就是11 0000 0000,刚好就是0x300。这可能就是300H这个值的原因吧(?)

由于DM9000是地址和数据端口引脚是复用的,通过CMD引脚来决定,我们这里CMD引脚接LADDR2,如果CMD为低电平即为地址端口,如果为高即为数据端口。因此DM9000的地址端口(寄存器地址)是0x2000 0300,而数据端口(寄存器地址)是0x2000 0304。在tq2440.h文件中定义如下:

#else#define CONFIG_DRIVER_DM9000#define CONFIG_DM9000_BASE 0x20000300+ #define DM9000_IO CONFIG_DM9000_BASE+ #define DM9000_DATA (CONFIG_DM9000_BASE + 4)#endif


我们的u-boot移植2440是以2410为模板,因为2410没有做DM9000网卡的移植工作,所以这里要在tq2440.c(board/samsung/tq2440/ 文件中)加上DM9000网卡的初始化工作,如下:

#ifdef CONFIG_CMD_NETint 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_initialize()函数注册了操作DM9000网卡的一些操作函数,即将操作函数的首地址赋值个网络设备的结构体中,这样统一了网络设备的操作。


打开ping网络操作命令宏:

#if NONE_FLAG#define CONFIG_CMD_DHCP#define CONFIG_CMD_ELF#define CONFIG_CMD_PING#define CONFIG_CMD_REGINFO#define CONFIG_CMD_USB+ #else+ #define CONFIG_CMD_PING#endif

为了便于调试,我们还将u-boot烧录到SDRAM中,在tq2440.h头文件中:

#define CONFIG_SYS_TEXT_BASE 0x33F00000 
跳过底层初始化:

#define CONFIG_SKIP_LOWLEVEL_INIT


编译,烧录运行(烧录和时注意起始地址是0x33F00000),打印如下信息:

Net:   dm9000

测试DM9000

请确保你的开发板连接了网线,设置MAC,IP:

[TQ2440 #] set ethaddr 00:12:34:56:78:90[TQ2440 #] set ipaddr 192.168.169.9[TQ2440 #] save

其中save用于保存环境变量到NORflash中去。

我的ubuntu系统服务器的IP地址是192.168.169.8,测试是否能ping通ubuntu服务器:

[TQ2440 #] ping 192.168.169.8
dm9000 i/o: 0x20000300, id: 0x90000a46 
DM9000: running in 16 bit mode
MAC: 00:12:34:56:78:90
could not establish link
Using dm9000 device
host 192.168.169.8 is alive 有效的,说明能ping通。
[TQ2440 #] 

说明DM9000网络功能移植成功。对于u-boot而言tftp是一个重要的功能,对于今后的开发极有帮助,下面演示tftp功能:

首选确保你的ubuntu开启了tftp服务功能,我的ubuntu服务器的tftp目录是/tftpboot,我在其中任意放置一个文件:

u-boot-2014.10]$ vim /tftpboot/test1234567890

在u-boot中设置服务器IP地址:

[TQ2440 #] set serverip 192.168.169.8[TQ2440 #] save

u-boot下载test文件到SDRAM的0x3300 0000地址处:

[TQ2440 #] tftpboot 33000000 test[TQ2440 #] md 33000000

33000000: 34333231 38373635 0a0a3039 4c220889    1234567890...."L

说明tftp功能正常。


修改基地址

奇怪的是我修改了DM9000的基地址,照样能够运行,这是很奇怪的问题:

#define CONFIG_DM9000_BASE 0x20000000

重新编译运行,效果一样。这个问题留在后面深入研究。

后话:

我后来实际运行的经验告诉我

#define CONFIG_DM9000_BASE 0x20000300
这个值不会出现卡顿的现象。