fl2440的U-boot-2010.09移植
2012-12-22 19:04
316 查看
鉴于u-boot的2010.09版本之后的结构发生很大变化,特别是它启动步骤的改变,使得支持Nand flash启动支持的困难,我尝试了几次,最后从Nand flash启动后uboot的指令却无法支持了,而2010.09版本是U-boot结构发生较大改变的最后一个版本,其中已添加了S3C2440的支持(不像以前的版本需要在很多文件中的CONFIG_S3C2410后加上CONFIG_S3C2440),于是选择它作为fl2440的bootloader。
在Uboot中添加fl2440开发板的支持
1、打开U-boot-2010.09解压目录下的boards.cfg在smdk2410后添加fl2440的配置选项:
smdk2410 arm arm920t - samsung s3c24x0
fl2440 arm arm920t fl2440 - s3c24x0
2、在/board子目录中建立自己的开发板fl2440目录
yanghao@yanghao:~/Desktop/uboot/u-boot-2010.09$ cd board
yanghao@yanghao:~/Desktop/uboot/u-boot-2010.09/board$ mkdir fl2440
yanghao@yanghao:~/Desktop/uboot/u-boot-2010.09/board$ cp -arf samsung/smdk2410/* fl2440/
yanghao@yanghao:~/Desktop/uboot/u-boot-2010.09/board$ cd fl2440/
yanghao@yanghao:~/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/中建立开发板的配置头文件
yanghao@yanghao:~/Desktop/uboot/u-boot-2010.09$ cp include/configs/smdk2410.h include/configs/fl2440.h
(4)添加fl2440的配置文件,测试编译能否成功
配置
yanghao@yanghao:~/Desktop/uboot/u-boot-2010.09$ make fl2440_config
Configuring for fl2440 board...
测试编译
yanghao@yanghao:~/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中S3C2440片上系统的支持。
一、汇编文件修改,这部分主要集中修改修改cpu/arm920t/start.S文件。
1、删除AT91RM9200使用的LED代码,117、118行,关闭LED代码。
[cpp]
view plaincopyprint?
// bl coloured_LED_init // bl red_LED_on
2、修改编译条件支持s3c2440,修改寄存器地址定义,修改 CPU频率初始化设置
[plain]
view plaincopyprint?
# 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、修改中断禁止部分
[plain]
view plaincopyprint?
# 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),紧接着上面一步,在其后添加和修改为:
[cpp]
view plaincopyprint?
#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文件
[cpp]
view plaincopyprint?
#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中是无效的)*/
二、补充对S3C2440的支持。
6、修改S3C2440在C语言中要使用的寄存器,修改include/asm/arch-s3c24x0/s3c24x0.h文件的第81、91、95、106、144、400行:
将“#ifdef CONFIG_S3C2410”改为 #if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
顺便在其中加入S3C2440的NAND FLASH 寄存器定义(第154行附近)和CAMDIVN定义(第124行附近):
[cpp]
/* CLOCK & POWER MANAGEMENT (see S3C2400 manual chapter 6) */
/* (see S3C2410 manual chapter 7) */
struct s3c24x0_clock_power {
u32 LOCKTIME;
u32 MPLLCON;
u32 UPLLCON;
u32 CLKCON;
u32 CLKSLOW;
u32 CLKDIVN;
#if defined (CONFIG_S3C2440)
u32 CAMDIVN;
#endif
};
#if defined(CONFIG_S3C2410)
/* NAND FLASH (see S3C2410 manual chapter 6) */
struct s3c2410_nand {
u32 NFCONF;
u32 NFCMD;
u32 NFADDR;
u32 NFDATA;
u32 NFSTAT;
u32 NFECC;
};
#endif
#if defined(CONFIG_S3C2440)
/* NAND FLASH (see S3C2440 manual chapter 6) */
struct s3c2410_nand {
u32 NFCONF;
u32 NFCONT;
u32 NFCMD;
u32 NFADDR;
u32 NFDATA;
u32 NFMECCD0;
u32 NFMECCD1;
u32 NFSECCD;
u32 NFSTAT;
u32 NFESTAT0;
u32 NFESTAT1;
u32 NFMECC0;
u32 NFMECC1;
u32 NFSECC;
u32 NFSBLK;
u32 NFEBLK;
};
#endif
7、include/asm/arch/s3c24x0_cpu.h,这个文件使添加对2440的支持的头文件的工作量少了很多。文件的第23行
#if defined(CONFIG_S3C2400)
#include <s3c2400.h>
#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
#include <s3c2410.h>
8、arch/arm/cpu/arm920t/s3c24x0/timer.c文件的在184行添加
defined(CONFIG_VCMA9) || \
defined(CONFIG_FL2440)
9、arch/arm/cpu/arm920t/s3c24x0/speed.c
由于S3C2410和S3C2440的MPLL、UPLL计算公式不一样,所以get_PLLCLK函数也需要修改,在66行添加
[cpp]
#if defined(CONFIG_S3C2440)
if(pllreg == MPLL)
return (CONFIG_SYS_CLK_FREQ * m * 2) / (p << s);
else if(pllreg == UPLL)
#endif
return (CONFIG_SYS_CLK_FREQ * m) / (p << s);
由于S3C2410和S3C2440的设置方法也不一样,所以get_HCLK函数也需要修改,80行/* return HCLK frequency */
[cpp]
view plaincopyprint?
ulong get_HCLK(void)
{
struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
#if defined(CONFIG_S3C2440)
if (readl(&clk_power->CLKDIVN) & 0x6)
{
if ((readl(&clk_power->CLKDIVN) & 0x6)==2) return(get_FCLK()/2);
if ((readl(&clk_power->CLKDIVN) & 0x6)==6) return((readl(&clk_power->CAMDIVN) & 0x100) ? get_FCLK()/6 : get_FCLK()/3);
if ((readl(&clk_power->CLKDIVN) & 0x6)==4) return((readl(&clk_power->CAMDIVN) & 0x200) ? get_FCLK()/8 : get_FCLK()/4);
return(get_FCLK());
}
else return(get_FCLK());
#else
return (readl(&clk_power->CLKDIVN) & 2) ? get_FCLK() / 2 : get_FCLK();
#endif
}
10、修改drivers/i2c/s3c24x0_i2c.c文件,其原来的位置/cpu/arm920t/s3c24x0/i2c.c
第60、79、131、140、166行:
将“#ifdef CONFIG_S3C2410”改为 #if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
11、串口相关修改,修改common/serial.c文件,71行将#elif defined(CONFIG_S3C2410) 改为#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440),160行 改为#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
修改include/serial.h 在49行添加
#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
12、修改include/configs/fl2440.h文件中第38行,39行的
#define CONFIG_S3C2410 1 /* specifically a SAMSUNG S3C2410 SoC */
#define CONFIG_SMDK2410 1 /* on a SAMSUNG SMDK2410 Board */
为
#define CONFIG_S3C2440 1 /* specifically a SAMSUNG S3C2440 SoC */
#define CONFIG_FL2440 1 /* on a SAMSUNG FL2440 Board */
然后我们再执行make,这时可以成功编译出来的u-boot.bin。
如果我们在include/configs/fl2440.h文件中添加
#define CONFIG_SKIP_LOWLEVEL_INIT 1 //用来支持uboot在内存中直接运行
然后再编译出u-boot.bin,这时的镜像文件就可以通过J-Link下载到内存0x33f80000处运行。
在Uboot中添加fl2440开发板的支持
1、打开U-boot-2010.09解压目录下的boards.cfg在smdk2410后添加fl2440的配置选项:
smdk2410 arm arm920t - samsung s3c24x0
fl2440 arm arm920t fl2440 - s3c24x0
smdk2410 arm arm920t - samsung s3c24x0 fl2440 arm arm920t fl2440 - s3c24x0
2、在/board子目录中建立自己的开发板fl2440目录
yanghao@yanghao:~/Desktop/uboot/u-boot-2010.09$ cd board
yanghao@yanghao:~/Desktop/uboot/u-boot-2010.09/board$ mkdir fl2440
yanghao@yanghao:~/Desktop/uboot/u-boot-2010.09/board$ cp -arf samsung/smdk2410/* fl2440/
yanghao@yanghao:~/Desktop/uboot/u-boot-2010.09/board$ cd fl2440/
yanghao@yanghao:~/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/中建立开发板的配置头文件
yanghao@yanghao:~/Desktop/uboot/u-boot-2010.09$ cp include/configs/smdk2410.h include/configs/fl2440.h
(4)添加fl2440的配置文件,测试编译能否成功
配置
yanghao@yanghao:~/Desktop/uboot/u-boot-2010.09$ make fl2440_config
Configuring for fl2440 board...
测试编译
yanghao@yanghao:~/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中S3C2440片上系统的支持。
一、汇编文件修改,这部分主要集中修改修改cpu/arm920t/start.S文件。
1、删除AT91RM9200使用的LED代码,117、118行,关闭LED代码。
[cpp]
view plaincopyprint?
// bl coloured_LED_init // bl red_LED_on
// bl coloured_LED_init // bl red_LED_on
2、修改编译条件支持s3c2440,修改寄存器地址定义,修改 CPU频率初始化设置
[plain]
view plaincopyprint?
# 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*/
# 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、修改中断禁止部分
[plain]
view plaincopyprint?
# 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
# 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),紧接着上面一步,在其后添加和修改为:
[cpp]
view plaincopyprint?
#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
#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文件
[cpp]
view plaincopyprint?
#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中是无效的)*/
#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中是无效的)*/
二、补充对S3C2440的支持。
6、修改S3C2440在C语言中要使用的寄存器,修改include/asm/arch-s3c24x0/s3c24x0.h文件的第81、91、95、106、144、400行:
将“#ifdef CONFIG_S3C2410”改为 #if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
顺便在其中加入S3C2440的NAND FLASH 寄存器定义(第154行附近)和CAMDIVN定义(第124行附近):
[cpp]
/* CLOCK & POWER MANAGEMENT (see S3C2400 manual chapter 6) */
/* (see S3C2410 manual chapter 7) */
struct s3c24x0_clock_power {
u32 LOCKTIME;
u32 MPLLCON;
u32 UPLLCON;
u32 CLKCON;
u32 CLKSLOW;
u32 CLKDIVN;
#if defined (CONFIG_S3C2440)
u32 CAMDIVN;
#endif
};
#if defined(CONFIG_S3C2410)
/* NAND FLASH (see S3C2410 manual chapter 6) */
struct s3c2410_nand {
u32 NFCONF;
u32 NFCMD;
u32 NFADDR;
u32 NFDATA;
u32 NFSTAT;
u32 NFECC;
};
#endif
#if defined(CONFIG_S3C2440)
/* NAND FLASH (see S3C2440 manual chapter 6) */
struct s3c2410_nand {
u32 NFCONF;
u32 NFCONT;
u32 NFCMD;
u32 NFADDR;
u32 NFDATA;
u32 NFMECCD0;
u32 NFMECCD1;
u32 NFSECCD;
u32 NFSTAT;
u32 NFESTAT0;
u32 NFESTAT1;
u32 NFMECC0;
u32 NFMECC1;
u32 NFSECC;
u32 NFSBLK;
u32 NFEBLK;
};
#endif
/* CLOCK & POWER MANAGEMENT (see S3C2400 manual chapter 6) */ /* (see S3C2410 manual chapter 7) */ struct s3c24x0_clock_power { u32 LOCKTIME; u32 MPLLCON; u32 UPLLCON; u32 CLKCON; u32 CLKSLOW; u32 CLKDIVN; #if defined (CONFIG_S3C2440) u32 CAMDIVN; #endif }; #if defined(CONFIG_S3C2410) /* NAND FLASH (see S3C2410 manual chapter 6) */ struct s3c2410_nand { u32 NFCONF; u32 NFCMD; u32 NFADDR; u32 NFDATA; u32 NFSTAT; u32 NFECC; }; #endif #if defined(CONFIG_S3C2440) /* NAND FLASH (see S3C2440 manual chapter 6) */ struct s3c2410_nand { u32 NFCONF; u32 NFCONT; u32 NFCMD; u32 NFADDR; u32 NFDATA; u32 NFMECCD0; u32 NFMECCD1; u32 NFSECCD; u32 NFSTAT; u32 NFESTAT0; u32 NFESTAT1; u32 NFMECC0; u32 NFMECC1; u32 NFSECC; u32 NFSBLK; u32 NFEBLK; }; #endif
7、include/asm/arch/s3c24x0_cpu.h,这个文件使添加对2440的支持的头文件的工作量少了很多。文件的第23行
#if defined(CONFIG_S3C2400)
#include <s3c2400.h>
#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
#include <s3c2410.h>
8、arch/arm/cpu/arm920t/s3c24x0/timer.c文件的在184行添加
defined(CONFIG_VCMA9) || \
defined(CONFIG_FL2440)
9、arch/arm/cpu/arm920t/s3c24x0/speed.c
由于S3C2410和S3C2440的MPLL、UPLL计算公式不一样,所以get_PLLCLK函数也需要修改,在66行添加
[cpp]
#if defined(CONFIG_S3C2440)
if(pllreg == MPLL)
return (CONFIG_SYS_CLK_FREQ * m * 2) / (p << s);
else if(pllreg == UPLL)
#endif
return (CONFIG_SYS_CLK_FREQ * m) / (p << s);
#if defined(CONFIG_S3C2440) if(pllreg == MPLL) return (CONFIG_SYS_CLK_FREQ * m * 2) / (p << s); else if(pllreg == UPLL) #endif return (CONFIG_SYS_CLK_FREQ * m) / (p << s);
由于S3C2410和S3C2440的设置方法也不一样,所以get_HCLK函数也需要修改,80行/* return HCLK frequency */
[cpp]
view plaincopyprint?
ulong get_HCLK(void)
{
struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
#if defined(CONFIG_S3C2440)
if (readl(&clk_power->CLKDIVN) & 0x6)
{
if ((readl(&clk_power->CLKDIVN) & 0x6)==2) return(get_FCLK()/2);
if ((readl(&clk_power->CLKDIVN) & 0x6)==6) return((readl(&clk_power->CAMDIVN) & 0x100) ? get_FCLK()/6 : get_FCLK()/3);
if ((readl(&clk_power->CLKDIVN) & 0x6)==4) return((readl(&clk_power->CAMDIVN) & 0x200) ? get_FCLK()/8 : get_FCLK()/4);
return(get_FCLK());
}
else return(get_FCLK());
#else
return (readl(&clk_power->CLKDIVN) & 2) ? get_FCLK() / 2 : get_FCLK();
#endif
}
ulong get_HCLK(void) { struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power(); #if defined(CONFIG_S3C2440) if (readl(&clk_power->CLKDIVN) & 0x6) { if ((readl(&clk_power->CLKDIVN) & 0x6)==2) return(get_FCLK()/2); if ((readl(&clk_power->CLKDIVN) & 0x6)==6) return((readl(&clk_power->CAMDIVN) & 0x100) ? get_FCLK()/6 : get_FCLK()/3); if ((readl(&clk_power->CLKDIVN) & 0x6)==4) return((readl(&clk_power->CAMDIVN) & 0x200) ? get_FCLK()/8 : get_FCLK()/4); return(get_FCLK()); } else return(get_FCLK()); #else return (readl(&clk_power->CLKDIVN) & 2) ? get_FCLK() / 2 : get_FCLK(); #endif }
10、修改drivers/i2c/s3c24x0_i2c.c文件,其原来的位置/cpu/arm920t/s3c24x0/i2c.c
第60、79、131、140、166行:
将“#ifdef CONFIG_S3C2410”改为 #if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
11、串口相关修改,修改common/serial.c文件,71行将#elif defined(CONFIG_S3C2410) 改为#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440),160行 改为#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
修改include/serial.h 在49行添加
#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
12、修改include/configs/fl2440.h文件中第38行,39行的
#define CONFIG_S3C2410 1 /* specifically a SAMSUNG S3C2410 SoC */
#define CONFIG_SMDK2410 1 /* on a SAMSUNG SMDK2410 Board */
为
#define CONFIG_S3C2440 1 /* specifically a SAMSUNG S3C2440 SoC */
#define CONFIG_FL2440 1 /* on a SAMSUNG FL2440 Board */
#define CONFIG_S3C2410 1 /* specifically a SAMSUNG S3C2410 SoC */ #define CONFIG_SMDK2410 1 /* on a SAMSUNG SMDK2410 Board */ 为 #define CONFIG_S3C2440 1 /* specifically a SAMSUNG S3C2440 SoC */ #define CONFIG_FL2440 1 /* on a SAMSUNG FL2440 Board */
然后我们再执行make,这时可以成功编译出来的u-boot.bin。
如果我们在include/configs/fl2440.h文件中添加
#define CONFIG_SKIP_LOWLEVEL_INIT 1 //用来支持uboot在内存中直接运行
然后再编译出u-boot.bin,这时的镜像文件就可以通过J-Link下载到内存0x33f80000处运行。
相关文章推荐
- fl2440的U-boot-2010.09移植(一)
- fl2440的U-boot-2010.09移植(四) 添加NOR Flash启动支持
- fl2440的U-boot-2010.09移植(二)
- FL2440的U-boot-2010.09移植
- <2012 12 05> FL2440开发板的U-boot-2010.09版本移植(四)Nor Flash启动支持
- <2012 12 06> FL2440开发板的U-boot-2010.09版本移植(九)NAND Flash启动支持的一种新型方法,利用U-Boot自带nand_spl/nand_boot.c
- <2012 12 05> FL2440开发板的U-boot-2010.09版本移植(五)支持DM9000网卡和板级相关LED等配置
- <2012 12 05> FL2440开发板的U-boot-2010.09版本移植(六)uboot架构中NAND Flash驱动修改
- <2012 12 06> FL2440开发板的U-boot-2010.09版本移植(十)支持烧写YAFFS2文件系统
- fl2440的U-boot-2010.09移植(七)LCD的支持
- <2012 12 05> FL2440开发板的U-boot-2010.09版本移植(七)NAND Flash启动支持
- FL2440的u-boot-2010.09移植(一)
- <2012 12 05> FL2440开发板的U-boot-2010.09版本移植(八)LCD的支持
- <2012 12 06> FL2440开发板的U-boot-2010.09版本移植(十一)U-boot引导内核设置、编译linux内核、编译文件系统、加载...
- FL2440的u-boot-2010.09移植(二)
- fl2440的U-boot-2010.09移植(六)NAND Flash启动支持
- fl2440的U-boot-2010.09移植(七)LCD的支持
- <2012 12 02> FL2440开发板的U-boot-2010.09版本移植(一)建立特定开发板的U-boot框架
- fl2440 移植u-boot-2010.09全纪录1---------准备移植
- fl2440 移植u-boot-2010.09全纪录2-----------串口打印启动信息