简易bootloader重定位问题

单板选择NandFlash启动,则硬件上电后,系统会自动将NandFlash中的前4K内容拷贝到STEPSTONE即4K SRAM中,然后从SRAM中的0X0地址启动。基于mini2440的简易bootloader制作方法在上一篇文章中有提到,它编译出的boot.bin只有1.96KB,小于STEPSTONE的4KB,因此我们可以考虑将bootloader从nandflash拷贝到内存这一步给省略掉。

一、编辑start.S:

  1. .text  
  2. .global _start  
  3. _start:  
  4.   
  5. /* close the watchdog */  
  6.     ldr r0, =0x53000000  
  7.     mov r1, #0  
  8.     str r1, [r0]  
  9. /* close the watchdog */  
  10. @关闭看门狗  
  11. @数据手册:WTCON 0x53000000 R/W Watchdog timer control register  
  12.   
  13. /*   set the clock    */  
  14.     ldr r0, =0x4c000014  
  15.     mov r1, #0x03;            @ FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1  
  16.     str r1, [r0]  
  17.   
  18.     mrc p15, 0, r1, c1, c0, 0       /* read */   
  19.     orr r1, r1, #0xc0000000         /* set asynchronous bus mode */  
  20.     mcr p15, 0, r1, c1, c0, 0       /* write */  
  21.   
  22.     ldr r0, =0x4c000004  
  23.     ldr r1, =((0x5c<<12)|(0x01<<4)|(0x02)) @MPLL:200MHz  
  24.     str r1, [r0]  
  25. /*   set the clock    */  
  26. @设置系统时钟  
  27. @如果HDIVN不是0,CPU的总线模式应该设置成asynchronous bus mode  
  28.   
  29. /* enable the ICACHE  */  
  30.     mrc p15, 0, r0, c1, c0, 0   @ read control register  
  31.     orr r0, r0, #(1<<12)  
  32.     mcr p15, 0, r0, c1, c0, 0   @ write back  
  33. /* enable the ICACHE  */  
  34. @使能高速缓存,为系统提速,此段可不要,但程序执行速度要慢  
  35.   
  36. /*   init the SDRAM   */  
  37.     ldr r0, =0x48000000   @MEM_CTL_BASE  
  38.     adr r1, config     /* sdram config address */  
  39.     add r3, r0, #(52)       @13*4  
  40. 1:  
  41.     ldr r2, [r1], #4  
  42.     str r2, [r0], #4  
  43.     cmp r0, r3  
  44.     bne 1b  
  45. /*   init the SDRAM   */  
  46. @初始化SDRAM  
  47. @根据数据手册对与SDRAM有关的13个寄存器进行配置  
  48.   
  49. /*      relocate      */  
  50.     ldr sp, =0x34000000  
  51.     bl nand_init  
  52.   
  53. /*  mov r0, #0 
  54.     ldr r1, =_start 
  55.     ldr r2, =__bss_start 
  56.     sub r2, r2, r1 
  57.      
  58.     bl copy_code_to_sdram  */  
  59.     bl clear_bss  
  60. /*      relocate      */  
  61. @把bootloader本身的代码从nandflash复制到它的链接地址去     
  62.       
  63. /*     go to main     */  
  64.     ldr lr, =halt  
  65.     ldr pc, =main  
  66. halt:  
  67.     b halt  
  68. /*     go to main     */  
  69. @跳转到main函数执行  
  70.   
  71. config:  
  72.     .long 0x22011110     @BWSCON  
  73.     .long 0x00000700     @BANKCON0  
  74.     .long 0x00000700     @BANKCON1  
  75.     .long 0x00000700     @BANKCON2  
  76.     .long 0x00000700     @BANKCON3    
  77.     .long 0x00000700     @BANKCON4  
  78.     .long 0x00000700     @BANKCON5  
  79.     .long 0x00018005     @BANKCON6  
  80.     .long 0x00018005     @BANKCON7  
  81.     .long 0x008C04F4     @REFRESH  
  82.     .long 0x000000B1     @BANKSIZE  
  83.     .long 0x00000030     @MRSRB6  
  84.     .long 0x00000030     @MRSRB7  

注释掉:

 

  1. /*  mov r0, #0 
  2.     ldr r1, =_start 
  3.     ldr r2, =__bss_start 
  4.     sub r2, r2, r1 
  5.      
  6.     bl copy_code_to_sdram  */ 

二、编辑boot.lds:

 

  1. SECTIONS {  
  2.     . = 0x00000000;  
  3.     .text : { *(.text) }  
  4.       
  5.     . = ALIGN(4);  
  6.     .rodata : {*(.rodata*)}   
  7.       
  8.     . = ALIGN(4);  
  9.     .data : { *(.data) }  
  10.       
  11.     . = ALIGN(4);  
  12.     __bss_start = .;  
  13.     .bss : { *(.bss)  *(COMMON) }  
  14.     __bss_end = .;  
  15. }  

0x33f80000改为0x00000000。

三、make之后将生成的boot.bin下载到nandflash中,可以成功引导内核。

永不止步步 发表于03-30 10:41 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:308117个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号