鉴于u-boot的2010.09版本之后的结构发生很大变化,特别是它启动步骤的改变,使得支持Nand flash启动支持的困难,我尝试了几次,最后从Nand flash启动后uboot的指令却无法支持了,而2010.09版本是U-boot结构发生改变的最后一个版本,其中已添加了S3C2440的支持(不像以前的版本需要在很多文件中的CONFIG_S3C2410后加上CONFIG_S3C2440),于是选择它作为fl2440的bootloader。
相关阅读:
U-Boot源代码下载地址 http://www.linuxidc.com/Linux/2011-07/38897.htm
FL2440的U-boot-2010.09移植(一)http://www.linuxidc.com/Linux/2012-06/63755.htm
FL2440的U-boot-2010.09移植(二)http://www.linuxidc.com/Linux/2012-06/63756.htm
FL2440的U-boot-2010.09移植(三)DM9000网卡及开发板相关配置 http://www.linuxidc.com/Linux/2012-07/64155.htm
FL2440的U-boot-2010.09移植(四) 添加NOR FLash启动支持 http://www.linuxidc.com/Linux/2012-07/64156.htm
FL2440的U-boot-2010.09移植(五)uboot架构中NAND FLash驱动修改 http://www.linuxidc.com/Linux/2012-07/64157.htm
FL2440的U-boot-2010.09移植(六)NAND FLash启动支持 http://www.linuxidc.com/Linux/2012-07/641587.htm
FL2440的U-boot-2010.09移植(七)LCD的支持 http://www.linuxidc.com/Linux/2012-07/641587.htm
针对FL2440开发板的u-boot-2010.09版本补丁 http://www.linuxidc.com/Linux/2012-07/64116.htm
在Uboot中添加fl2440开发板的支持
1、打开U-boot-2010.09解压目录下的boards.cfg在smdk2410后添加fl2440的配置选项:
- smdk2410 arm arm920t - samsung s3c24x0
- fl2440 arm arm920t fl2440 - s3c24x0
2、在/board子目录中建立自己的开发板fl2440目录
www.linuxidc.com @linuxidc:~/Desktop/uboot/u-boot-2010.09$ cd board
www.linuxidc.com @linuxidc:~/Desktop/uboot/u-boot-2010.09/board$ mkdir fl2440
www.linuxidc.com @linuxidc:~/Desktop/uboot/u-boot-2010.09/board$ cp -arf samsung/smdk2410/* fl2440/
www.linuxidc.com @linuxidc:~/Desktop/uboot/u-boot-2010.09/board$ cd fl2440/
www.linuxidc.com @linuxidc:~/Desktop/uboot/u-boot-2010.09/board/fl2440$ mv smdk2410.c fl2440.c
还要记得修改自己的开发板fl2440目录下的Makefile文件28行,不然编译时会出错:
修改Makefile的依赖文件
COBJS := smdk2410.o flash.o 为 COBJS := fl2440.o flash.o
3、在include/configs/中建立开发板的配置头文件
www.linuxidc.com @linuxidc:~/Desktop/uboot/u-boot-2010.09$ cp include/configs/smdk2410.h include/configs/fl2440.h
(4)添加fl2440的配置文件,测试编译能否成功
配置
www.linuxidc.com @linuxidc:~/Desktop/uboot/u-boot-2010.09$ make fl2440_config
Configuring for fl2440 board...
测试编译
www.linuxidc.com @linuxidc:~/Desktop/uboot/u-boot-2010.09$ make
正常情况下应该输出成功了
注意:如果编译时出现以下错误(这是编译器的问题,没出错就不要修改):
uses hardware FP, whereas u-boot uses software FP
修改的方法:cpu/arm920t/config.mk的21行:PLATFORM_RELFLAGS += -fno-common -ffixed-r8 #-msoft-float ,删除msoft-float项。然后clean一下,重新make
针对FL2440开发板的u-boot-2010.09版本补丁 http://www.linuxidc.com/Linux/2012-07/64116.htm
一、汇编文件修改,这部分主要集中修改修改cpu/arm920t/start.S文件。
1、删除AT91RM9200使用的LED代码,117、118行,关闭LED代码。
- // bl coloured_LED_init
- // bl red_LED_on
2、修改编译条件支持s3c2440,修改寄存器地址定义,修改 CPU频率初始化设置
- # if defined(CONFIG_S3C2400)
- # define pWTCON 0x15300000
- # define INTMSK 0x14400008 /* Interupt-Controller base addresses */
- # define CLKDIVN 0x14800014 /* clock divisor register */
- #else
- # define pWTCON 0x53000000
- # define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
- # define INTSUBMSK 0x4A00001C
- # define CLKDIVN 0x4C000014 /* clock divisor register */
- # endif
- 添加
- # define CLK_CTL_BASE 0x4C000000
- # define MDIV_405 0x7f<<12
- # define PSDIV_405 0x21 /*set s3c2440 MPLL 405MHZ*/
- # define MDIV_200 0xa1<<12
- # define PSDIV_200 0x31 /*set s3c2410 MPLL 200MHZ*/
3、修改中断禁止部分
- # if defined(CONFIG_S3C2410)
- //ldr r1, =0x3ff
- ldr r1, =0x7ff /*uboot error*/
- ldr r0, =INTSUBMSK
- str r1, [r0]
- # endif
- 后添加
- #if defined(CONFIG_S3C2440)
- ldr r1, =0x7ff
- ldr r0, =INTSUBMSK
- str r1, [r0]
- /*INTSUBMSK 关闭中断 S3C2440有15位*/
- # endif
4、修改时钟设置(2440的主频为405MHz),紧接着上面一步,在其后添加和修改为:
- #if defined(CONFIG_S3C2440)
- /* FCLK:HCLK:PCLK = 1:4:8 */
- /* default FCLK is 405 MHz ! */
- ldr r0, =CLKDIVN
- mov r1, #5
- str r1, [r0]
- mrc p15, 0, r1, c1, c0, 0
- orr r1, r1, #0xc0000000 //asynchronous
- mcr p15, 0, r1, c1, c0, 0
- /*上面这段代码见s3c2440a手册p215,HDIVN != 0 叫做异步总线模式*/
- /* cpu clock FCLK = 405MHZ 通常我们叫400MHZ,实际是405MHZ,见S3C2440手册(英文版)chapt7,P227要习惯用英文手册:-)*/
- /*根据表中的数据设置MDIV,PDIV,SDIV*/
- mov r1, #CLK_CTL_BASE
- mov r2, #MDIV_405
- add r2, r2, #PSDIV_405
- str r2, [r1, #0x04] //写入MPLLCON
- #else
- /* FCLK:HCLK:PCLK = 1:2:4 */
- /* default FCLK is 120 MHz ! */
- ldr r0, =CLKDIVN
- mov r1, #3
- str r1, [r0]
- mrc p15, 0, r1, c1, c0, 0
- orr r1, r1, #0xc0000000 //asynchronous
- mcr p15, 0, r1, c1, c0, 0
- /* cpu clock is 200MHZ*/
- mov r1, #CLK_CTL_BASE
- mov r2, #MDIV_200
- add r2, r2, #PSDIV_200
- str r2, [r1, #0x04] //MPLLCON
- #endif
5、修改SDRAM的REFRESH刷新周期,修改board/fl2440/lowlevel_init.S文件
- #define REFCNT 1259
- /*在SDRAM手册上P3上有64ms refresh period (8K Cycle)*/
- /*结合fl2440开发板 preiod =64ms/8129=7.8125us,取7.9的话REFCNT的值为 (2048+1-7.9us*100Mhz)=1259*/
- #define Trp 0x0 /* 2clk */
- /*RAS precharge Time SDRAM数据手册P10 tRP(min)=20ns 或者18ns(由型号决定)我们知道我们的HCLK=405/4Mhz 故可设成2clk(20ns),有些移植手册设为4clk 再次充电时间设大点问题也不大吧 */
- #define Trc 0x3 /* 7clk */
- /*SDRAM ROW cycle time: Trc=Tsrc+Trp SDRAM数据手册p10 tRC(min)=65ns 或者60ns(由型号决定) 设为7即为70ns */
- #define Tchr 0x2 /* 3clk */
- /*为找到Tchr相关定义,在SMRDATA:后面设置REFRESH寄存器时(Tchr<<16),而实际上该寄存器(11~17)位为保留位,这里设置并没有意义(可能这个值在其他ARM体系中有用吧,但至少在S3C2440中是无效的)*/