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下)用于接下来的内核移植了。