开发板的原理图中得知:
第二阶段从在lib_arm的board.c的start_armboot函数开始,其中有一个是跳到网卡初始化的eth_initialize函数(在net/eth.c中)(上面的宏CONFIG_NET_MULTI,等会要实现)。
1、在eth_initialize(文件中有两个,代码较长的那个)的
#if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)
miiphy_init();
#endif后面添加上下面的代码
if (board_eth_init(bis) < 0)
cpu_eth_init(bis);
并在本文件前面增加如下代码:
static int __def_eth_init(bd_t *bis)
{
return -1;
}
int cpu_eth_init(bd_t *bis) __attribute__((weak, alias("__def_eth_init")));
2、在mao2440.c中添加上面函数的实现
#include extern int dm9000_initialize(bd_t * bd); #ifdef CONFIG_DRIVER_DM9000 int board_eth_init(bd_t *bis) { return dm9000_initialize(bis); } #endif 3、在include/configs/mao2440.h中注释CS00的代码,如下:(62行) #if 0 #define CONFIG_DRIVER_CS00 1 /* we have a CS00 on-board */ #define CS00_BASE 0x19000300 #define CS00_BUS16 1 /* the Linux driver does accesses as shorts */ #end if 并添加DM9000的宏, 由上图知DM9000在BANK4上,所以定义为0x20000300如下: #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 1 #define CONFIG_NET_MULTI 1 4、网上说要修改dm9000x.c的eth_init(bd_t * bd)的内容,此步我的板不用 eth_init(bd_t * bd) { ............... /* Set Node address */ /*for (i = 0; i < 6; i++) ((u16 *) bd->bi_enetaddr)[i] = read_srom_word(i); */ char *tmp = getenv ("ethaddr"); char *end; for (i=0; i<6; i++) { bd->bi_enetaddr[i] = tmp ? simple_strtoul(tmp, &end, 16) : 0; if (tmp) tmp = (*end) ? end+1 : end; } ………………. #if 0 i = 0; ………… #endif return 0; } 红色的字符是要做的修改:功能是屏蔽原有获取MAC地址的语句,替换成从U-Boot的参数区读取数据并存到bd->bi_enetaddr[i]中 功能是屏蔽无用的语句。其实被屏蔽的语句是MII接口用的,放在这显然是错误的,无端的浪费了10秒钟 5、再修改dm9000x.c里的函数: 因为里面的四个函数跟include.h/net.h中的定义的结构eth_device参数不同,所以eth_init,eth_halt,eth_send,eth_rx每个函数增加一个参数struct eth_device *dev,且作为第一个参数;并把函数名改为:dm9000_init,dm9000,dm9000_send,dm9000_rx。因为include/net.h中已经声明了net/eth.c中的这些函数。 接着删掉dm9000x.c的函数eth_initfirst()。 6、接着添加默认地址如下: #define CONFIG_ETHADDR 08:00:3e:26:0a:5b #define CONFIG_NETMASK 255.255.255.0 #define CONFIG_IPADDR 192.168.1.230 #define CONFIG_SERVERIP 192.168.1.2 7、添加ping命令 在宏CONFIG_COMMANDS中增加CFG_CMD_PING如下: #define CONFIG_COMMANDS \ (CONFIG_CMD_DFL | \ CFG_CMD_CACHE | \ CFG_CMD_PING | \ CFG_CMD_NAND | \ 结果 Uboot-2009.08中:第二阶段从在lib_arm的board.c的start_armboot函数开始,其中有一个是跳到网卡初始化的eth_initialize函数(在net/eth.c中),此函数又调用bord_eth_init函数,此函数需自己实现并调用相应的网卡驱动函数。DM9000的驱动在drivers/net/dm9000x.c,入口函数是dm9000_initialize。故mao2440.c中添加bord_eth_init的实现函数如下: #include #include extern int dm9000_initialize(bd_t *bis); #ifdef CONFIG_DRIVER_DM9000 int board_eth_init(bd_t *bis) { return dm9000_initialize(bis); } #endif 在mao2440.h中添加相应的宏 #define CONFIG_DRIVER_DM9000 1 #define CONFIG_NET_MULTI 1 #define CONFIG_DM9000_NO_SROM 1 #define CONFIG_DM9000_BASE 0x20000300 #define DM9000_IO CONFIG_DM9000_BASE #define DM9000_DATA (CONFIG_DM9000_BASE + 4) 并注释掉cs00的代码 还有: #define CONFIG_CMD_PING 1 #define CONFIG_CMD_NET 1 设置IP等,如上 结果: