移植U-boot-2012.10到smdk6410(2)-可以板级SDRAM运行

上一个笔记已经可以正常编译Uboot了,这里先修改Uboot让其能在SDRAM中运行起来。

1.修改/include/configs/smdk6410.h

    #define CONFIG_S3C6410        1    /* in a SAMSUNG S3C6400 SoC */

    #define CONFIG_SMDK6410     1    /* on a SAMSUNG SMDK6400 Board */   

    #define CONFIG_SYS_PROMPT "SMDK6410 # " /* Monitor Command Prompt */

    #define CONFIG_NR_DRAM_BANKS 2 //2个128M的chip

    #define PHYS_SDRAM_1 CONFIG_SYS_SDRAM_BASE /* SDRAM Bank #1 */

    #define PHYS_SDRAM_1_SIZE 0x08000000 /* 128 MB in Bank #1 */

    #define PHYS_SDRAM_2 (CONFIG_SYS_SDRAM_BASE+PHYS_SDRAM_1_SIZE)/* SDRAM Bank #1 */

    #define PHYS_SDRAM_2_SIZE 0x08000000 /* 128 MB in Bank #1 */

    #define CONFIG_IDENT_STRING    " for SMDK6410"

    #define CONFIG_SYS_NAND_PAGE_SIZE 4096                                //2048

    #define CONFIG_SYS_NAND_BLOCK_SIZE (512 * 1024)                  //128

    #define CONFIG_SYS_NAND_PAGE_COUNT 128                            //64。

2.修改/board/samsung/smdk6410/lowlevel_init.S

    修改LED显示

    /* LED on only #8 */

    ldr r0, =ELFIN_GPIO_BASE

    ldr r1, =0x00111111

    str r1, [r0, #GPMCON_OFFSET]

 

    ldr r1, =0x00000555

    str r1, [r0, #GPMPUD_OFFSET]

 

    ldr r1, =0x0027

    str r1, [r0, #GPMDAT_OFFSET]

    

    修改这段This was unconditional in original Samsung sources.......屏蔽掉宏定义

    //#ifndef CONFIG_S3C6410

    ldr r1, [r0, #OTHERS_OFFSET]

    bic r1, r1, #0xC0

    orr r1, r1, #0x40

    str r1, [r0, #OTHERS_OFFSET]

 

    wait_for_async:

    ldr r1, [r0, #OTHERS_OFFSET]

 

    and r1, r1, #0xf00

    cmp r1, #0x0

    bne wait_for_async

    //#endif

 

    所有的6400的字符修改为6410

     

    修改MMU正确显示SDRAM大小

    /* 128MB for SDRAM 0xC0000000 -> 0x50000000 */

    .set __base, 0x500

    .rept 0xD00 - 0xC00    

    FL_SECTION_ENTRY __base, 3, 0, 1, 1

    .set __base, __base + 1

    .endr

 

    /* access is not allowed. */ 

    .rept 0x1000 - 0xD00  

    .word 0x00000000

    .endr

3.修改arch\arm\cpu\arm1176\s3c64xx下的Makefile所有的smdk6400修改smdk6410

 

4.下载uboot到SDRAM中运行

       先使用IROM_Fusing_Tool.exe把OK6410_SDboot.nb0烧录到SD卡中,此处需要安装DNW的驱动,如果是WIN7的系统,需要使用附件中的驱动文件,并且禁用数字签名。dmw usb驱动下载地址

 

      设置开发板从SD卡启动。打开DNW,设置下载地址为0x57e00000,启动开发板后通过DNW把编译好的u-boot.bin下载到SDRAM中,下载后DNW窗口显示:

    U-Boot 2012.10 (Sep 05 2015 - 11:54:55) for SMDK6410

    CPU:     S3C6400@533MHz

    Fclk = 533MHz, Hclk = 133MHz, Pclk = 66MHz (ASYNC Mode) 

    Board:   SMDK6400

    DRAM:  128 MiB

 

    WARNING: Caches not enabled

 

    Flash: *** failed ***

 

    ### ERROR ### Please RESET the board ###

    该处需要修正的问题:CPU和Board显示不正常,另外程序检测到Flash:***failed***,实际上ok6410,没有flash

 

5.调试更正

    打开uboot打开DEBUG以便显示调试调试信息。

    flash在ok6410中没有使用,屏蔽flash的检测。arch\arm\lib\board.c,删除puts(failed);后面的hang();

 

6.程序启动后移植在打印raise: Signal # 8 caught

    主要修复timer.c,在timer.c中需要初始化全局变量gd而不是初始化一个本地变量。

    出现该信息表示做除法运算时,除数为0,进最终定位发现uboot延时程序里面调用了do_div (res, (timer_load_val / (100 * CONFIG_SYS_HZ)))函数,打印输出timer_load_val的值发现timer_load_val=0。

    进一步查看源代码发现,uboot第二阶段启动代码的加载地址是0x57e00000,调用relocate_code函数后,代码挪到了SDRAM存储器比较靠后的位置:0x57fa4000(mini6410开发板挪到了这个位置)。由于timer_load_val定义为未初始化的静态全局变量,因此timer_load_val存在于uboot的bss段所在空间,而timer_load_val是由timer_init函数在代码挪动前初始化的,代码挪动时并没有将bss段内容挪到新的位置,而是简单的全部初始化为0,导致该问题的发生。

    解决办法就是打开arch\arm\cpu\arm1176\s3c64xx\timer.c文件,在timer_load_val的定义后面增加:__attribute__((section(".data")))。修改后代码如下:

 

    static ulong timer_load_val __attribute__((section(".data")));

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值