在自己的AT91RM9200板子上使用U-Boot

 

U-Boot 修改和编译

1.获取U-Boot源代码

ftp://ftp.denx.de/pub/u-boot/下获取U-Boot的源代码,另外也可以在http://sourceforge.net/projects/u-boot等多个网络地址上找到,不过ftp://ftp.denx.de/pub/u-boot/U-Boot项目的官方下载点,在上面可以找到所有的版本。

 

如上图所示,目前最新的版本为1.1.6,发布日期是2006112日,其余不是以X.X.X结尾的版本是中间版本。对AT91RM9200而言,从0.3.2之后的版本其实都可以使用,不过有很多公司提供的U-Boot实际上是从ATMEL网站上下到的1.0.0版本,所以我们只关心1.0.0之后的版本。通过对1.0.01.1.6的各个版本的实际测试,发现如下现象:1.0.01.1.2版本的U-Boot,把AT91RM9200作为一个独立的CPU类型,没有归类到920T里,同时基本上只支持DM9161型号的PHY,并且对PHY的操作函数直接在/cpu/at91rm9200/at91rm9200_ether.c里完成;从1.1.3版本开始,把AT91RM9200S3C24X0arm9芯片归类到了920T下面,同时PHY的支持函数也开始独立出来。上面说的是U-Boot结构的变动,在使用过程中还发现:1.0.01.0.2可以不加以修改直接使用,1.1.01.1.2则需要修改链接地址,但是从1.1.3开始,即使修改了链接地址,代码也无法执行,通过对1.1.21.1.3的代码进行比照,除了结构上的改动,并没有发现太大的区别,在无法确定程序问题的情况下,仔细阅读1.1.3版本的readme文件,发现了如下一个说明:

 

原来该版本的U-Boot针对ARM核,开始实现了relocate功能,但由于我们的9200系统是使用loader程序将U-Boot下载到SDRAM的上的0x21f00000地址,所以代码就无法执行,因此必须改动配置,来屏蔽这两个功能。考虑到我们DEMO板上使用的PHY不是DM9161,所以选择1.1.6版本作为我们使用的版本,主要是它支持的PHY比较多,当然原则上来说,新版本的程序也修正了很多已经发现的BUG

2.编译U-Boot

    U-Boot1.1.6的代码在linux下解压,得到u-boot-1.1.6目录,分布如下:

 

首先修改Makefile128行,将“CROSS_COMPILE = arm-linux-”改成“CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux-,其中“/usr/local/arm/2.95.3/”是编译器的安装路径。

然后在终端里执行以下命令:

make distclean     删除原先的配置文件

make clean         删除原来编译生成的目标文件和中间文件

make at91rm9200dk_config   U-Boot设为for 9200

make               编译最终的可执行文件

 

不过遗憾的是,我们的编译并没有通过,所以开始更换编译器,在http://mirror.switch.ch/ftp/mirror/eldk/eldk/上下载得到最新版本的ELDK,从里面提取了其中的arm-linux-gcc4.0.0,修改上面提到的编译器路径为“/usr/local/arm/4.0.0/”,编译可以顺利通过。不过由于U-Boot本身的relocate功能,在我们通过loader下载到DEMO板上时,它无法运行,在loader显示“U-Boot downloaded successfully”之后便没有了下文。

所以我们开始修改有关9200的配置,主要就是在“/u-boot-1.1.6

/include/configs/at91rm9200dk.h”里添加两个宏定义:

 

修改完成后,从新make,得到的u-boot.bin大小为92K,可以在我们的DEMO板上顺利起来。(另外在最初测试1.1.3版本时发现,一旦定义了这两个变量,源码里会缺少一个lowlevel_init的函数,后确认是1.1.21.1.3版本的时候,包含该函数的一个.s文件被删除,如果使用这个版本的话,需要自己添加这个文件,并在makefile里做相应的修改,但是1.1.6版本里,这个文件已经被添加在“/u-boot-1.1.6/cpu

/arm920t/at91rm9200/下”,文件名为“lowlevel_init.S)

 

此时,通过loadb我们已经可以把linux2.4.19的内核跑起来。但是仍然无法使用网络相关的命令。

3.修改网络驱动

l       在“…/u-boot-1.1.6/include/”目录下,找到“lxt971a.h”文件,并在文件的最后,但是是在“#endif /*__LXT971A_H__ */”之前添加如下4个函数的声明:

 

   其中这些函数的实现是在“…/u-boot-1.1.6/cpu/arm920t

/at91rm9200/lxt972.c”文件里,是U-Boot写好的PHY的驱动程序。

l       修改“…/u-boot-1.1.6/board/at91rm9200dk/ at91rm9200dk.c

将原文件中的函数:

void at91rm9200_GetPhyInterface(AT91PS_PhyOps p_phyops)

{

    p_phyops->Init = dm9161_InitPhy;

    p_phyops->IsPhyConnected = dm9161_IsPhyConnected;

    p_phyops->GetLinkSpeed = dm9161_GetLinkSpeed;

    p_phyops->AutoNegotiate = dm9161_AutoNegotiate;

}

修改成:

void at91rm9200_GetPhyInterface(AT91PS_PhyOps p_phyops)

{

    p_phyops->Init = lxt972_InitPhy;

    p_phyops->IsPhyConnected = lxt972_IsPhyConnected;

    p_phyops->GetLinkSpeed = lxt972_GetLinkSpeed;

    p_phyops->AutoNegotiate = lxt972_AutoNegotiate;

}

同时,修改需要包含的头文件,将“#i nclude <dm9161.h>”改成“lxt971a.h

l       在“/u-boot-1.1.6/include/configs/at91rm9200dk.h”里添加如下几个宏定义:

 

其中最后一条不可以缺少。同时必须修改程序中有关PHY接口方式的定义:

#define CONFIG_AT91C_USE_RMII

改成:

#undef CONFIG_AT91C_USE_RMII

4.修改FLASH驱动

由于ATMELDEMO板使用的是ATMEL自己的FLASH,所以U-Boot里基本没有对我们实验板上使用的SST39VF1601的支持,所以必须自己修改“…/u-boot-1.1.6/board/at91rm9200dk/ flash.c”文件的内容,由于改动比较大,这里不再具体说明,参考源代码。实际需要修改的部分主要函数和简要说明如下:

void flash_identification (flash_info_t * info)

用来识别FLASH厂商和型号的函数,最后需要把信息填写到info里,主要是使用CFI接口来实现的,具体参考芯片手册

ulong flash_init (void)

相关的初始化函数,在这里的任务其实也是负责填写info数据结构,完成信息的写入

void flash_print_info (flash_info_t * info)

flinfo命令调用的函数,从info结构中产生输出信息而已

int flash_erase (flash_info_t * info, int s_first, int s_last)

    命令erase的最总执行函数,对函数前面部分的判断需要修改,否则命令执行会不成功

由于SST39VF1601ATMELFLASH擦除和烧写命令是兼容的,所以具体的擦写和烧入过程不需要重写。

至此,U-Boot1.1.6已经可以在我们的系统上跑起来。

http://blog.21ic.com/user1/3774/archives/2007/34537.html

你可能感兴趣的:(在自己的AT91RM9200板子上使用U-Boot)