修改编译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
然后就可以正常加载应用程序了,也可以从串口烧写程序了。
- 修改编译Bootstrap和U-boot时遇到的问题和解决办法
- 编译u-boot遇到的问题和解决办法
- u-boot 编译出现的硬浮点和软浮点的问题的解决办法
- 编译u-boot,遇到的问题
- bootstrap和u-boot内存地址映射问题分析
- mini2440 编译u-boot-1.1.6遇到的一些问题
- mini2440 编译U-Boot-1.1.6遇到的一些问题
- linux下解决u-boot编译遇到的下列问题
- S3C44B0 u-boot和uclinux的编译
- 编译Hi3518E V200R001C01SPC030包osdrv遇到的问题和解决办法
- U-Boot 配置和编译
- OK6410-A编译u-boot时遇到的问题及解决
- OK6410-A编译u-boot时遇到的问题及解决
- OK6410-A编译u-boot时遇到的问题及解决
- u-boot-2012.04 编译和skyeye仿真flash:***failed***问题
- u-boot编译问题
- U-boot编译问题
- u-boot配置和编译过程浅析
- 数据库open时,回滚数据文件丢失,无备份,有活动事务(实验系列)
- 矩阵问题&&http://acm.hdu.edu.cn/showproblem.php?pid=1575
- PHP 设计模式之 — 单例模式
- DOMContentLoaded与onload加载顺序
- Ubuntu以root用户自动登录
- 修改编译Bootstrap和U-boot时遇到的问题和解决办法
- oracle中涉及到的隐含参数的解决办法
- 构造函数和复制构造函数
- Android Vold架构
- 数据文件offline,未归档的非活动在线日志或当前在线日志损坏,在线修复(实验系列)
- eclipse 下tomcat 的安装
- Java模式 - Flyweight(享元模式)
- 已归档的活动在线日志损坏,异常关闭(实验系列)
- iOS 应用实现条形码扫描功能的方法