您的位置:首页 > 其它

u-boot-2012.04.01移植笔记——时钟、SDRAM、UART

2014-08-08 15:36 337 查看
首先我们通过分析得知源代码的机制:

它的链接地址设置在了0地址处,而且只支持norflash启动,还会进行代码重定位!既然链接地址就在0地址处,为什么还要代码重定位呢?这是因为norflash可以向内存一样读,但是不可以向内存一样写,所以有些变量和函数需要重定位到内存里面去!我们需要在连接时使用-pie选项,这样旧的地址就会保存在某个段里面,我们就可以这个段里面的内容将旧的地址修改为重定位后的地址!重定位函数是:relocate_code(addr_sp, id, addr);

addr_sp=0x34000000-(一部分空间):作为栈使用

addr指向上一行所说的“一部分空间”中某一块,用来放重定位的代码

下面我们来修改u-boot源码:

1、新建单板:

cd board/samsung

cp smdk2410 smdk2440 -rf

2、增加配置文件:

cd include/configs/首先我们通过分析得知源代码的机制:

它的链接地址设置在了0地址处,而且只支持norflash启动,还会进行代码重定位!既然链接地址就在0地址处,为什么还要代码重定位呢?这是因为norflash可以向内存一样读,但是不可以向内存一样写,所以有些变量和函数需要重定位到内存里面去!我们需要在连接时使用-pie选项,这样旧的地址就会保存在某个段里面,我们就可以这个段里面的内容将旧的地址修改为重定位后的地址!重定位函数是:relocate_code(addr_sp, id, addr);

addr_sp=0x34000000-(一部分空间):作为栈使用

addr指向上一行所说的“一部分空间”中某一块,用来放重定位的代码

下面我们来修改u-boot源码:

1、新建单板:

cd board/samsung

cp smdk2410 smdk2440 -rf

2、增加配置文件:

cd include/configs/

cp smdk2410.h smdk2440.h

3、增加配置选项:

 vi boards.cfg

加入下面一行:

smdk2440                     arm         arm920t     -                   samsung        s3c24x0

4、修改时钟参数:

在board/samsung/smdk2440/smdk2410.c的board_early_init_f函数里面,注释掉以下几行:

 /* to reduce PLL lock time, adjust the LOCKTIME register */
 //writel(0xFFFFFF, &clk_power->locktime); /* configure MPLL */ 
 //writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,
 // &clk_power->mpllcon);

在arch/arm/cpu/arm920t/start.S里面将:

/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr
r0, =CLKDIVN
mov
r1, #3
str
r1, [r0]

修改为:

   ldr r0 , =0x4C000014
    mov r1 , #5
    str r1 , [r0]

    mrc
p15, 0, r0, c1, c0, 0
    orr
r1, r1, #0xc0000000
    mcr
p15, 0, r0, c1, c0, 0
   
    ldr r0 , =0x4C000004
    ldr r1 , =((0x5c<<12)|(0x01<<4)|(0x01))
    str r1 , [r0]

5、开启icache:
在时钟设置代码的下面加入如下代码:

mrc p15, 0, r0, c1, c0, 0

orr r0, r0, #(1<<12)
mcr
p15, 0, r0, c1, c0, 0  

6、修改内存配置:

在board/samsung/smdk2440/lowlevel_init.S文件里面

将如下代码:

    .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
    .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
    .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))
    .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))
    .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))
    .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))
    .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))
    .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))
    .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))
    .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
    .word 0x32
    .word 0x30
    .word 0x30

修改为如下代码:

    .long   0x22011110      @ BWSCON
    .long   0x00000700      @ BANKCON0
    .long   0x00000700      @ BANKCON1
    .long   0x00000700      @ BANKCON2
    .long   0x00000700      @ BANKCON3
    .long   0x00000700      @ BANKCON4
    .long   0x00000700      @ BANKCON5
    .long   0x00018005      @ BANKCON6
    .long   0x00018005      @ BANKCON7
    .long   0x008C07A3      @ REFRESH
    .long   0x000000B1      @ BANKSIZE
    .long   0x00000030      @ MRSRB6
    .long   0x00000030      @ MRSRB7

