修改编译Bootstrap和U-boot时遇到的问题和解决办法

来源:互联网 发布:如何查看网络ping 编辑:程序博客网 时间:2024/06/06 10:48
 

一.工具链问题:修改makefile文件里的CROSS_COMPILE=所用的gcc工具链

二.在linux下编译的时候出现cc1: 错误:无法识别的命令行选项“-mabi=apcs-gnu”

解决办法:修改cpu/arm926ejs/config.mk文件里的

PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)为

PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu,))

三.出现hello world例程的编译问题时,去掉example和apiexample的编译

解决办法:修改Makefile文件里的SUBDIRS=tools/example/api-example为SUBDIRS=tools

四.出现-march=所带参数(armv5te)不正确 –mtune=所带参数(armv5te)不正确

解决办法:由于浮点数参数问题需要更换gcc编译工具,linux下原版本为4.1.2,版本必须是arm-linux-gcc3.3.2

更换步骤如下:(更换gcc工具链后问题1-4都没有了,可以生成uboot.bin)

arm-linux-gcc-3.3.2 交叉编译器的建立

以下为网上参考资料:

1:下载arm-linux-gcc-3.3.2.tar.bz2 到任意的目录下

我把它下载到了我的工具文件夹里 /home/zt/tools

arm-linux-gcc-3.3.2.tar.bz2 的下载地址如下:(有71.3M)

2:解压

进入工具目录(视具体情况而定)

debian:/home/zt/tools# cd /home/zt/tools

解压

debian:/home/zt/tools# tar -jxvf arm-linux-gcc-3.3.2.tar.bz2

解压过程需要一段时间,解压后的文件形成了 usr/local/ 文件夹

进入该文件夹

debian:/home/zt/tools# cd usr/local/ 

将arm文件夹考到/usr/local/下

   debian:/home/zt/tools/usr/local# cp -rv arm /usr/local/

现在交叉编译程序集都位于/usr/local/arm/3.3.2/bin下面了

3:修改环境变量

export PATH=/usr/local/arm/3.3.2/bin:$PATH

用此方法添加的环境变量会在掉电后丢失,因此,可以在启动脚本里做手脚,方法如下:

debian:/home/zt/tools/usr/local# vim /etc/bash.bashrc

在文件的最后一行添加以上命令

export PATH=/usr/local/arm/3.3.2/bin:$PATH

保存退出,当重新登录root时 新的环境变量就会加载了,呵呵

检测一下   

debian:/home/zt/tools/usr/local# echo $PATH /usr/local/arm/3.3.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

4:测试

debian:/home/zt/tools/usr/local# arm-linux-gcc -vReading specs from /usr/local/arm/3.3.2/lib/gcc-lib/arm-linux/3.3.2/specs Configured with: ../gcc-3.3.2/configure --target=arm-linux --with-cpu=strongarm1100 --prefix=/usr/local/arm/3.3.2 i686-pc-linux-gnu --with-headers=/work/kernel.h3900/include --enable-threads=pthreads --enable-shared --enable-static --enable-languages=c,c++ Thread model: posix gcc version 3.3.2

这表示工具已经安装成功了,否则 会提示

bash: arm-linux-gcc: command not found

5:收尾工作

把用过的文件删除

debian:/home/zt/tools/usr/local# cd ../..

debian:/home/zt/tools# rm -rv usr

五.编译BootStrap和UBOOT

1、一级启动代码Bootstrap修改的文件在Bootstrap-v1.16\board\at91sam9261ek\nandflash目录下的at91sam9261ek.h中的(在项目程序中未作修改)

         #define  IMG_ADDRESS                 0x20000            /* Image Address in NandFlash */

#define     IMG_SIZE                   0x40000            /* Image Size in NandFlash    */ 

IMG_ADDRESS为Uboot在Nandflash中存放的起始地址,IMG_SIZE为文件大小,单位为KB,根据实际情况设定。

另外添加了支持的Nandflash的信息在Bootstrap-v1.16\include目录下的nand_ids.h文件中的

{0xecF1, 0x400, 0x20000, 0x800, 0x40, 0x0, "K9F1G08U0B\0"},

具体意义见Bootstrap-v1.16\include目录下的nandflash.h中的介绍

Bootstrap编译过程:在Bootstrap-v1.16\board\at91sam9261ek\nandflash目录下有个makefile文件,只需用gcc编译工具(本程序是在Cygwin环境下)make目录中的makefile文件即可在当前文件下生成所需的可执行文件,然后用SAM-BA工具烧写到Nandflash中(具体方法在此不做说明)。

2、Uboot修改的文件在u-boot-1.3.4\include\configs目录下的at91sam9261ek.h文件中的

#undef CFG_USE_DATAFLASH_CS0

/*#undef CFG_USE_NANDFLASH    */

#define CFG_USE_NANDFLASH                 1

#define CFG_ENV_IS_IN_NAND      1

#define CFG_ENV_OFFSET                0x60000

#define CFG_ENV_OFFSET_REDUND      0x80000

#define CFG_ENV_SIZE             0x20000            /* 1 sector = 128 kB */

#define CONFIG_BOOTCOMMAND "nand read 0x22000000 0xa0000 0x200000; bootm"

CFG_ENV_OFFSET和CFG_ENV_OFFSET_REDUND为存放uboot环境变量的起始地址,大小为0x20000。从0xa0000为应用程序代码存放的起始地址,大小为0x200000。

编译过程:修改完以上环境变量后,在根用户下进入到u-boot-1.3.4目录执行以下命令

[root@localhost u-boot-1.3.4]#make distclean

[root@localhost u-boot-1.3.4]# make at91sam9261ek_config

Configuring for at91sam9261ek board...

[root@localhost u-boot-1.3.4]#make

然后等待编译完成,需要一段时间,编译完成后在u-boot-1.3.4文件目录下就会生成u-boot.bin文件

然后通过SAM-BA烧写到Nandflash中。

六.编译uboot成功后下载到nandflash里面启动能uboot,但是却进不了调试模式,在倒计时结束之前按下任何键也没有反应?

解决方法:原因分析bootdelay时间太短

七.下载应用程序后

setenv bootcmd  go 0xa0000

saveenv

然后重新启动

## Starting application at 0x000A0000 ...停在这里,应用程序没有启动,

原因分析:应用程序不能再Flash里面运行,必须拷贝到SDRAM中才行(见笑了,本人是菜鸟)

把命令改成

setenv bootcmd nand read.i 0x20000000 0xa0000 0x20000\; go 0x20000000

NAND read: device 0 offset 0xa0000, size 0x20000

 

Reading data from 0xbf800 -- 100% complete.

 131072 bytes read: OK

## Starting application at 0x20000000 ...

停止

但是把应用程序通过SAMBA烧写进0xa0000之后Uboot能正常加载应用程序。

原因分析:erase命令擦除不了flash,没有把程序烧写进flash里面

U-Boot> protect off 0xa0000 0xbffff

U-Boot> erase 0xa0000 0xbffff

U-Boot>cp.b 0x20000000 0xa0000 0x20000

执行以上命令任何信息都没有显示。

使用SAM-BA可以把应用程序烧写进flash而且能正常运行

 

原因分析,解决办法:

U-Boot> protect off 0xa0000 0xbffff

U-Boot> erase 0xa0000 0xbffff

命令不对,改为

U-Boot> protect off 0xa0000 0x20000

U-Boot> nand erase 0xa0000 0x20000

后能正常擦除但是还是不能把程序烧写进flash

查看代码后把cp命令改为:

U-Boot>nand write 0x20000000 0xa0000 0x20000

后能正常引导应用程序

以下为从串口烧写程序步骤和命令

1.发送.bin文件到SDRAM的0x20000000

U-Boot> loadb 0x20000000

## Ready for binary (kermit) download to 0x20000000 at 115200 bps...

## Total Size      = 0x00008bb8 = 35768 Bytes

## Start Addr      = 0x20000000

2.解除flash保护

U-Boot> protect off 0xa0000 0xbffff

3.擦除要烧写的nand区域

U-Boot> nand erase 0xa0000 0x20000

NAND erase: device 0 offset 0xa0000, size 0x20000

Erasing at 0xa0000 -- 100% complete.

OK

4.拷贝程序从SDRAM到nandflash

U-Boot> nand write 0x20000000 0xa0000 0x20000

 

NAND write: device 0 offset 0xa0000, size 0x20000

 

Writing data at 0xbf800 -- 100% complete.

 131072 bytes written: OK

然后就可以正常加载应用程序了,也可以从串口烧写程序了。