2019独角兽企业重金招聘Python工程师标准>>>

6410的手册上说,可以从nandflash、onenand、SD卡启动,没有专用的烧录工具的情况下,只有SD卡启动是可以考虑 的。手册上看到,SD卡启动,实际上是先执行片内IROM中的一段程序,该程序从SD卡中读取代码,写到stepping stone 中,stepping stone是位于0x0c000000、size为8K的片内内存,代码写入stepping stone后,跳到 0x0c000000处继续执行程序。那么,要实现从SD卡启动,就必须弄清楚:  
1、8K的代码保存在SD卡的什么位置。  
2、代码以什么格式存储。

把编译好的代码写入到最后芯片末尾偏移-9216字节处,插入SD卡座,把开关拨到SD0卡启动的位置,上电

这里使用的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 是需要拷贝的数据位于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语言函数中运行了,此后的运行

过程就不需要再分析了

转载于:https://my.oschina.net/u/174242/blog/75288

S3C6410 SD卡启动uboot分析(详细)相关推荐

  1. 【TINY4412】U-BOOT移植笔记:(9)SD卡启动U-BOOT

    [TINY4412]U-BOOT移植笔记:(9)SD卡启动U-BOOT 宿主机 : 虚拟机 Ubuntu 16.04 LTS / X64 目标板[底板]: Tiny4412SDK - 1506 目标板 ...

  2. OK6410开发板Uboot学习总结----(三)从SD卡启动分析

    前面讲了Uboot启动流程和如何修改调试串口,相信大家对Uboot已经有了初步的了解,今天来进行更深一点的分析.上篇文章 OK6410开发板Uboot学习总结----(二)修改调试打印串口 遗留一个问 ...

  3. S3C6410开发全纪录(一)《还原SD卡启动的真相》

    前章我们也大致分析了SD卡的启动过程,在具体进行问题的定位及解决的过程中,发现还是有很多不明确的地方,网上的文章也多是人云亦云让我们来一步一步搞清楚S3C6410 SD卡启动的步骤及过程(我这里的开发 ...

  4. 嵌入式知识-ARM裸机-学习笔记(9):SD卡启动详解(S5PV210)

    嵌入式知识-ARM裸机-学习笔记(9):SD卡启动详解(S5PV210) 一.SD卡介绍 1. SD卡背景知识和特点 SD卡.MMC卡.MicroSD.TF卡:这些卡其实内部就是Flash存储颗粒,比 ...

  5. Exynos4412——SD卡启动

    实现Tiny4412从SD卡的启动内核与根文件系统. 前面启动开发板时,需要从SD卡启动Uboot,然后从DNW下载内核和根文件系统到RAM,或者NFS挂载根文件系统. Uboot应该是支持SD卡的, ...

  6. 第十一天: SD卡原理分析及SD卡启动详解

    主流的外存设备 内存和外存的区别: 一般是把这种(random access memory,随机访问存储器,特点是任意字节读写,掉电丢失)叫内存,把ROM(read only memory,只读存储器 ...

  7. WINCE6.0+S3C6410基于SD卡启动

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  8. imx53 uboot tftp nfs启动, linux tftp,复制gdb, linux host 创建sd卡启动,ddr stress tester

    生成uImage,在ltib编译的目录 rootfs/boot下:sudo mkimage -A arm -O linux -T kernel -C none -a 0x70008000 -e 0x7 ...

  9. 【迅为iMX6Q】开发板 u-boot 2020.04 SD卡 启动

    前言 iMX6Q 支持多种启动方式,如 emmc启动.SD 卡启动等,这里简单的记录一下 SD卡启动的流程 下载u-boot 使用 NXP 官方提供的 uboot-imx,代码地址为: https:/ ...

  10. IMX6 EMMC、SD卡启动引脚配置及uboot修改为SD2启动

    开发环境 平台:imx6dl 内核:linux-4.1.15 uboot:2014 问题描述 在IMX6中SD卡启动通常都是用SD3系列的引脚去作为SD卡槽的引脚,如下图. 总有些意外,比如这次的这块 ...

最新文章

  1. 使用 Eigen 库写第一个程序
  2. Tomcat WebappClassLoader 类加载机制源码分析
  3. dojo中的dojo/on
  4. ListView执行notifyDatasetChanged无数据显示,getView未执行
  5. 查询MySQL字段注释的 5 种方法!
  6. 使用vue开发一个双向展开的卷轴组件
  7. 以太局域网(以太网)
  8. 从今天开始写python编程
  9. 系统架构设计师 - ESB 企业服务总线
  10. 昂科自动烧录器对英飞凌IR38164M系列芯片烧录,效果显著
  11. 富媒体广告投放的一些经验
  12. php微信支付宝第三方接口开发平台,帝国CMS第三方个人支付接口微信支付宝免签约即时到账api_帝国网站管理系统插件...
  13. 未曾有光照耀的地方,皆是正雅齿科下一个战场
  14. stop word理解及超全的停用词表
  15. 设计师必备!免费下载 PSD 素材的32个网站
  16. backgroundLinearGradient线性渐变制作折角效果
  17. STM32 UART DMA实现未知数据长度接收(转自amoBBs)
  18. /var空间满了,简单处理一下
  19. 快速学习时代的三大高效学习技能
  20. 菜鸟学习nodejs--安装nodejs

热门文章

  1. 设计模式(十六)迭代器模式 Iterator
  2. [COCI2009]Dvapravca
  3. C程序设计 4顺序程序设计
  4. C语言的面向对象设计之 X264,FFMPEG 架构探讨
  5. HTML中构建自动伸缩的表格Table
  6. 大型网站架构演变和知识体系【转载】
  7. 文本处理三剑客,正则表达式等
  8. kafka0.8消费者实例 1
  9. Java-idea-eclipse-快捷键【mac,win】
  10. Oracle EBS-SQL (OM-2):检查OM常用表