最近工作有点忙,所以到现在才开始做,今天实现了UBOOT中关于DM9000的部分,当然都是拿来主意,对于网卡我是相当陌生的。
首先,在include/configs/fl2440.h中去掉原先CS8900网卡的定义,再定义各种关于DM9000网卡的宏:
/*#define CONFIG_CS8900*/ /* we have a CS8900 on-board */
/*#define CONFIG_CS8900_BASE 0x19000300 */
/*#define CONFIG_CS8900_BUS16*/ /* 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) /* the cmd pin is addr2*/
#define CONFIG_ETHADDR a8:00:3E:26:0A:5B
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.1.11
#define CONFIG_SERVERIP 192.168.1.234
#define CONFIG_NET_MULTI
/*
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 10.0.0.110
#define CONFIG_SERVERIP 10.0.0.1
*/
DM9000在FL2440的硬件连接原理图:
图中可以看出DM9000连接到NGCS4,看下地址空间可以知道NGCS4的基址是0x20000000,所以网卡基址是0x20000300,后面这个300据他们说是DM9000内部寄存器是这样定义的,就现实来说我的网卡在这个基址上工作良好,所以应该是对的。
CMD连接的是ADDR2,查DM9000手册上CMD为1时发送的是数据信息,所以,DM9000的数据地址是0x20000304,这个很容易理解。
修改fl2440.c中的board_eth_init函数:
#ifdef CONFIG_CMD_NET
int board_eth_init(bd_t *bis)
{
return dm9000_initialize(bis);
}
#endif
修改drivers/net/dm9000x.c,将下面这段注释掉,至于原因,我也不清楚,不管。
i = 0;
while (!(dm9000_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 = dm9000_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");
注释这个函数中的内容,不然网卡会自动断开:
static void dm9000_halt(struct eth_device *netdev)
{
#if 0
DM9000_DBG("%s\n", __func__);
/* RESET devie */
dm9000_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 */
#endif
}
编译好后,网卡就起来了。