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

2019-07-13 02:15发布

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上的移植详解 (五)