7、串口配置:

在include/configs/smdk2440.h中将

CONFIG_S3C2410

改为

CONFIG_S3C2440

我们可以编译下,可以看到串口正常输出!

编译出现错误:忘记是什么了,反正是说s3c2440_nand.c文件有什么没有定义

解决方法:将#define CONFIG_CMD_NAND注释掉

再次编译,出现错误:

fs/yaffs2/libyaffs2.o: In function `yaffs_StartUp':
/home/share/jz2440/source/u-boot/u-boot-2012.04.01/fs/yaffs2/yaffscfg.c:210: undefined reference to `nand_info'

解决方法:将#define CONFIG_YAFFS2注释掉

cp smdk2410.h smdk2440.h

3、增加配置选项:

 vi boards.cfg

加入下面一行:

smdk2440                     arm         arm920t     -                   samsung        s3c24x0

4、修改时钟参数:

在board/samsung/smdk2440/smdk2410.c的board_early_init_f函数里面,注释掉以下几行:

 /* to reduce PLL lock time, adjust the LOCKTIME register */
 //writel(0xFFFFFF, &clk_power->locktime); /* configure MPLL */ 
 //writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,
 // &clk_power->mpllcon);

在arch/arm/cpu/arm920t/start.S里面将:

/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr
r0, =CLKDIVN
mov
r1, #3
str
r1, [r0]

修改为:

   ldr r0 , =0x4C000014
    mov r1 , #5
    str r1 , [r0]

    mrc
p15, 0, r0, c1, c0, 0
    orr
r1, r1, #0xc0000000
    mcr
p15, 0, r0, c1, c0, 0
   
    ldr r0 , =0x4C000004
    ldr r1 , =((0x5c<<12)|(0x01<<4)|(0x01))
    str r1 , [r0]

5、开启icache:
在时钟设置代码的下面加入如下代码:

mrc p15, 0, r0, c1, c0, 0

orr r0, r0, #(1<<12)
mcr
p15, 0, r0, c1, c0, 0  

6、修改内存配置:

在board/samsung/smdk2440/lowlevel_init.S文件里面

将如下代码:

    .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
    .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
    .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))
    .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))
    .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))
    .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))
    .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))
    .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))
    .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))
    .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
    .word 0x32
    .word 0x30
    .word 0x30

修改为如下代码:

    .long   0x22011110      @ BWSCON
    .long   0x00000700      @ BANKCON0
    .long   0x00000700      @ BANKCON1
    .long   0x00000700      @ BANKCON2
    .long   0x00000700      @ BANKCON3
    .long   0x00000700      @ BANKCON4
    .long   0x00000700      @ BANKCON5
    .long   0x00018005      @ BANKCON6
    .long   0x00018005      @ BANKCON7
    .long   0x008C07A3      @ REFRESH
    .long   0x000000B1      @ BANKSIZE
    .long   0x00000030      @ MRSRB6
    .long   0x00000030      @ MRSRB7

7、串口配置:

在include/configs/smdk2440.h中将

CONFIG_S3C2410

改为

CONFIG_S3C2440

我们可以编译下,可以看到串口正常输出!

编译出现错误:忘记是什么了,反正是说s3c2440_nand.c文件有什么没有定义

解决方法:将#define CONFIG_CMD_NAND注释掉

再次编译,出现错误:

fs/yaffs2/libyaffs2.o: In function `yaffs_StartUp':
/home/share/jz2440/source/u-boot/u-boot-2012.04.01/fs/yaffs2/yaffscfg.c:210: undefined reference to `nand_info'

解决方法:将#define CONFIG_YAFFS2注释掉
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  u-boot samsung 移植