Chinaunix首页 | 论坛 | 博客
  • 博客访问: 234760
  • 博文数量: 63
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 16
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-29 21:37
文章分类

全部博文(63)

文章存档

2017年(3)

2016年(3)

2014年(57)

我的朋友

分类: LINUX

2014-03-29 21:41:51

首先必须弄清楚S3C6410关于SD启动的整个过程。

再来谈移植:

1.把movi.h文件放在include目录下。

2.把movi_boot.c放在/nand_spl目录下并创建链接,把链接放到/nand_spl/board/samsung/smdk6410目录下并修改该目录下的Makefile

    2.1 增加movi_boot.o

 COBJS    = nand_boot.o nand_ecc.o s3c64xx.o smdk6410_nand_spl.o nand_base.o movi_boot.o

   2.2 指明movi_boot.c路径

  $(obj)movi_boot.c:
  @rm -f $@
  @ln -s $(TOPDIR)/nand_spl/movi_boot.c $@

3.增加宏定义#define CONFIG_MOVINAND到smdk6410.h(include/configs)

4.Start.s在程序中nand_boot这里添加movi_boot的代码,如下:

#ifdef CONFIG_NAND_SPL
   #ifdef CONFIG_MOVINAND
       ldr sp, _TEXT_PHY_BASE
       bl movi_bl2_copy
       b after_copy 
after_copy:
       ldr pc,_TEXT_PHY_BASE
   #endif
      ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
      bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
      ldr r0,_nand_boot
      mov pc, r0
_nand_boot: .word nand_boot
#else

......

#endif

编译可能提示movi_bl2_copy没有定义,我是把它声明在include目录下的nand.h里面:

#ifdef CONFIG_MOVINAND
void movi_bl2_copy(void);//__attribute__((noreturn))
#endif

也可以把它放在common.h里面。

OK,编译应该可以通过了,接下来制作u-boot-mmc.nb0用于烧录到SD卡中:

5.u-boot-mmc.nb0的制作方法

 5.1先制作一个512K的u-boot.bin,这个就是用在SDRAM中运行的,因此原材料自然就是主目录下的

u-boot.bin. 可能我们编译好的u-boot.bin并没有512K这么大,那么可以采用“复制”或“拼接”的方法做一个512k的bin:

       cat u-boot.bin >> temp
       cat u-boot.bin >> temp
       cat u-boot.bin >> temp
       cat movi-env-zero-16k.bin >> temp
       split -b 512k temp
       mv xaa u-boot_512k.bin

 5.2 再制作一个8k的u-boot.bin,这个是BL1阶段运行的,所以原料必须是在nand_spl下u-boot_spl-16k.bin

      cat nand_spl/u-boot-spl-16k.bin >> temp
      cat movi-env-zero-16k.bin >> temp
      split -b 8k temp
      mv xaa u-boot_8k.bin

 5.3我们还需要一个16K的"空白"bin,就是上面出现的那个movi-env-zero-16k.bin

 5.4把这几个bin合并起来就是u-boot-mmc.nb0啦:

       cat u-boot_512k.bin >> u-boot_mmc.nb0
       cat movi-env-zero-16k.bin >> u-boot_mmc.nb0
       cat u-boot_8k.bin >> u-boot_mmc.nb0

  嫌上面步骤多手工输入麻烦?那么,就在主目录下建立一个文件,随便命名比:u2mmc

  编辑这个文件内容如下:

#!/bin/sh
rm -rf u-boot_mmc.bin
cat u-boot.bin >> temp
cat u-boot.bin >> temp
cat u-boot.bin >> temp
cat movi-env-zero-16k.bin >> temp
split -b 512k temp
mv xaa u-boot_512k.bin
rm -f temp x*

cat nand_spl/u-boot-spl-16k.bin >> temp
cat movi-env-zero-16k.bin >> temp
split -b 8k temp
mv xaa u-boot_8k.bin
rm -f temp x*

cat u-boot_512k.bin >> u-boot_mmc.bin
cat movi-env-zero-16k.bin >> u-boot_mmc.bin
cat u-boot_8k.bin >> u-boot_mmc.bin

rm -rf u-boot_512k.bin u-boot_8k.bin

这样我们每次

root@ubuntu:/home/my/u-boot-2012.10# make
完后再

root@ubuntu:/home/my/u-boot-2012.10# ./u2mmc

就制作好u-boot_mmc.nb0文件了,把它烧录到SD卡中,然后从SD启动试试看你的U-boot有没有运行起来.

最后说明一下为什么第一个u-boot是512K,中间为何有个16K的“0X00”?其实这2个都是根据系统的配置而定的,也就是说,系统配置不同,这两个地方的大小就会不同。

其中512K是这样来的:

(include/movi.h)#define PART_SIZE_BL        (512 * 1024)

而16K的"0x00"是这个:

(include/configs/smdk6410.h)#define CONFIG_ENV_SIZE        0x4000


 movi_boot.zip   






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