Chinaunix首页 | 论坛 | 博客

分类: LINUX

2012-11-13 20:42:16

    u-boot-mini6410-20111018 是 friendlyarm 根据 samsung 提供的 u-boot 修改而来的,可以支持 NAND 启动 和 IROM + SD 启动。
1.探索 IROM + SD 启动
   
在 u-boot 中 SD 卡又叫做 MoviNand,如果要从 IROM + SD 启动,需要在 include/configs/mini6410.h 中定义 CONFIG_BOOT_MOVINAND 宏,相应地在 cpu/s3c64xx/start.S 中使用如下代码完成代码的拷贝。
  
    #ifdef CONFIG_BOOT_MOVINAND
  ldr   sp, _TEXT_PHY_BASE
  bl    movi_bl2_copy
  b     after_copy
  #endif


  movi_bl2_copy 负责将 SD 卡内的
BL2 代码复制到 DDR,BL2 包含了整个 u-boot 代码,movi_bl2_copy 实际上是调用了 CopyMovitoMem。

  CopyMovitoMem(HSMMC_CHANNEL, MOVI_BL2_POS, MOVI_BL2_BLKCNT, (uint *)BL2_BASE, MOVI_INIT_REQUIRED);

  HSMMC_CHANNEL:SD/MMC 通道号。
    MOVI_BL2_POS:数据的源地址,即 BL2 代码在 SD 卡中的起始地址,必须以 block(扇区) 为单位。
  MOVI_BL2_BLKCNT:需要复制的 blocks(扇区数目)。
  BL2_BASE:数据的目的地址,也就是 DDR 中的地址。
  MOVI_INIT_REQUIRED:是否需要重新初始化,一般设为 0 即可。

   
CopyMovitoMem 的定义在 /include/movi.h 中:
  #define CopyMovitoMem(a,b,c,d,e)     (((int(*)(int, uint, ushort, uint *, int))(*((uint *)(TCM_BASE + 0x8))))(a,b,c,d,e))
  这个定义实际上是调用了位于 TCM_BASE + 0x8 这个地址的函数指针(TCM_BASE 的值为 0x0C004000),这是 samsung 在 S3C6410 片内实现的代码。

2.编译
u-boot-mini6410-20111018
    # make mini6410_sd_config-ram256
    # make

3.制作适合 IROM + SD 启动的 u-boot
    编译出来的 u-boot.bin 并不能直接用于 SD 启动,因为 SD 卡启动对代码的存放位置有一定的要求。
   
 
    从 u-boot 的源代码中可以知道 BL2 = 256K(u-boot) + 128K(param),而编译出来的 u-boot 实际上只有 192K,因此需要手动填充无用数据。
   

    1.分离前面 8K 启动代码:
    # split -b 8k u-boot.bin
    # mv xaa u-boot-8k.bin
    # rm xa*
    2.扩充 u-boot 至少到 256K + 128K = 384K
   
    # cp u-boot.bin abc.bin   
    # cat abc.bin >> u-boot.bin    //刚好 384K
    3.合并
    # cat u-boot-8k.bin >> u-boot.bin
    最终生成的 u-boot.bin 就是我们想要的,为了方便管理可以将其重命名为 u-boot-sd.bin。

                       ——忠于梦想 勇于实践    linux_xpj@opencores.org

阅读(2411) | 评论(0) | 转发(4) |
给主人留下些什么吧!~~