WINCE6.0+S3C6410基于SD卡启动
********************************LoongEmbedded********************************
作者:LoongEmbedded(kandi)
时间:2011.11.02
类别:WINCE驱动开发
********************************LoongEmbedded********************************
1. 基于IROM SD/MMC启动方式的原理
我们知道S3C6410支持IROM启动(internal ROM Booting),IROM启动是指从OneNAND、SD/MMC卡和NAND Flash存储设备启动的方式,见下图:
图1 IROM启动流程
上图是系统基于IROM方式启动的工作流程图,下面简要描述此流程主要的工作:
1) 处理器上电后,当OM[4:1]=1111时,执行IROM中的启动代码(boot codes),这个启动代码称为BL0,它具体会做一些初始化的工作。
2) 根据GPN[15:13]管脚的设置来选择启动的设备,根据图2,如果是要从SD/MMC的通道0中的SD卡启动,那么GPN[15:13]=000,这样BL0就会通过SD控制器从SD卡中读出BL1中的前4KB的程序到Stepping Stone中,然后再Stepping Stone中执行BL1的代码。
3) BL1可以初始化系统时钟,UART,SDRAM等设备,然后拷贝Bootloader2(BL2)到SDRAM的地址内存处。
4) 然后跳转到SDRAM中的BL2继续运行,BL2支持更强大的功能,并且进一步初始化硬件和把WINCE内核镜像拷贝到SDRAM的(0x80100000)地址内存处。
5) 最后再SDRAM种开始执行NK。
图2 S3C6410支持的启动方式
这里有个不太确定的问题, IROM_ApplicationNote文档中提到说IROM boot code(BL0)可以装载4KB的bootloader code到stepping stone(8KB)中,但是实际是BL0可以装载8KB的stepldr_IROM_SD.nb0到stepping stone,不知道大家如何理解这个矛盾,还望知道的朋友告知。
2. 基于SD卡启动的实现概述
S3C6410支持从SD卡启动,可通过IROM_Fusing_Tool.exe应用软件将IROM_SD_EBOOT.nb0烧录到SD卡中,然后从SD卡启动的时候,通过启动的IROM_SD_EBOOT.nb0来烧录新的stepldr、eboot和OS到NANDFLASH中,这样后面就可以从NANDFLASH启动了。
通过IROM Fusing tool烧录IROM_SD_EBOOT.nb0文件到SD card后,在SD卡中是看不到文件的,因为它不是通过FAT写文件的方式,而是直接写入SD card扇区,这样S3C6410从SD card启动时,直接通过SDIO控制器读扇区,其中IROM_SD_EBOOT.nb0由stepldr_IROM_SD.nb0(相当于BL2)和eboot_sdfuser.nb0(相当于BL1)组成,BL1和BL2的意思是引导加载的第一阶段和第二阶段,下图是SD/MMC设备引导块的分配。
图3 SD/MMC设备启动块分配图
由上图可知SD卡的最后一个块(block,这里也就是sector,每个sector为512Bytes)因为预留下来,所以我们不能使用,倒数第二个block指定用于SD卡的标签(signature),从[LAST-18]到[LAST-3]这16块用于保存BL1,根据上图并结合BL2的大小可以判断BL2在SD卡中的位置。
3. 烧到IROM_SD_EBOOT.nb0烧录到SD卡
根据上面的描述,我们知道要把IROM_SD_EBOOT.nb0烧录到SD卡中的具体位置,下面先来看IROM Fusing tool.exe的应用界面
图4 IROM_Fusing_tool.exe的界面
在上图选择START的时候,我们来看IROM_Fusing_tool.exe源代码的主要实现部分,下面看第一部分:
图5 IROM_Fusing_tool.exe写动作主要实现部分
为什么从第0x52到0x56这5字节的内容是文件系统的标识符呢?我们通过winhex工具来查看SD卡的启动区的内容,这些内容是对SD卡进行格式化的时候写进SD卡中的,如下:
图6 winhex打开1GB的SD卡
下面继续来看第二部分:
图7 IROM_Fusing_tool.exe写动作主要实现部分
SDHC设备引导块的分配如下:
图8 SDHC设备引导块的分配
4. 启动时从SD卡中读取IROM_SD_EBOOT.nb0并
S3C6410启动后,基于IROM+SD的启动方式,CPU先执行BL0的启动代码,其中BL0在启动过程中会通过SD卡控制器把BL1(也就是stepldr_IROM_SD.nb0,大小为8KB)的内容拷贝到stepping stone中),然后在stepping stone中执行BL1的代码,BL1在执行过程中会调用main函数,如下:
图9 BL1的main函数
到此BL2的内容已经复制到SDRAM指定的内存地址处,并且开始执行了,然后可以通过IROM_SD_EBOOT.nb0的下载功能手动或者自动下载block0、eboot.bin或是NK.bin到NANDFLASH中了。
4.1 保存SD/MMC卡信息的全局变量
在使用SD/MMC卡作为启动设备的时候,SD/MMC卡的信息必须要保存在指定的区域,见下图:
图10 保存SD/MMC卡的信息的地址及用途定义
4.2 设备复制函数(Device Copy Function)
S3C6410内部包含了引导设备的块赋值函数的ROM代码,所以开发者不需要实现设备复制函数,这些内部的函数可以复制任何设备的数据到SDRAM中,使用者在内部的ROM代码执行之后可以使用这些函数,因为这些函数是在BL0阶段初始化的。下面是这些设备复制函数的描述表
图11 设备赋值函数说明
4.3 IROM_SD_EBOOT.nb0文件的组成及大小
下图是IROM_SD_EBOOT.nb0文件的组成文件及各个文件的大小,有助于大家的理解
图12 IROM_SD_EBOOT.nb0文件组成
WINCE6.0+S3C6410基于SD卡启动相关推荐
- 关于s3c6410的SD卡启动
要研究裸机程序的编写,必须要有一个"全裸"的环境.友善提供的superboot可以提供执行用户自定义程序的能力,但其实这样运行的程序环境还是依赖于superboot的, 那 ...
- OK6410开发板Uboot学习总结----(三)从SD卡启动分析
前面讲了Uboot启动流程和如何修改调试串口,相信大家对Uboot已经有了初步的了解,今天来进行更深一点的分析.上篇文章 OK6410开发板Uboot学习总结----(二)修改调试打印串口 遗留一个问 ...
- 基于S3C2440丛SD卡启动WinCE(或其它程序)的实现
[楼主位] liuweiele Liuwei 积分:687 派别: 等级:------ 来自: 系统上电后,如果发现SD卡中有boot.ini文件,便按boot.ini文件中的指定参数运行,否则继续启 ...
- S3C6410开发全纪录(一)《还原SD卡启动的真相》
前章我们也大致分析了SD卡的启动过程,在具体进行问题的定位及解决的过程中,发现还是有很多不明确的地方,网上的文章也多是人云亦云让我们来一步一步搞清楚S3C6410 SD卡启动的步骤及过程(我这里的开发 ...
- 【迅为iMX6Q】开发板 u-boot 2020.04 SD卡 启动
前言 iMX6Q 支持多种启动方式,如 emmc启动.SD 卡启动等,这里简单的记录一下 SD卡启动的流程 下载u-boot 使用 NXP 官方提供的 uboot-imx,代码地址为: https:/ ...
- imx6 android SD卡启动
工作中需要将imx6的android系统从SD卡启动,所以就分析了MfgTool中的脚本,分析android的分区情况,并尝试自己操作,竟然成功了,记录于此. 参考文档 http://www.kanc ...
- S5PV210体系结构与接口09:SD卡启动详解
目录 1. MMC技术演进 1.1 NandFlash & NorFlash芯片 1.2 MMC卡 & SD卡 & MicroSD卡(TF卡) 1.2.1 代际关系 1.2.2 ...
- imx533 配置 制作SD卡启动文件系统
制作SD卡启动文件系统 [1]对SD卡分区 按飞思卡尔文档列出的分区表用fdisk分区: Partition Type/Index Name Start Offset Size File System ...
- 嵌入式Linux系统镜像制作(基于SD卡)
文章目录 目的 原理 环境准备 系统镜像制作 从现有SD卡备份 从空白文件开始制作 系统镜像使用 其它补充 总结 目的 嵌入式Linux在开发过程中对于软件方面通常是 bootloader.linux ...
最新文章
- 解决冲突的拉链法探测的ASL
- 智源-计算所虚假新闻检测大赛 | 探秘假新闻中的视觉信息
- IntelliJ IDEA安装
- 转:什么是 Base64编码
- C++ Map简单介绍 ,比如添加元素、删除元素和打印元素
- 12产品经理要懂的-人性满足思维
- LNMP一键安装包 PHP自动升级脚本
- java swing 等待框_java – 让用户使用Swing等待
- Linux系统瓶颈排查
- 9、网络详解 学习笔记
- 【系列】关于直播,所有的技术细节都在这里了
- mysql navicat for mysql常用快捷键
- 将c语言编译成verilog,是否可以将System Verilog函数编译为C或C?
- 模电实验——实验四 RC正弦波振荡器
- SXF-2021软测实习生笔试
- Unity Shader学习(五)鼠标移动方块
- 出现Head https://registry-1.docker.io/v2/library/node/manifests/14-alpine的解决方法
- “Apache官网打不开”怎么办?
- kong插件开发-完全版
- C语言 printf() 函数,总结笔记记录
热门文章
- CAS存在的问题以及解决方案
- 073_JS JSON
- 织梦配置多个mysql_一台机器,多个mysqld服务
- appium适用场景
- unity两个项目合并 同名_从实际项目升级中关于 Unity SRP 的一些评测
- OCP12C题库,62数据库备份与恢复(admin,install and upgrade accelerated, backup and recovery workshop -62)(新增)
- Pytorch 怎么构建自己的数据集。怎么重写官方数据集。
- Day3-springmvc注解的方式进行跳转的配置
- wpf 放大缩小界面_调整电脑屏幕文本文字显示大小,系统设置放大缩小DPI图文教程...
- update 两个表关联_拉链表(二)