Chinaunix首页 | 论坛 | 博客
  • 博客访问: 567460
  • 博文数量: 169
  • 博客积分: 2656
  • 博客等级: 少校
  • 技术积分: 1685
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-30 13:03
文章分类

全部博文(169)

文章存档

2011年(1)

2010年(135)

2009年(33)

我的朋友

分类: 嵌入式

2010-04-06 00:03:49

这里运用的uboot并非uboot官方揭晓的uboot代码,而是为三星定制的一个uboot版本s3c-u-boot-1.1.6,其代码作者就包含了三星的程序员与denx的员工。这个版本支撑 SD启动,不过默认是nand启动,使它支撑 uboot须要做以下事情:

  1、  虽然支撑 uboot启动,但是uboot代码里不叫SD启动形式,而是叫movinand启动形式,在incluede/configs/smdk6410.h中就有这个选项,所以在这个文件里关上 nand启动,打开movinand启动就能够了:

  //#define CONFIG_BOOT_NOR

  //#define CONFIG_BOOT_NAND       注释nand启动

  #define CONFIG_BOOT_MOVINAND   打开movinand启动

  //#define CONFIG_BOOT_ONENAND

  //#define CONFIG_BOOT_ONENAND_IROM

  #define     CONFIG_NAND

  //#define CONFIG_ONENAND

  #define CONFIG_MOVINAND         打开movinand选项,使uboot支撑 movinand的操作

  2、假如单纯是做上面的改动,仍旧不够的,在运行的时刻会发觉到了必须的时刻 uboot就死掉了,本来这是因为uboot中假设SMDK6410在运用 SD形式的时刻是从CH0启动的,但是手上的这个板子是议决 CH1启动,那么在运行被复制到SRAM中的8K代码时刻没要领 在CH0检测到SD,更没要领 将SD 里的代码复制到SDRAM中。修改要领 是在incluede/

  movi.h中HSMMC_CHANNEL修改为1。

  3、然后假如将上述修改后编译出来的u-boot.bin议决 IROM_Fusing_tools直接烧写到SD中也是没要领 启动的,须要运行以下的命令实行处理:

  cat u-boot.bin >> temp

  cat u-boot.bin >> temp

  split -b 256k temp

  mv xaa u-boot_256k.bin

  split -b 8k u-boot.bin

  mv xaa u-boot_8k.bin

  cat u-boot_256k.bin >> u-boot_mmc.bin

  cat u-boot_8k.bin >> u-boot_mmc.bin

  经历这些处理,实际上是将u-boot.bin内容重复一次后(为了保证达到256K,假如这个bin更小,那么可能须要重复3次、4次,直到超过256K 为止),将前256K制成u-boot_256k.bin,再将前8K制成u-boot_8k.bin,结尾将u-boot_256k.bin +u-boot_8k.bin合并成一个256K+8K大小的文件u-boot_mmc.bin,这个文件前256K就是u-boot_256k.bin 而后8K就是u-boot_8k.bin。把这个u-boot_mmc.bin议决 IROM_Fusing_tools烧写到SD卡就能够成功启动系统了。

 

为什么要做这样的处理这个bin文件呢?下面议决剖析 IROM_Fusing_tools、uboot的源码来揭示其中的由来。

  从网上能够下载到IROM_Fusing_tools的源码,在按下这个软件的start控件后,先是读取这个SD卡的第一个扇区,也就是这个硬盘的MBR 扇区,判断是不是FAT32格式的硬盘(这也是为什么用来做启动的SD必须格式化为FAT32格式),接着获取总的扇区数目TOTAl_SECOTR,并将所要烧写的bin文件烧写到硬盘的这个扇区:TOTAL_SECTOR – 2 - SIZE_OF_IMAGE/512。其中TOTAl_SECTOR是这个硬盘总的扇区数目;SIZE_OF_IMAGE/512是这个bin文件将要占据的扇区数(这里是以512为扇区大小的,因此对于扇区更大的SD卡也就没要领 运用了,而现在的大容量SD都可能运用了2K甚至4K的扇区,除非修改这个程序,并同步地在uboot中修改程序);至于2则是保存的2个扇区,至于为什么要保存这2个扇区,须要剖析 uboot的源码情况,下面将做进一步的阐述。

  在SD启动形式下,S3C6410内部的IROM程序BL0最先运行,并将SD中的结尾 18个扇区开始的16个扇区内容复制到片内的8K SRAM,也就是SteppingStone,接着跳转到这块SRAM的开始地址开始运行,这8K的代码实际上就是上面u-boot_mmc.bin这个文件的结尾 8K,也是u-boot.bin的最开始8K代码,这段代码也叫BL1。从BL0跳转到BL1的时刻 uboot也就接管了CPU。

  Uboot的入口在start.S这个文件,cpu/s3c64x0/start.S中有这样一段代码:

  #ifdef CONFIG_BOOT_MOVINAND

  ldr   sp, _TEXT_PHY_BASE

  bl     movi_bl2_copy

  b     after_copy

  #endif

  这段代码是实现SD启动的主要 。到了这里后就执行movi_bl2_copy,这个函数负责将SD内的uboot完整地复制到SDRAM,这时刻完整的uboot也叫BL2,而这个函数实际上是调用了以下函数:

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

  HSMMC_CHANNEL这是SD/MMC通道号,手上板子运用的是CH1,而默认是CH0,所以须要对这个实行修改。

  MOVI_BL2_POS 是须要 copy 的数据位于SD的起始扇区,其计算要领 是这样的,先得到这个SD的总扇区数TOTAL,再减去256K的BL2和8K的BL1所占的扇区数,结尾减去0.5K 的eFuse和0.5K的保存区所占的扇区数,而这里还解释SD的扇区为512B。从这里能够看到和IROM_Fusing_tools对SD卡的处理是完全对应的。这里还有一个疑问,总扇区数TOTAL是如何 得到的?从程序来看是从(TCM_BASE - 0x4)这个地址读取到的,至于TOTAL是如何 被放到这里的就只好从BL0的代码找答案了。

  MOVI_BL2_BLKCNT是须要复制的扇区数目,这里就是解释为256K,这也是为什么必须把u-boot.bin转换成256K的文件。

 

BL2_BASE是目标地址,也就是SDRAM中的地址。这里解释为0x57E00000,就是128M 的SDRAM的结尾 2M,因为到这里为止MMU尚未打开,因此这里运用的是物理地址。

  MOVI_INIT_REQUIRED这个参数的意义是什么暂时没有任何资料表明。

  而CopyMovitoMem这个函数的解释是这样的:

  #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,至于这个地址放的是什么,也没资料表明。

  当复制完BL2后便会跳转到BL2的start_armboot这个C语言函数中运行了,此后的运行流程就不须要再剖析了。

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