您的位置:首页 > 其它

u-boot-2010.03在LT2440上的移植详解 (四)

2010-12-11 13:24 399 查看
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 #

下接:u-boot-2010.03在LT2440上的移植详解 (五)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: