使uboot支撑 S3C6410的SD启动

发布者:真瓷堂最新更新时间:2016-04-14 来源: eefocus关键字:uboot  S3C6410  SD启动 手机看文章 扫描二维码
随时随地手机看文章
这里运用 的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语言函数中运行了,此后的运行流程 就不须要 再剖析了。

 

关键字:uboot  S3C6410  SD启动 引用地址:使uboot支撑 S3C6410的SD启动

上一篇:arm 2440编译空间安排
下一篇:arm 2440中nandflash特定存储单元写入一个字节

推荐阅读最新更新时间:2024-03-16 14:50

采用JLink+ADS1.2调试uboot的方法
刚开始想通过Nor Flash中的supervivi+DNW的“Download & Run 功能”将uboot.bin下到SDRAM进行调试,但是由于笔记本已经被装成ubuntu + Virtualbox(Windows XP),将supervivi阶段的USB下载设备分配进Virtualbox(Windows XP)后提示“不能分配 USB设备 System MCU SEC S3C2410X Test B/D 到虚拟电脑 Windows XP Workstation.Failed to create a proxy device for the USB device. (Error: VERR_READ_ERROR).”,而
[单片机]
采用JLink+ADS1.2调试<font color='red'>uboot</font>的方法
OK6410光盘里的uboot不能用TFTP下载文件?
无论用ping命令还是tftp命令,都显示 CS8900 Ethernet chip not found?! 看了uboot1.1.6/include/configs/smdk6410.h,里面确实是配置为网卡使用CS8900,什么时候发布个配置为DM9000的uboot源码啊?或者发个补丁也行 此问题已解决 方法很简单,给用飞凌S3C6410的朋友一个参考。   a.用\u-boot-1.1.6-TQ6410\drivers\目录下的dm9000x.c和dm9000x.h替换OK6410的u-boot里的同名文件   b.用\u-boot-1.1.6-TQ6410\include\configs\tq6410.h里配置网卡的几
[单片机]
SAM-BA烧写Bootstrap1.16和Uboot1.3.4方法
SAM-BA烧写Bootstrap1.16和Uboot1.3.4方法,MCU芯片为at91sam9261,Nandflash为K9F1G08 系统上电,然后通过串口连上电脑,打开SAM-BA如果硬件没有问题就可以连上了,然后烧写Bootstrap,在烧写之前先擦除一下,就是在Scripts选项选择Nandflash erase all然后点Execute,就可以看到Nandflash的信息。然后选择Send Boot File点Execute选择Bootstrap.bin文件进行烧写。 烧写Uboot.bin文件方法为:在Send File Name中导入文件,在Address中填写烧写地址为0x20000然后Send F
[单片机]
S3C6410核心初始化
一:异常向量表 异常定义:因为内部或者外部一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事件。当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址去执行异常处理程序,而这个固定的地址,就称之为异常向量。以下为七个异常向量及处理函数跳转关系组成的表。 在Data Abort和IRQ之间有一段地址没有用上,在初始化的时候需要补上一段_not_used ,不然的话会报错,在发生异常的时候,程序会跳转到undefined_instruction: nop这段去执行,由于现在还不需要操作这些异常向量,所以在后面只加上nop。具体以后还会进一步学到 .text .global _start _st
[单片机]
<font color='red'>S3C6410</font>核心初始化
s3c2440裸机-内存控制器(三-3、norflash编程之uboot中操作norflash)
前提: norflash初始化正常,能够正常从nor上执行。 cpu总是从0地址读取指令执行程序。当cpu设置成nor启动时,0地址对应nor。cpu从nand启动时,0地址对应sram。 1.读取norFlash 我们将板子设为nor启动,那么0地址对应nor,我们先将uboot烧写到nor中。我们先看下这款NorFlash的手册,找到操作flash的命令表: 下面简单的举一些例子: 1)复位(reset): 往任何一个地址写入F0即可。 2)读ID: 很多的Nor Flash可以配置成位宽16bit(Word),位宽8bit(Byte),我们这款norflash数据位宽为16bit。下面我们按照nor手册上的命令表
[单片机]
s3c2440裸机-内存控制器(三-3、norflash编程之<font color='red'>uboot</font>中操作norflash)
支持S3C6410处理器SD启动模式的U-Boot-2011.06移植修改方案
通用Bootloader(Universal Bootloader,U-Boot)是系统上电后执行的第一段代码,其作用主要包括初始化硬件环境以及加载执行操作系统内核。在进行系统安装时,U-Boot通常需要使用专用工具烧写到FLASH中,内核及文件系统则通过U-Boot命令进行烧写,该过程操作繁琐,并且容易出错,不适宜系统的大量安装。 S3C6410是三星公司生产的一款基于ARM11架构的通用嵌入式处理器,其启动方式除了传统的Flash启动模式外,还支持从SD 卡中启动系统。本文基于S3C6410处理器,分析了从SD卡启动系统的原理,并对U-Boot源码进行修改以支持该启动方式,在此基础上进一步扩展了U-Boot的功能,使其支持
[单片机]
支持<font color='red'>S3C6410</font>处理器<font color='red'>SD</font>卡<font color='red'>启动</font>模式的U-Boot-2011.06移植修改方案
BootLoader启动引导方式分析(sd卡引导)
引言   BootLoader通常称为“系统的引导加载程序”,是系统加电或复位后执行的第一段程序代码 。这段程序的主要任务是,实现硬件设备初 始化并建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。通 常,BootLoader包含两种不同的加载和启动引导方式,即启动加载方式和下载方式。   ① 启动加载(boot loading)方式。这种引导方式也称为“自主(autonomous)引导方式”,也即BootLoader从目标机的某个固态存储设备上将操作系统 加载到RAM中并引导运行,整个过程并没有用户的介入。这种引导方式是BootLoader的正常工作模式下普
[单片机]
BootLoader<font color='red'>启动</font>引导方式分析(<font color='red'>sd</font>卡引导)
ARM Linux (S3C6410架构/2.6.35内核)的内存映射(四)
set_pte_ext()的作用是根据Linux给出的Linux版本页表项来填充Arm硬件版本的页表项。 对于s3c6410,set_pte_ext()函数由汇编宏armv6_set_pte_ext来实现,定义在proc-macros.S文件中。 进入函数时,参数分别为: r0: pte的地址,这里的pte是二级页表Linux版本中对应的页表项。 r1: Linux版二级页表项的内容。 r2: 0。 .macro armv6_set_pte_ext pfx str r1, , #-2048 @ linux version bic r3, r1, #0x000003fc bic r3, r3, #PTE_TYPE_
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved