u-boot-2010.03在LT2440上的移植详解 (四)
郑重声明,这系列文章改写自博客园 黄刚先生的《嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解》
转载时请注明出处
文章出处:http://www.lt-net.cn
编译系统 | Ubuntu10.04 |
交叉编译器 | arm-linux-gcc 4.3.3 |
硬件设备 | LT2440开发板 |
测试软件 | u-boot-2010.03 |
依赖库 | 无 |
uboot下载地址:http://ftp.denx.de/pub/u-boot/u-boot-2010.03.tar.bz2
本次移植在u-boot-2010.03原有功能的基础上增加如下特性:
1.支持2KB page Nand Flash读写
2.支持Nand/Nor Flash启动自动识别
3.支持DM9000AEP 10M/100M自适应网卡
4.支持yaffs文件系统烧写
5.支持USB下载功能
6.支持一键式菜单
7.支持启动Logo
8.支持ubifs(待续)
上接:u-boot-2010.03在LT2440上的移植详解 (三)
u-boot 对DM9000AEP网卡的支持。
LT2440的开发板使用的是DM9000AEP网卡,u-boot有比较完善的代码支持(代码在drivers/net/目录下)。而首先,我们看看drivers/net/目录下有关DM9000的代码,发现dm9000x.h中对CONFIG_DRIVER_DM9000宏的依赖,dm9000x.c中对CONFIG_DM9000_BASE宏、DM9000_IO宏、DM9000_DATA等宏的依赖,所以我们修改代码如下:
#gedit include/configs/lt2440.h |
/* * Hardware drivers */#if 0 #define CONFIG_NET_MULTI #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 */ #endif #define CONFIG_DRIVER_DM9000 1 #define CONFIG_DM9000_BASE 0x18000300 #define DM9000_IO CONFIG_DM9000_BASE #define DM9000_DATA (CONFIG_DM9000_BASE+4) #define CONFIG_NET_MULTI 1 #define CONFIG_DM9000_NO_SROM 1 #define CONFIG_NET_RETRY_COUNT 20 #define CONFIG_DM9000_USE_16BIT 1 #define CONFIG_RESET_PHY_R 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.66 //开发板IP地址 #define CONFIG_SERVERIP 192.168.1.100 //主机IP地址 |
添加板载DM9000网卡复位代码,如下:
#gedit board/samsung/lt2440/lt2440.c |
#ifdef CONFIG_RESET_PHY_R void reset_phy(void) { #ifdef CONFIG_DRIVER_DM9000 /* * Initialize ethernet HW addr prior to starting Linux, * needed for nfsroot */ eth_init(gd->bd); #endif } #endif |
修改DM9000网卡驱动代码中的BUG,如下:
#gedit drivers/net/dm9000x.c |
修改static int dm9000_init(struct eth_device *dev, bd_t *bd) 函数 DM9000_iow(DM9000_ISR, ISR_ROOS | ISR_ROS | ISR_PTS | ISR_PRS); /* Set Node address */ if (!eth_getenv_enetaddr("ethaddr", enetaddr)) { #if !defined(CONFIG_DM9000_NO_SROM) for (i = 0; i < 3; i++) dm9000_read_srom_word(i, enetaddr + 2 * i); eth_setenv_enetaddr("ethaddr", enetaddr); #endif } printf("MAC: %pM/n", dev->enetaddr); 注释掉如下代码 /* Enable TX/RX interrupt mask */ DM9000_iow(DM9000_IMR, IMR_PAR); #if 0 i = 0; while (!(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 = 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"); #endif return 0; 注释掉int dm9000_initialize(bd_t *bis) 函数的如下行: // dm9000_get_enetaddr(dev); |
重新编译即可 使用ping命令ping通主机
U-Boot 2010.03 (12鏈?08 2010 - 18:56:25)
DRAM: 64 MB
## Unknown FLASH on Bank 1 - Size = 0x00000000 = 0 MB
Flash: 0 kB
NAND: 256 MiB
In: serial
Out: serial
Err: serial
Net: dm9000
dm9000 i/o: 0x18000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
LT2440 # ping 192.168.1.1
dm9000 i/o: 0x18000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
Using dm9000 device
host 192.168.1.1 is alive
LT2440 #