热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WINCE6.0+S3C6410基于SD卡启动

********************************LoongEmbedded********************************作者:LoongEmbedded(kand
 

********************************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文件组成

 

 

 

 


推荐阅读
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了一个程序,可以输出1000内能被3整除且个位数为6的所有整数。程序使用了循环和条件判断语句来筛选符合条件的整数,并将其输出。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
author-avatar
000000
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有