U-BOOT的移植-Linux

U-BOOT移植

【我所理解的u-boot移植】

其实u-boot类似于windows最底层的BIOS,为上层的一些指令、文件提供一个平台;由于在实际的嵌入式开发中,出于对硬件设备要求、存储空间大小、成本等的考虑就要在u-boot移植过程中进行适当的修改,以满足客服要求、达到较高的性能。

  我所采用的LINUX操作系统是Ubuntu-10.04;u-boot的版本是1.1.6;编译器为:arm-linux-gcc-3.4.5;

【如何进行u-boot的移植】

step 1:下载gcc交叉编译器及u-boot

gcc下载地址:ftp://ftp.gnu.org/pub/gnu/gcc

u-boot下载地址:http://sourceforge.net/projects/u-boot/

step 2:配置编译环境

下面的操作基本就是结合“终端”来操作了;在“终端”(下简称ZD)中输入:

arm-linux-gcc -v  回车;

此时一般都会显示:.....(内容已省略)找不到命令;

这说明了linux中缺少gcc交叉编译器开发环境的路径;这样应该手动添加路径。方法如下:

首先,在文件系统中新建一个文件夹,在ZD中输入:sudo mkdir /usr/local/arm  创建一个属于 arm 开发板的文件夹,存放gcc交叉编译器。

然后,在ZD中输入:sudo gedit /etc/bash.bashrc

进入bash.bashrc文件添加一个编译环境的入口路径:

PATH=/usr/local/arm/3.4.5/bin:$PATH (这里提醒下,不要凭个人习惯随意的添加空

格,不然运行会通不过。)

其实这里就是gcc安装到/usr/local/arm路径下,保存;接着在ZD中:

.(空格)/etc/bash.bashrc  重新运行该bash.bashrc文件。

再在ZD中:arm-linux-gcc -v  这样子不会再显示“找不到命令”了,而是会显示gcc版本号等相关信息。

小结:通过以上的几个步骤,就完成了编译环境的设定,即以后gcc交叉编译器就作为编译的环境(我是这样子理解的)。

step 3:修改u-boot的相关信息,生成标准的u-boot.bin文件

(1)修改u-boot-1.1.6文件夹下面的makefile文件

为了更加快捷的找到要修改的内容,可以在打开makefile文件之后,搜索"cross"找到 ifeq ($(ARCH),arm)

CROSS COMPILE = arm-linux-

endif

然后把第二行改成你gcc存放在"文件系统"中的位置(就是我们之前建立的那个arm文件夹),修改成:

CROSS COMPILE = /usr/local/arm/gcc-3.4.5/bin/arm-linux-

这样就设置好了arm编译的环境入口。

接着,在ZD中:cd u-boot-1.1.6  进入到u-boot的文件夹中;

在ZD中:make clean  主要是将上次编译产生的临时文件清除掉;

        make at91rm9200dk_config   (我所用的开发板是arm920t为内核的)

        make   编译;

小结:这样就实现了一个正规的arm920t内核开发板的 *.bin就形成了。

(但是由于我所使用的dk板是由导师自己设计制作的,相关的flash、sdram等信息还需要修改。这样子的话我还需要继续往下走,而且一般的dk板基本都是参照Atmel公司衍生出来的,所以一般都需要针对标准的dk板修改相关信息)。

接下来,就要根据自身的DK板来修改相关信息,生成相配套的u-boot.bin

step 4:修改dk板flash、sdram的相关信息 (修改u-boot-1.1.6/include/configs下的at91rm9200dk.h)

根据自身的DK板,将相关的自定义语句改成如下所示:

#define CONFIG_HAS_DATAFLASH 0 /*noneed dataflash,我们根本没有用到dataflash,所以此处为0*/

#define SDRC_CR_VAL 0x2188c154  // set up the SDRAM

#define PHYS_SDRAM_SIZE 0x1000000  /* 用到的是两片 HY57V641620HGLT-H 的芯片,总共 16M */

#define CFG_MAX_FLASH_SECT 2048 //max_section 一共有2048个块

#define PHYS_FLASH_SIZE  0x800000  // ??这里还不是很清楚...

193:   #define CFG_BOOT_SIZE  0x6000 /* 配置boot的大小为 24 K */
 改成:
       #define CFG_BOOT_SIZE  0x0 /* ??还未验证,是老师叫我们这样改的 */

177:  #define CFG_ENV_ADDR  (PHYS_FLASH_1 + 0x60000) /* 配置编译环境的入口地址,after u-boot.bin */
改成:
       #define CFG_ENV_ADDR   (PHYS_FLASH_1 + 0x20000)

