u-boot-2009.08在飞凌OK2440/FL2440上的移植(三)——让u-boot支持DM9000A

虽然说网上对于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
#define CONFIG_DM9000_NO_SROM
#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传输时要把无线网络先断开后再进行传输!!!

 感谢网上的各位大牛,本博文主要参考:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值