1. 其实DM9000网卡驱动的移植已经有很多前辈做过了,网络上有很多可以参考的资料。通过两天的努力,终于把在移植上遇到的问题给解决了,顺利的给uboot添加了网络功能,在这里顺便做个记录。
2. 我的开发板是OK6410,发现飞凌官网上提供的uboot源代码针对的是CS8900不是DM9000,我在他移植的uboot源代码的基础上加入了dm9000网卡驱动。
1) 首先熟悉uboot结构,通过参看顶层的Makefile,以及config.mk等等相关文件弄清楚。
2) 查看Makefile,看Makefile里面的交叉工具链的路径CROSS_COMPIKE=是否是的你的交叉工具链的路径
3) 修改include/configs/smdk6410.h.如图
4)
5) 这个版本的dm9000网卡驱动代码dm9000x.c和dm9000x.h不稳定,我移植好后,发现有时候ping的通,有时候ping不通,最好重新从其他地方获取这个两个文件,在这里非常感谢吴老师给我提供这两个文件,将dm9000x.c中的
i= 0;
while(!(phy_read(1) & 0x20)) { /*autonegation complete bit */
udelay(1000);
i++;
if(i == 10000) {
printf("couldnot establish link\n");
return0;
}
}
/*see what we've got */
lnk= phy_read(17) >> 12;
printf("operatingat ");
switch(lnk) {
case1:
printf("10Mhalf duplex ");
break;
case2:
printf("10Mfull duplex ");
break;
case4:
printf("100Mhalf duplex ");
break;
case8:
printf("100Mfull duplex ");
break;
default:
printf("unknown:%d ", lnk);
break;
}
printf("mode\n");
注释掉,不然会让你抓狂。如果出现ping不通,把
DM9000_DBG("eth_halt\n");
/*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 */也注释掉。
6) 其他的就OK了,只要把Uboot的结构弄明白,其实还是很简单的。另外我还修改了lib_arm/board.c的代码,将eth_init函数加入到了start_armboot里面去了,这样在启动的时候会打印出网卡信息。Ping命令实现函数do_ping里面调用了Netloop函数,这个函数调用了eth_init函数,所以每次ping的时候也会打印网卡信息。
7) 最后总结,能看懂Makefile才是王道,只要能看懂Makefile,就能理解一个软件的架构,就能够解决一切。