您的位置 首页 电子

使uboot支撑 S3C6410的SD发动

这里运用的uboot并非uboot官方揭晓的uboot代码,而是为三星定制的一个uboot版本s3c-u-boot-116,其代码作者就包含了三星的程序员与denx

这儿运用 的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言语函数中运转了,尔后的运转流程 就不需要 再分析了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/dianzi/262901.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部