在一个原本无网卡的板子的uboot中添加网卡驱动
①头文件中一定要定义
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_CMD_NET //tftpboot
#define CONFIG_CMD_PING 1 //ping
#define DM9000_16BIT_DATA
#define CONFIG_DM9000_BASE (0x88000300)
#define DM9000_IO (CONFIG_DM9000_BASE)
#define DM9000_DATA (CONFIG_DM9000_BASE+4)
这些话是保证dm9000.c能被编译链接,假如没有这些宏会报错
undefined eth_initialize();
②在eth.c\int eth_initialize(bd_t *bis)中较前的位置一定要调用函数dm9000_initialize(bd_t* bis)
/*
* If board-specific initialization exists, call it.
* If not, call a CPU-specific one
*/
if (board_eth_init != __def_eth_init) {
if (board_eth_init(bis) < 0)
printf("Board Net Initialization Failed\n");
} else if (cpu_eth_init != __def_eth_init) {
if (cpu_eth_init(bis) < 0)
printf("CPU Net Initialization Failed\n");
} else
printf("Net Initialization Skipped\n");
if (!eth_devices) {
puts("No ethernet found.\n");
bootstage_error(BOOTSTAGE_ID_NET_ETH_START);
比如可以
int board_eth_init(bd_t *bis)
{
return dm9000_initialize(bis);
}
当然调用dm9000_initialize(bis);前要先声明
③ping发现错误
rx fifo error
rx length too big
DM9000 error: status check fail: 0x3
上网查,修改
/*
Stop the interface.
The interface is stopped when it is brought.
*/
static void dm9000_halt(struct eth_device *netdev)
{
//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 */
}
就是函数里全部加上注释