织梦CMS - 轻松建站从此开始!

罗索

终于实现了从外部Nor Flash启动Uboot了

jackyhwei 发布于 2010-05-24 07:49 点击:次 
AMS3527的板子,由于启动顺序和一般不一样,而地址空间布局也不同,所以,要实现uboot从Nor Flash启动,就稍微要麻烦一些了。
TAG:

本身对于很多平台,好像uboot里面的代码,在start.S中已经包含了这部分逻辑,通过判断当前运行代码地址是否和配置的SDRAM的地址一样,而决定是去先reload,即从Nor Flash上拷贝代码到SDRAM,然后再继续运行,还是发现已经在SDRAM中了,所以就直接继续运行。

但是,我们的板子(AMS3527),由于启动顺序和一般不一样,而地址空间布局也不同,所以,要实现uboot从Nor Flash启动,就稍微要麻烦一些了。

原先的启动顺序是,通过配置外面的跳线,选择从Interl 128KB的ROM启动,然后里面固化的启动代码,根据板子上的跳线配置的,支持多种不同启动:

XPC[3:1] Boot Device
0 000 SPI master ST M25Pxx serial Nor Flash
1 001 reserved
2 010 SPI slave
3 011 NandFlash (SB/BB - autodetect)
4 100 NandFlash (SB/BB - autodetect)
5 101 UART / Command Line Interface without diagnostics
6 110 UART / Command Line Interface without diagnostics
7 111 UART / Command Line Interface with diagnostics

一般常见的是从Nand Flash启动。
此时在ROM中的启动代码,会去Nand Flash里面读取你之前烧写进去的uboot到板子内嵌的Embedded 320KB的1T-RAM,然后跳转到uboot要执行的函数继续执行uboot。

而想要实现从Nor Flash启动uboot,那么就要先把uboot烧写到Nor Flash。这点,前面帖子已经介绍了:
实现将uboot烧写到外部Nor Flash

http://www.rosoo.net/a/201005/9472.html

此处,接着之前继续折腾。
最后是实现了,具体要做的事情大概有:
1.在start.S中,把通用的那套reload uboot的代码拷贝过来。
2.把uboot要拷贝到得目的地址_TEXT_BASE,改成我们板子上的地址布局。
3.在拷贝完uboot代码之后,打算要去内部的320KB的SRAM中运行uboot。所以要根据datasheet中的介绍,
先去配置对应的寄存器的位,做一下remap,将之前映射到Nor Flash的0地址,映射成320KB的SRAM的首地址。

而下面代码中的0x81000000是Embedded 320KB的1T-RAM的别名,也就是,无论你怎么去map,怎么设置,
这个地址都代表的是Embedded 320KB的1T-RAM。
另外的,0x10000000是我们的Nor Flash的地址别名。

贴出start.S中相关的代码如下:

  1. 。。。。 
  2. #define TEXT_BASE 0x81000000 
  3. #define NOR_BASE 0x10000000 
  4. #define CCU_MEMMAP            0xC8100008 
  5.  
  6. RAM_END: 
  7. .word 0x50000 
  8. _TEXT_BASE: 
  9. .word TEXT_BASE 
  10. .globl _armboot_start 
  11. _armboot_start: 
  12. .word _start 
  13.  
  14. .globl _NOR_BASE 
  15. _NOR_BASE: 
  16. .word NOR_BASE 
  17.  
  18. .globl _ccu_map 
  19. _ccu_map: 
  20. .word CCU_MEMMAP 
  21.  
  22. 。。。。。。 
  23. 。。。。。。 
  24.  
  25.  
  26. /* 
  27. * we do sys-critical inits only at reboot, 
  28. * not when booting from ram! 
  29. */ 
  30. #ifndef CONFIG_SKIP_LOWLEVEL_INIT 
  31. bl cpu_init_crit 
  32. #endif 
  33.  
  34. #ifndef CONFIG_SKIP_RELOCATE_UBOOT 
  35. relocate:         /* read U-Boot from Nor to 320K SRAM     */ 
  36. adr r0, _start   /* r0 <- current position of code   */ 
  37. ldr r1, _TEXT_BASE   /* test if we run from flash or RAM */ 
  38. cmp     r0, r1                  /* don't reloc during debug         */ 
  39. beq     stack_setup 
  40.  
  41. ldr r2, _armboot_start 
  42. ldr r3, _uboot_need_copy_end 
  43. sub r2, r3, r2   /* r2 <- size of uboot            */ 
  44. add r2, r0, r2   /* r2 <- source end address         */ 
  45.  
  46. copy_loop: 
  47. ldmia r0!, {r3-r10}   /* copy from source address [r0]    */ 
  48. stmia r1!, {r3-r10}   /* copy to   target address [r1]    */ 
  49. cmp r0, r2    /* until source end addreee [r2]    */ 
  50. ble copy_loop 
  51. /* remap SRAM to 0x00 */ 
  52. ldr r1, _ccu_map /* 将ccu map的寄存器的地址存储到r1中 */ 
  53. ldr r0, [r1,#0] /* 读取ccu map的寄存器的值 */ 
  54. orr r0, r0, #0x01 /* 根据datasheet中描述,将bit0置1,实现remap */ 
  55. str r0, [r1,#0] /* 存储r0的值到ccu map中 */ 
  56. #endif /* CONFIG_SKIP_RELOCATE_UBOOT */ 
  57.  
  58. 。。。 
(serial_story)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201005/9473.html]
本文出处:百度博客 作者:serial_story
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容