180:  #define CFG_ENV_ADDR  (PHYS_FLASH_1 + 0xe000)  /* between boot.bin and u-boot.bin.gz
 改成
       #define CFG_ENV_ADDR   (PHYS_FLASH_1 + 0x20000)  /* between boot.bin and u-boot.bin.gz

194:   #define CFG_U_BOOT_BASE (PHYS_FLASH_1 + 0x10000)
改成:
       #define CFG_U_BOOT_BASE (PHYS_FLASH_1)

195:  #define CFG_U_BOOT_SIZE  0x10000 /* 64 KBytes */
改成:
       #define CFG_U_BOOT_SIZE  0x20000 /* 64 KBytes */

step 5:修改u-boot-1.1.6/board/at91rm9200dk下的config.mk

里面就一条语句,修改成:TEXT_BASE = 0x20f00000

step 6:u-boot-1.1.6/board/at91rm9200dk下的at91rm9200dk.c

50    gd->bd->bi_arch_number = MACH_TYPE_AT91RM9200;

改成:gd->bd->bi_arch_number = MACH_TYPE_AT91RM9200DK;

这里主要是要考虑到u-boot配置的板子信息要与“内核”配置的板子信息(在linux-2.6.30/arch/arm/at91下的board-dk.c文件

409    MACHINE_START (AT91RM9200DK,"SST AT91RM9200-DK") )要配套。

step 7:修改u-boot-1.1.6/board/at91rm9200dk下的flash.c

主要是修改下面几个函数:

void flash_identification (flash_info_t * info)

ulong flash_init (void)

void flash_print_info (flash_info_t * info)

61:   OrgDef OrgSST39VF6401B[] = //SST39VF6401B
       {
         {  2048,  4*1024 }, /*   8 *  8 kBytes sectors */  
       };

116    /* Vendor type */

117    info->flash_id = ATM_MANUFACT & FLASH_VENDMASK;

118    printf ("Atmel: ");

改为:

116    /* Vendor type */

117    info->flash_id = SST_MANUFACT & FLASH_VENDMASK;

118    printf ("SST: ");

276:  case (SST_ID_xF6401B & FLASH_TYPEMASK):   //SST39VF6401B
       printf ("SST39VF6401B (64Mbit)/n");
       break;

190:  else if ((flash_info[i].flash_id & FLASH_TYPEMASK) ==
       (SST_ID_xF6401B & FLASH_TYPEMASK)){ // SST39VF6401B Flash

       pOrgDef = OrgSST39VF6401B;
       flash_nb_blocks = sizeof (OrgSST39VF6401B) / sizeof (OrgDef);
       }

134:      }else if ((device_code & FLASH_TYPEMASK) == (SST_ID_xF6401B & FLASH_TYPEMASK)) {    //SST39VF6401B
  info->flash_id |= SST_ID_xF6401B & FLASH_TYPEMASK;
  printf ("SST39VF6401B (64Mbit)/n");
 }

318:  (SST_MANUFACT & FLASH_VENDMASK)) {

然后还要修改u-boot-1.1.6/include下的flash.h给其中添加ID号

新增:

245:    #define SST_ID_xF6401B   0x236D236D // 39xF6401 ID (64M = 4M x 16 )


step 8:最后在DZ中输入:

 make at91rm9200dk_config
 make

待编译数分钟后,可以生成一个所需的u-boot.bin文件。

【将u-boot烧到板子调试】

首先,将u-boot.bin拷到Windows的环境下,烧到板子中,会出现如下信息:

 

U-Boot 1.1.6 (Dec 25 2010 - 17:03:45)                                    

DRAM:  16 MB           
Atmel: SST39VF6401B (16Mbit)                           
Flash:  8 MB           
*** Warning - bad CRC, using default environment                                               

In:    serial            
Out:   serial            
Err:   serial             
U-Boot>      

出现这种情况是正常的,主要是因为环境变量没有保存起来,导致在计算出来的CRC与设定好的CRC不配套。

U-Boot> 处跳动的光标处直接输入saveenv回车,会出现如下信息:

Saving Environment to Flash...                             
Un-Protected 2 sectors                     
Erasing Flash...Erasing sector 48 ... ok.                                        
Erasing sector 49 ... ok.                        
Erased 2 sectors               
Writing to Flash... done                       
Protected 2 sectors                  
U-Boot>   

然后重启板子,就会显示板子在配置之后的相关信息:

U-Boot 1.1.6 (Dec 25 2010 - 17:03:45)                                     

DRAM:  16 MB           
Atmel: SST39VF6401B (16Mbit)                           
Flash:  8 MB           
In:    serial            
Out:   serial            
Err:   serial            
U-Boot> 

此时说明u-boot已经完全编译通过了。最后我们就可以将我们需要的u-boot.bin文件(在根目录u-boot-1.1.6下)用于接下来的内核移植了。    

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值