因为板子上没有cs8900,只有dm9000ae,所以开始移植dm9000ae
1、修改include/configs/utu2440.h
/* Hardware drivers
*/
//#define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */ //editedby yaoyi 20090314
//#define CS8900_BASE 0x19000300
//#define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_DM9000_BASE 0x18000300
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE+4)
#define CONFIG_DM9000_USE_16BIT
2、修改lib_arm/board.c
#ifdef CONFIG_DRIVER_DM9000
extern int eth_init(bd_t * bd);
#endif
#ifdef CONFIG_DRIVER_DM9000
eth_init(gd->bd);
#endif
3、修改utu2440.h,使读出的MAC不出现00:00:00:00:00:00
....
/*#define CONFIG_BOOTARGS "root=ramfs devfs=mount console=ttySA0,9600" */
#define CONFIG_ETHADDR 08:00:3e:26:0a:5b
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.1.110
#define CONFIG_SERVERIP 192.168.1.1
.......
4、修改drivers/net/dm9000x.c,已读取内存区上的MAC,以及不出现cannot establish the link
添加一个函数声明
/* function declaration ------------------------------------- */
int eth_initfirst(bd_t * bd);
int eth_init(bd_t * bd);
int eth_send(volatile void *, int);
int eth_rx(void);
.......
int
eth_init(bd_t* bd)
{
.....
/* RESET device */
// dm9000_reset();
dm9000_probe();
.....
/* Set Node address */
/*#ifndef CONFIG_AT91SAM9261EK
for (i = 0; i < 6; i++)
((u16 *) bd->bi_enetaddr)[i] = read_srom_word(i);
#endif*/
//edited by yaoyi 20090317
if (is_zero_ether_addr(bd->bi_enetaddr) ||
is_multicast_ether_addr(bd->bi_enetaddr)) {
/* try reading from environment */
u8 i;
puts("ready to read MAC/n");
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;
}
}
.......
#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;
}
}
/* 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;
}
在函数int eth_init()后添加eth_initfirst的定义
int eth_initfirst(bd_t * bd)
{
dm9000_reset();
eth_init(bd);
}
最后修改下dm9000_reset如下:
/* Reset DM9000,
see DM9000 Application Notes V1.22 Jun 11, 2004 page 29 */
/* DEBUG: Make all GPIO pins outputs */
// DM9000_iow(DM9000_GPCR, 0x0F);
/* Step 1: Power internal PHY by writing 0 to GPIO0 pin */
DM9000_iow(DM9000_GPR, 0);
/* Step 2: Software reset */
DM9000_iow(DM9000_NCR, 3);
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/linyaoyi/archive/2009/03/19/4004052.aspx