移植U-Boot.1.2.0到友善之臂SBC2440V4
(补:DM9000网卡移植)
昨天《移植U-Boot.1.2.0到友善之臂SBC2440V4(s3c2440AL)》已经上传。里面介绍的移植是用SC8900网卡,而SBC2440V4是双网卡设计,除了SC8900(10M)外,还有DM9000(10/100M).其实要在U-Boot下使用DM9000也是很容易的事,因为U-Boot的DM9000驱动是可用的(虽然有BUG,但功能可以实现)。
移植参考的资料:
(1)WeiBing的博客文章: u-boot 1.1.5 移植成功
在这里感谢 WeiBing的分享。
(2)DM9000的英文数据手册。
在《移植U-Boot.1.2.0到友善之臂SBC2440V4(s3c2440AL)》的基础上,在/include/configs/tekkaman2440.h文件中修改添加对DM9000的支持,屏蔽CS8900:
/*
* Hardware drivers
*/
//#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_DM9000_BASE 0x20000300
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE+4)
#define CONFIG_DM9000_USE_16BIT
在这里#define CONFIG_DM9000_BASE 的定义最为重要。不同的板子只要修改这个参数即可。友善之臂的SBC2440V4上的DM9000在BANK4上所以定义为“0x20000300”。有的板子是在BANK1上,就为“0x08000300”。
这样定义完之后,就可以“make”,然后下载到板上运行。ping和tftp都可以实现。但是有些问题:
(1)网卡的MAC地址与你设置的不一样
(2)会有“could not establish link” 的提示,而且在显示MAC地址后很久后才响应。
这两个问题我认为是U-Boot的DM9000源码的BUG。追踪源码可以知道:这些都是发生在int eth_init(bd_t * bd)初始化时的错误。
修正BUG(修改/drivers/dm9000.c文件)
(1)网卡MAC地址错误的解决方法:
/* Initilize dm9000 board
*/
int
eth_init(bd_t * bd)
{
......
/* Set Node address */
/* for (i = 0; i < 6; i++)
((u16 *) bd->bi_enetaddr)[i] = read_srom_word(i);
*/
//tekkamanninja
char *tmp = getenv ("ethaddr");
char *end;
for (i=0; i<6; i++) {
bd->bi_enetaddr[i] = tmp ? simple_strtoul(tmp, &end, 16) : 0;
if (tmp)
tmp = (*end) ? end+1 : end;
}
//tekkamanninja
printf("MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", bd->bi_enetaddr[0],
bd->bi_enetaddr[1], bd->bi_enetaddr[2], bd->bi_enetaddr[3],
bd->bi_enetaddr[4], bd->bi_enetaddr[5]);
......
红色的字符是要做的修改:功能是屏蔽原有获取MAC地址的语句,替换成从U-Boot的参数区读取数据并存到bd->bi_enetaddr[i]中。
(2)“could not establish link” 提示和慢响应的解决方法:
/* Initilize dm9000 board
*/
int
eth_init(bd_t * bd)
{
......
DM9000_iow(DM9000_RCR, RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN); /* RX enable */
DM9000_iow(DM9000_IMR, IMR_PAR); /* Enable TX/RX interrupt mask */
#if 0
i = 0;
while (!(phy_read(1) & 0x20)) { /* autonegation complete bit */
udelay(1000);
i++;
if (i == 10000) {
printf("could not establish link\n");
return 0;
}
printf(" link=%d\n",i);
}
/* see what we've got */
lnk = phy_read(17) >> 12;
printf("operating at ");
switch (lnk) {
case 1:
printf("10M half duplex ");
break;
case 2:
printf("10M full duplex ");
break;
case 4:
printf("100M half duplex ");
break;
case 8:
printf("100M full duplex ");
break;
default:
printf("unknown: %d ", lnk);
break;
}
printf("mode\n");
#endif
return 0;
}
红色的字符是要做的修改:功能是屏蔽无用的语句。其实被屏蔽的语句是MII接口用的,放在这显然是错误的,无端的浪费了10秒钟。
至此,U-Boot的2440移植结束了,两张网卡要用哪张随你便。只要重新编译一下就好了。GOOD LUCK!
阅读(1159) | 评论(0) | 转发(0) |