最近工作有点忙,所以到现在才开始做,今天实现了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 }编译好后,网卡就起来了。