参考 :http://www.linuxidc.com/Linux/2012-07/64158.htm
以前移植uboot总是用相同的版本按照网上的步骤进行移植,现在我想尝试一下移植最新版本的uboot,可能会遇到很多困难,但我会一步一步来,顺便记录下下移植过程,便于以后的回顾。
移植环境
1,主机环境:VMare下fedora9 ,1G内存。
3,编译编译环境:arm-linux-gcc 4.3.2
4,开发板:fl2440,256M nand flash。
5,u-boot版本:u-boot-2012.07
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-2012.07,可以从官方网站下载u-boot-2012.07 下载地址:http://ftp.denx.de/pub/u-boot/
2,#tar -jxvf u-boot-2010.07.tar.bz2 //解压源码
移植步骤
1.1,了解u-boot启动流程,请参考U-Boot启动过程分析
启动流程
1.2,建立fl2440开发板文件并编译测试
在项目根目录u-boot-2009.08上单击右键->浏览文件夹
【1】定位到board/samsung,将目录smdk2410复制并粘贴到当前目录下,将其重命名为fl2440。
# cp board/samsung/smdk2410 board/samsung/fl2440 -r
【2】打开fl2440目录,将smdk2410.c重命名为fl2440.c,
【3】用vim打开当前目录下的Makefile
include $(TOPDIR)/config.mk
LIB = $(obj)lib$(BOARD).o
COBJS := fl2440.o
SOBJS := lowlevel_init.o
然后保存。
【4】在根目录下定位到include/configs,将smdk2410.h复制并粘贴到当前目录下,将其重命名成fl2440.h。
【5】用vim打开根目录下的boards.cfg文件,然后搜索smdk2410,找到下列语句
在smdk2410下面添加fl2440 arm arm920t - samsung s3c24x0
注:Uboot 2012的板配置文件是在boards.cfg中配置的,不用修改根目录的Makefile
然后保存。
*说明:
mini2440 :对应在board目录下建立新的开发板项目的目录
arm :CPU的架构(ARCH)
arm920t :CPU的类型
- :表示在samsung目录下
Samsung :新开发板项目目录的上级目录,如直接在board下建立新的开发板项目的目录,则这里就为NULL
s3c24x0:CPU型号
【6】编译测试
打开终端,进入到u-boot-2012.07根目录下执行
[root@localhost u-boot-2012.07]# make distclean
[root@localhost u-boot-2012.07]# make fl2440_config
Configuring for fl2440 board...
[root@localhost u-boot-2012.07]# make
【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
但是此种办法需要在调试完成时需要在将其注释掉。
【8】根据启动流程修改或添加基本的u-boot源码,使其能够在内存中启动
vi include /cnfigs/fl2440.h 把
#define CONFIG_S3C2410 改为 #define CONFIG_S3C2440
并且把做出如下改正:
#define CONFIG_SYS_TEXT_BASE 0x32000000
将NAND和YAFFS2配置先注释起来,不然会有很多错误:
和
更改内存范围,将:
#defineCONFIG_SYS_MEMTEST_END 0x33F00000
修改为:
#defineCONFIG_SYS_MEMTEST_END 0x34000000 (fl2440sdram是64M)
#defined config_lowlevel_init 1 ;内存中测试不需要初始化sdram
【9】修改时钟
vi arch/arm/cpu/arm920t/start.S
找到如下
# if defined(CONFIG_S3C2410)
ldr r1,=0x3ff
ldr r0,=INTSUBMSK
str r1, [r0]
# endif
在后面加上
# if defined(CONFIG_S3C2440)
ldr r1,=0x7fff
ldr r0,=INTSUBMSK
str r1, [r0]
# endif
这里是屏蔽中断,S3C440用到了15位,所以把值设置成0x7fff
将下面这段去掉:
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
改为:
ldr r0,=CLKDIVN
mov r1, #5
str r1, [r0]
vi board/samsung/fl2440/fl2440.c
将这段改为:
#define FCLK_SPEED 1
#ifFCLK_SPEED==0
#define M_MDIV 0xC3
#define M_PDIV 0x4
#define M_SDIV 0x1
#elifFCLK_SPEED==1
#define M_MDIV 0xA1
#define M_PDIV 0x3
#define M_SDIV 0x1
#endif
#define USB_CLOCK 1
#if USB_CLOCK==0
#define U_M_MDIV 0xA1
#define U_M_PDIV 0x3
#define U_M_SDIV 0x1
#elif USB_CLOCK==1
#define U_M_MDIV 0x48
#define U_M_PDIV 0x3
#define U_M_SDIV 0x2
#endif
增加这段:
#define FCLK_SPEED 2
#ifFCLK_SPEED==0
#define M_MDIV 0xC3
#define M_PDIV 0x4
#define M_SDIV 0x1
#elifFCLK_SPEED==1
#define M_MDIV 0xA1
#define M_PDIV 0x3
#define M_SDIV 0x1
#elifFCLK_SPEED==2
#define M_MDIV 0x7f
#define M_PDIV 0x2
#define M_SDIV 0x1
#endif
#define USB_CLOCK 2
#if USB_CLOCK==0
#define U_M_MDIV 0xA1
#define U_M_PDIV 0x3
#define U_M_SDIV 0x1
#elif USB_CLOCK==1
#define U_M_MDIV 0x48
#define U_M_PDIV 0x3
#define U_M_SDIV 0x2
#elif USB_CLOCK==2
#define U_M_MDIV 0x38
#define U_M_PDIV 0x2
#define U_M_SDIV 0x2
#endif
因为FL2440的晶振为12M,在芯片手册可以查到这些值,使得CPU频率为405M,USB时钟频率为48M
在board_init函数中,修改:
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
为:
gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
编译之后下载到开发板上运行如下:
U-Boot 2012.07 (Oct 07 2012 - 14:52:20)
CPUID: 32440001
FCLK: 405 MHz
HCLK: 101.250 MHz
PCLK: 50.625 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: *** failed ***
### ERROR ### Please RESET the board ###
接下来将进入u-boot的第二阶段,为u-boot-2012.07增加nandflash支持。