虽然说网上对于uboot移植的DM9000A网卡的移植的资料很多,移植过程也很简单,总的来说主要就是设置一下头文件/include/configs/ok2440v3.h 中宏的定义和drivers/net/dm9000x.c中网卡的函数的修改,和在board/samsung/ok2440v3/ok2440v3.c中增加关于网卡的初始化。
但在此移植中,被一个很小的问题“网络超时重传”卡了很长时间,接下来就是一些更小的问题:比如第一次ping不能通的情况、显示“”的情况。
打开/include/configs/ok2440v3.h:
注释掉下面语句:
#define CONFIG_DRIVER_CS8900 1/* we have a CS8900 on-board */
#define CS8900_BASE 0x19000300
#define CS8900_BUS16 1 /* the Linux driver does accesses as shorts *
增加下面语句:
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_NET_MULTI 1
#define CONFIG_DM9000_NO_SROM 1
#define CONFIG_DM9000_BASE 0x20000000 //网卡片选地址
#define DM9000_IO CONFIG_DM9000_BASE //网卡命令端口
#define DM9000_DATA (CONFIG_DM9000_BASE+4) //网卡数据端口
#define CONFIG_CMD_PING //增加ping命令
然后定义缺省的环境变量,先添加MAC地址,再修改开发板以及宿主机的IP地址:
#define CONFIG_ETHADDR 08:00:3e:26:0a:5b //MAC地址
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.1.15 //开发板IP,自定义,注意要与主机IP在同一网段
#define CONFIG_SERVERIP 192.168.1.99//主机IP
#define CONFIG_GATEWAYIP 192.168.1.255//网关,在虚拟机上我都是静态设置好了的
修改board/samsung/ok2440v3/ok2440v3.c;添加网卡初始化代码:
#include <net.h>
#include <netdev.h>
#ifdef CONFIG_DRIVER_DM9000
int board_eth_init(bd_t *bis)
{
return dm9000_initialize(bis);
}
#endif
在drivers/net/dm9000x.c中修改:
i = 0;
while (!(phy_read(1) & 0x20)) {/* autonegation complete bit */
udelay(1000);
i++;
if (i == 500000) {
//将10000改为500000,这样就能解决第一次ping 不通的情况,网上说是把这段屏蔽掉,会有第一 次ping不通。
printf("could not establish link\n");
return 0;
}
}
接着在dm9000x.c中修改,屏蔽掉dm9000_halt函数中的内容,否则ping不通。
/*
Stop the interface.
The interface is stopped when it is brought.
*/
static void dm9000_halt(struct eth_device *netdev)
{
//DM9000_DBG("%sn", __func__);
///* RESET devie */
//phy_write(0, 0x8000); /* PHY RESET */
//DM9000_iow(DM9000_GPR, 0x01); /* Power-Down PHY */
//DM9000_iow(DM9000_IMR, 0x80); /* Disable all interrupt */
//DM9000_iow(DM9000_RCR, 0x00); /* Disable RX */
}
再修改dm9000x.c中phy_read() 函数,解决传输过程中出现“operating at unknow : 0 mode"字符串,如下:
phy_read(int reg)
{
u16 val;
/* Fill the phyxcer register into REG_0C */
DM9000_iow(DM9000_EPAR, DM9000_PHY | reg);
DM9000_iow(DM9000_EPCR, 0xc);/* Issue phyxcer read command */
udelay(1000); /* Wait read complete */ //原来这里的值好像是100,现在改为1000.
DM9000_iow(DM9000_EPCR, 0x0);/* Clear phyxcer read command */
val = (DM9000_ior(DM9000_EPDRH) << 8) | DM9000_ior(DM9000_EPDRL);
/* The read data keeps on REG_0D & REG_0E */
DM9000_DBG("phy_read(0x%x): 0x%x\n", reg, val);
return val;
}
接下来打开net/tftp.c (注意net是在顶层目录下),修改TIMEOUT的值,原来是5000UL,否则会出现在超时重传的情况。
#define TIMEOUT 140000UL /* Millisecs to timeout for lost pkt */
(注意这里的值的是不固定的,70000UL就可以正常传输,这个值也不是越大越好,为了传输大点的文件,在这里设置140000UL,但是60M以上的还是传不了,很郁闷,若有大牛知道,望不怜赐教)
到这里,DM9000A的网卡驱动就移值完成了。(注意用tftp传输时要把无线网络先断开后再进行传输!!!)
感谢网上的各位大牛,本博文主要参考: