嵌入式学习入门 http://blog.chinaunix.net/u3/117680/showart.php?id=2300212
在这一篇中,我们首先让开发板对CS8900或者DM9000X网卡的支持,然后再分析实现u-boot怎样来引导Linux内核启动。因为测试u-boot引导内核我们要用到网络下载功能。
7)u-boot对CS8900或者DM9000X网卡的支持。
u-boot-2009.08版本已经对CS8900和DM9000X网卡有比较完善的代码支持(代码在drivers/net/目录下),而且在S3C24XX系列中默认对CS8900网卡进行配置使用。只是在个别地方要根据开发板的具体网卡片选进行设置,就可以对S3C24XX系列中CS8900网卡的支持使用。代码如下:
#gedit include/configs/my2440.h
|
/* * Hardware drivers */ #define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */ #define CS8900_BASE 0x19000300 //注意:对不同的开发板就是要修改这个片选地址参数,这个参数值就看开发板上网卡的片选引脚是接到ARM芯片存储控制器的哪个Bank上 #define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */
|
现在修改对我们开发板上DM9000X网卡的支持。
首先,我们看看drivers/net/目录下有关DM9000的代码,发现dm9000x.h中对CONFIG_DRIVER_DM9000宏的依赖,dm9000x.c中对CONFIG_DM9000_BASE宏、DM9000_IO宏、DM9000_DATA等宏的依赖,所以我们修改代码如下:
#gedit include/configs/my2440.h
|
/* * Hardware drivers */ 屏蔽掉u-boot默认对CS8900网卡的支持 //#define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */ //#define CS8900_BASE 0x19000300 //#define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */
//添加u-boot对DM9000X网卡的支持
#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) //网卡数据地址
//#define CONFIG_DM9000_USE_16BIT 1
注意: u-boot-2009.08 可以自动检测DM9000网卡的位数,根据开发板原理图可知网卡的数据位为16位,并且网卡位于CPU的BANK4上,所以只需在 board/samsung/my2440/lowlevel_init.S中设置 #define B4_BWSCON (DW16) 即可,不需要此处的 #define CONFIG_DM9000_USE_16BIT 1
//给u-boot加上ping命令,用来测试网络通不通
#define CONFIG_CMD_PING
//恢复被注释掉的网卡MAC地址和修改你合适的开发板IP地址
#define CONFIG_ETHADDR 08:00:3e:26:0a:5b //开发板MAC地址 #define CONFIG_NETMASK 255.255.255.0 #define CONFIG_IPADDR 192.168.1.105 //开发板IP地址
#define CONFIG_SERVERIP 192.168.1.103 //Linux主机IP地址 |
添加板载DM9000网卡初始化代码,如下:
#gedit board/samsung/my2440/my2440.c
|
#include #include
#ifdef CONFIG_DRIVER_DM9000 int board_eth_init(bd_t *bis) { return dm9000_initialize(bis); } #endif |
修改MD9000网卡驱动代码,如下:
#gedit drivers/net/dm9000x.c
|
#if 0 //屏蔽掉dm9000_init函数中的这一部分,不然使用网卡的时候会报“could not establish link”的错误 i = 0; while (!(phy_read(1) & 0x20)) { /* autonegation complete bit */ udelay(1000); i++; if (i == 10000) { printf("could not establish link "); return 0; } } #endif
|
然后重新编译u-boot,下载到Nand中从Nand启动,查看启动信息和环境变量并使用ping命令测试网卡,操作如下:
可以看到,启动信息里面显示了Net:dm9000,printenv查看的环境变量也和include/configs/my2440.h中设置的一致。但是现在有个问题就是ping不能通过。
经过一段时间在网上搜索,原来有很多人都碰到了这种情况。出现问题的地方可能是DM9000网卡驱动中关闭网卡的地方,如是就试着修改代码如下:
#gedit drivers/net/dm9000x.c //屏蔽掉dm9000_halt函数中的内容
|
/* Stop the interface. The interface is stopped when it is brought. */ static void dm9000_halt(struct eth_device *netdev) { //DM9000_DBG("%sn", __func__);
///* RESET devie */ //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 */ }
|
结果,只是第一次ping不通,以后都是可以ping通的(据网友们说这是正常的),如下图:
阅读(2681) | 评论(0) | 转发(2) |