转载:http://blog.chinaunix.net/uid-26725382-id-3414832.html
TQ2440自带的uboot-1.1.6中并没有支持uboot命令行模式和网卡驱动。所以要修改和重新编译uboot和添加DM9000支持。uboot定制与移植可以参考网上很多的资料。这里主要是说明在DM9000网卡移植过程中我遇到的一些问题和解决方法,希望对其他人有帮助。
这里借鉴 http://doc.baidu.com/view/723e304be45c3b3567ec8b56.html?from=related中的一些实现。
uboot执行lib_arm/board.c中的start_armboot函数会调用eth_initialize(gd->bd)函数,这个函数在include/
net.h声明,实现在net/eth.c。需要注意的是这个文件中有针对CONFIG_COMMANDS, CFG_CMD_NET和CONFIG_NET_MULTI的条件编译,eth_initialize有两个实现。具体步骤如下:
1、
#if 0
#define CONFIG_DRIVER_CS8900 1
#define CS8900_BASE 0x19000300
#define CS8900_BUS16 1
#endif
添加DM9000的宏, DM9000在BANK4上
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_DM9000_BASE 0x20000300
#define DM9000_IO CONFIG_DM9000_BASE
#define CONFIG_DM9000_USE_16BIT 1
#define CONFIG_NET_MULTI 1
如果需要添加PING命令,可以在#define CONFIG_COMMANDS中增加CFG_CMD_NET和CFG_CMD_PING项。如引用文档中的第六,七步。 CONFIG_ETHADDR, CONFIG_NETMASK, CONFIG_IPADDR, CONFIG_SERVERIP可以根据自己的需要进行配置。
2、 第二步如引用文档中的第一步一样修改net/eth.c中的eth_initialize实现,可以加入条件编译:
#ifdef CONFIG_DRIVER_DM9000
if(board_eth_init(bis) < 0)
cpu_eth_init(bis)
#endif
3、drivers/dm9000x.c的修改:
如引用文档的第四,五步所述进行修改,eth_*系列回调函数修改成如结构体声明处的格式。
4、一般进行uboot移植都会进行include/configs/selfconfig, board/selfdir/*之类的复制操作,进行相关的适配。这里需要在self2440.c实现加入网卡的初始化函数。如:
#ifdef CONFIG_DRIVER_DM9000
extern int dm9000_init(struct eth_device *dev, bd_t *bd);
extern void dm9000_halt(struct eth_device *dev);
extern int dm9000_send(struct eth_device *dev, volatile void *pachet, int length);
extern int dm9000_rx(struct eth_device *dev);
void board_eth_init(bd_t *bis)
{
struct eth_device *dev;
dev = calloc(sizeof(*dev), 1);
if(!dev) {
printf("%s: dm9000_enet allocation failure, %s\n", __FUNCTION__, "eth_device structure");
return;
}
dev->init = (void *)dm9000_init;
dev->halt = (void *)dm9000_halt;
dev->send = (void *)dm9000_send;
dev->recv = (void *)dm9000_rx;
eth_register(dev);
}
#endif
烧入u-boot.bin就可以看到开发板的网卡端口提示灯就亮了,ping一下主机也会提示alive了。如果编译中有什么小错误的话修改添加一下相关函数的声明就好了。
引用: 1. http://doc.baidu.com/view/723e304be45c3b3567ec8b56.html?from=related
2. TQ2440相关源代码