移植U-Boot.1.3.1到S3C24X0(补:DM9000网卡移植)
对于U-Boot1.2.0和U-Boot1.3.1,DM9000的驱动有一点小变化,就是添加了从U-Boot的参数中提取MAC地址的语句(应该是可以避免网卡的MAC地址与设置的不同的情况)。具体修改如下:
在/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地址与你设置的不一样(在U-boot1.3.1中可能不会出现,没有试验过)
(2)会有“could not establish link” 的提示,而且在显示MAC地址后很久后才响应。
追踪源码可以知道:这些都是发生在int eth_init(bd_t * bd)初始化时的问题。
修正BUG(修改/drivers/dm9000.c文件)
(1)网卡MAC地址错误的解决方法:
/* Initilize dm9000 board */ int eth_init(bd_t * bd) { ......
//tekkamanninja
/* Set Node address */ /* for (i = 0; i < 6; i++) ((u16 *) bd->bi_enetaddr)[i] = read_srom_word(i);
if (is_zero_ether_addr(bd->bi_enetaddr) || is_multicast_ether_addr(bd->bi_enetaddr)) { */ /* try reading from environment */ // u8 i;
char *s, *e; s = getenv ("ethaddr"); for (i = 0; i < 6; ++i) { bd->bi_enetaddr[i] = s ? simple_strtoul (s, &e, 16) : 0; if (s) s = (*e) ? e + 1 : e; } // }
//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); } #endif ...... }
|
屏蔽检测和延时的语句。
阅读(11099) | 评论(0) | 转发(10) |