移植环境
1,主机环境:VMare下CentOS 5.5 ,1G内存。
2,集成开发环境:Elipse IDE
3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-eabi-gcc v4.5.1。
4,开发板:mini2440,2M nor flash,128M nand flash。
5,u-boot版本:u-boot-2009.08
6,参考文章:
http://blogold.chinaunix.net/u3/101649/showart.php?id=2105215
http://blog.chinaunix.net/space.php?uid=23787856&do=blog&id=115382
http://blogimg.chinaunix.net/blog/upfile2/100811115954.pdf
下载并解压源文件
1,下载u-boot-2009.08,可以从官方网站下载u-boot-2009.08
2,#tar -jxvf u-boot-2009.08.tar.bz2 //解压源码
移植步骤
1.1,了解u-boot目录结构和启动流程,请参考U-Boot启动过程分析
【1】目录结构
【2】启动流程
1.2,建立mini2440开发板文件并编译测试
在项目根目录u-boot-2009.08上单击右键->浏览文件夹
【1】定位到board/samsung,将目录smdk2410复制并粘贴到当前目录下,将其重命名为mini2440。
【2】打开mini2440目录,将smdk2410.c重命名为mini2440.c,
【3】用gedit打开当前目录下的Makefile(在Makefile上单击右键->使用“文本编辑器”打开),定位到28行,修改后代码如下所示(修改部分用灰色背景颜色标出):
include $(TOPDIR)/config.mk
LIB = $(obj)lib$(BOARD).a
COBJS := mini2440.o flash.o
SOBJS := lowlevel_init.o
然后保存。
【4】在根目录下定位到include/configs,将smdk2410.h复制并粘贴到当前目录下,将其重命名成mini2440.h。
【5】用gedit打开根目录下的Makefile文件,然后搜索smdk2410,定位到2997行,找到下列语句
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0
然后将其复制并粘贴到其下面,并修改成如下语句
mini2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 samsung s3c24x0
然后保存。
*说明:
arm :CPU的架构(ARCH)
arm920t:CPU的类型
mini2440 :对应在board目录下建立新的开发板项目的目录
samsung:新开发板项目目录的上级目录,如直接在board下建立新的开发板项目的目录,则这里就为NULL
s3c24x0:CPU型号
*注意:编译选项格式的第二行要用Tab键开始,否则编译会出错。
【6】编译测试
打开终端,进入到u-boot-2009.08根目录下执行
[root@localhost u-boot-2009.08]# make distclean
[root@localhost u-boot-2009.08]# make mini2440_config
Configuring for mini2440 board...
[root@localhost u-boot-2009.08]# make
... .... .... ....
board.c:127: error: inline function 'coloured_LED_init' cannot be declared weak
board.c:129: error: inline function 'red_LED_on' cannot be declared weak
board.c:131: error: inline function 'red_LED_off' cannot be declared weak
board.c:133: error: inline function 'green_LED_on' cannot be declared weak
board.c:135: error: inline function 'green_LED_off' cannot be declared weak
board.c:137: error: inline function 'yellow_LED_on' cannot be declared weak
board.c:139: error: inline function 'yellow_LED_off' cannot be declared weak
board.c:141: error: inline function 'blue_LED_on' cannot be declared weak
board.c:143: error: inline function 'blue_LED_off' cannot be declared weak
make[1]: *** [board.o] 错误 1
make[1]: Leaving directory `/root/workspace/u-boot-2009.08/lib_arm'
make: *** [lib_arm/libarm.a] 错误 2
[root@localhost u-boot-2009.08]#
出现错误,内嵌函数不能被声明为weak属性,打开lib_arm/board.c,定位到127行开始,将其注释掉,修改后结果如下:
void inline __coloured_LED_init (void) {}
//void inline coloured_LED_init (void) __attribute__((weak, alias("__coloured_LED_init")));
void inline __red_LED_on (void) {}
//void inline red_LED_on (void) __attribute__((weak, alias("__red_LED_on")));
void inline __red_LED_off(void) {}
//void inline red_LED_off(void) __attribute__((weak, alias("__red_LED_off")));
void inline __green_LED_on(void) {}
//void inline green_LED_on(void) __attribute__((weak, alias("__green_LED_on")));
void inline __green_LED_off(void) {}
//void inline green_LED_off(void)__attribute__((weak, alias("__green_LED_off")));
void inline __yellow_LED_on(void) {}
//void inline yellow_LED_on(void)__attribute__((weak, alias("__yellow_LED_on")));
void inline __yellow_LED_off(void) {}
//void inline yellow_LED_off(void)__attribute__((weak, alias("__yellow_LED_off")));
void inline __blue_LED_on(void) {}
//void inline blue_LED_on(void)__attribute__((weak, alias("__blue_LED_on")));
void inline __blue_LED_off(void) {}
//void inline blue_LED_off(void)__attribute__((weak, alias("__blue_LED_off")));
[root@localhost u-boot-2009.08]# make clean
[root@localhost u-boot-2009.08]# make
... ...
cpu/arm920t/start.o: In function `start_code':
/root/workspace/u-boot-2009.08/cpu/arm920t/start.S:117: undefined reference to `coloured_LED_init'
/root/workspace/u-boot-2009.08/cpu/arm920t/start.S:118: undefined reference to `red_LED_on'
make: *** [u-boot] 错误 1
出现错误coloured_LED_init'未定义。打开cpu/arm920t/start.S,搜索“coloured_LED_init”定位到117行,找到如下代码:
bl coloured_LED_init
bl red_LED_on
将其注释掉
//这两行是AT91RM9200DK开发板的LED初始化,注释掉
//bl coloured_LED_init
//bl red_LED_on
然后执行清除、编译命令
[root@localhost u-boot-2009.08]# make clean
[root@localhost u-boot-2009.08]# make
... ...
arm-linux-objcopy -O srec u-boot u-boot.srec
arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
[root@localhost u-boot-2009.08]#
编译通过。
【7】加入调试选项,启用DEBUG宏,有两种办法办法
<1>参考文章Makefile,如何传递宏定义DEBUG和Debug版和Release版的程序
在编译时,直接在make 后面传入参数 -d ,表示Debug模式,输出有关文件和检测时间的详细信息,如
make -d
可以输出源程序中定义的DEBUG宏定义的调试信息
<2>用gedit打开根目录下的config.mk文件,然后搜索“DDEBUG”,找到如下语句
DBGFLAGS= -g # -DDEBUG
将注释掉的DDEBUG选项打开,修改后下面语句
DBGFLAGS= -g -DDEBUG
但是此种办法需要在调试完成时需要在将其注释掉。
待续。。。。。