微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(四)

嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(四)

时间:11-20 来源:互联网 点击:
一、移植环境

  • 机:VMWare--Fedora 9
  • 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4
  • 编译器:arm123.com.cn/linux/arm-linux-gcc-4.3.2.tgz" target="_blank">arm-linux-gcc-4.3.2.tgz
  • u-boot:u-boot-2009.08.tar.bz2

二、移植步骤

上接:u-boot-2009.08在2440上的移植详解(三)

在这一篇中,我们首先让开发板对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

#defineCONFIG_DRIVER_CS89001
#defineCS8900_BASE0x19000300//注意:对不同的开发板就是要修改这个片选地址参数,这个参数值就看开发板上网卡的片选引脚是接到ARM芯片存储控制器的哪个Bank上
#defineCS8900_BUS161

现在修改对我们开发板上DM9000X网卡的支持。
首先,我们看看drivers/net/目录下有关DM9000的代码,发现dm9000x.h中对CONFIG_DRIVER_DM9000宏的依赖,dm9000x.c中对CONFIG_DM9000_BASE宏、DM9000_IO宏、DM9000_DATA等宏的依赖,所以我们修改代码如下:

#gedit include/configs/my2440.h

屏蔽掉u-boot默认对CS8900网卡的支持
//#define CONFIG_DRIVER_CS8900 1
//#define CS8900_BASE 0x19000300
//#define CS8900_BUS16 1

//添加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_ETHADDR08:00:3e:26:0a:5b//开发板MAC地址
#define CONFIG_NETMASK255.255.255.0
#define CONFIG_IPADDR 192.168.1.105//开发板IP地址

#define CONFIG_SERVERIP192.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

#if0//屏蔽掉dm9000_init函数中的这一部分,不然使用网卡的时候会报“could not establish link”的错误
i=0;
while(!(phy_read(1)&0x20)){
udelay(1000);
i++;
if(i==10000){
printf("could not establish link ");
return0;
}
}
#endif


然后重新编译u-boot,下载到Nand中从Nand启动,查看启动信息和环境变量并使用ping命令测试网卡,操作如下:

可以看到,启动信息里面显示了Net:dm9000,printenv查看的环境变量也和include/configs/my2440.h中设置的一致。但是现在有个问题就是ping不能通过。

经过一段时间在网上搜索,原来有很多人都碰到了这种情况。出现问题的地方可能是DM9000网卡驱动中关闭网卡的地方,如是就试着修改代码如下:

#gedit drivers/net/dm9000x.c//屏蔽掉dm9000_halt函数中的内容

staticvoiddm9000_halt(structeth_device*netdev)
{
//DM9000_DBG("%sn", __func__);

//
//phy_write(0, 0x8000);
//DM9000_iow(DM9000_GPR, 0x01);
//DM9000_iow(DM9000_IMR, 0x80);
//DM9000_iow(DM9000_RCR, 0x00);
}

结果,只是第一次ping不通,以后都是可以ping通的(据网友们说这是正常的),如下图:

好了,现在只剩下一个问题了,就是使用tftp进行下载。关于tftp服务器在Linux中的安装和配置,这里我就不讲了,在网上搜一下很多的。然而,在tftp下载时又遇到了问题,总是出现传送不完整又重新传送的现象,不断的循环,如下图:

困惑好久的tftp问题现在终于搞定啦,心情真是爽啊!!首先分析上面

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top