s3c2416启动方式

标题:ARM S3C2416 启动过程分析 详解 (转)

 
  最近在使用三星S3C2416这个处理器,需要在EBOOT上实现SD卡文件系统,并从SD卡中烧写wince系统,与S3C2416的从SD卡启动不同。我用的BSP是SMDK2416_WinCE50_PM_REL_0.01_080611的,Bootloader文件夹中包含了三个文件夹:Eboot.Whimory、NBL1.LSB、NBL2,先前不太明白这三个Boot到底有什么用,于是从网上找到了下面一篇文件,是以S3C6410为例作的介绍。
 
    目前的ARM处理器都支持多种启动模式,S3C6410和以前的Samsung的ARM处理器一样,通过外部管脚OM[4:0]的拉高拉低来决定是从哪个存储设备上启动。我认为S3C6410的User Manual并没有说的很清楚,所以我在最开始使用的时候,也对其启动模式有一些误解,下面就我个人的理解,介绍一下S3C6410的启动。
    先读一下S3C6410 User Manual的第3章 System Controller,在123页列了一张表,如图:
   

 
这章表列出了S3C6410所支持的几种启动模式。首先介绍一下和启动模式相关的硬件管脚:
OM[4:0]:选择启动设备及时钟源。OM[0]为0选择XXTlpll,为1选择XEXTCLK。
 
 GPN[15:13]:用于识别所支持的Nandflash的类型,包括Page的类型和地址周期。
 XSELNAND:选择Nand启动或者是OneNand启动。0为OneNand,1为Nand。
 
 
    从表中可以看出,S3C6410好像并不支持Nandflash启动,因为Boot Device中没有Nandflash设备。当OM[4:0]为0000x/0001x/0010x/0011x的时候,Boot Device是Reserved,我想这里是Samsung在6410中有意要隐瞒什么。如果你用过S3C6400,你应该知道在S3C6400 User Manual中也有这么一张表,描述了s3c6400的启动模式,具体S3C6400的启动模式也是在第3章 System Controller,在第107页的表,如图:
 
我想和S3C6410的表对照一下就会发现,两个处理器的启动模式是兼容的,我认为S3C6410应该兼容S3C6400的启动模式,只不过Samsung在S3C6410 User Manual中隐藏了S3C6400中所支持Nandflash启动模式,目的可能是Samsung不希望在S3C6410中使用Nandflash启动,而要推崇IROM的启动模式。个人理解啊!
 
 
 
下面来总结一下S3C6410所支持的启动模式:
 
1. NORFlash启动
 
通过Nor Flash启动,此时OM[4:1]为0100或0101,对应8bit和16bit。
 
 
 
2. NandFlash启动
 
虽然在S3C6410 User Manual中没有提到,但是也是支持的,从S3C6400 User Manual可以找到。OM[4:1]四个硬件管脚决定了Nandflash启动,以及支持的Nandflash的类型,包括大Page和小Page,地址周期为3,4,5。当然,XSELNAND管脚也要为1。
 
 
 
3. OneNAND启动
 
首先XSELNAND管脚为0,其次OM[4:1]为0110,为OneNand启动模式。
 
 
 
4. MODEM启动
 
当OM[4:1]为0111的时候,为MODEM启动。S3C6410通过MODEM接口下载boot代码到内部RAM中,然后进行引导。
 
 
 
5. IROM启动
 
当OM[4:1]为1111的时候,从Internal ROM中启动,此时GPN[15:13]用于识别设备的类型。这种模式以前没见过,这里具体介绍一下。
 
IROM模式可以支持MoviNand,SD/MMC,iNand,OneNand和Nand等。关于IROM的引导,具体过程如图:
 
1. 处理器上电后,当OM[4:1]=1111时,运行iROM中的程序,这个程序被称为Bootloader0(BL0),它会做一些初始化的工作。
 
2. 然后根据GPN[15:13]的管脚设置,选择从相应的设备(SD/MMC/OneNand/Nand)中的指定区域读取4KB的程序到SteppingStone中运行,这段代码被称为Bootloader1(BL1)。
 
3. BL1可以初始化系统时钟,UART,SDRAM等设备,然后拷贝Bootloader2(BL2)到SDRAM中。
 
4. 跳转到SDRAM中的BL2,继续运行,BL2可以支持更强大的功能,可以将OS加载到SDRAM中,然后运行OS。
 
 
 
整个过程中,IROM是最先被运行的,它会首先做一些初始化,具体IROM的流程如下:
 
1. 禁用Watch-dog
 
2. 初始化TCM
 
3. 初始化设备拷贝函数,用于拷贝BL1到SteppingStone中
 
4. 初始化栈区域
 
5. 初始化PLL
 
6. 初始化指令Cache
 
7. 初始化堆区域
 
8. 拷贝BL1到SteppingStone中
 
9. 验证BL1
 
10. 跳转到SteppingStone中运行
 
 
 
还是看一下流程图吧,理解起来会更直观一些,IROM启动流程如图:



 


收集资料1:

最近在看裸机编程部分,一般是用SD卡测试裸机程序,看了几个程序,有汇编的,有C的,发现其中关于看门狗和堆栈(C)的问题各有说法,有的说不需要手动初始化堆栈和看门狗,有人说需要。通过查看文档及自己测试,我觉得是不需要手动初始化的。 文档 。...\Helper2416\docs\Samsung-S3C2416 Documents\S3C2450_51_16_IROM_ApplicationNote.PDF


收集资料2:使用IROM_Fusing_Tool对sd卡写入的数据怎么擦除

在使用sd烧写Linux系统到板载NANDFlash的时候显示如下图:

                                                    ,接下来插入到开发板上,选择sd卡启动,烧写成功。在上面的图中,我们可以看到sd卡总共有3805184个扇区,其中u-boou-movi.bin写在扇区3804110至扇区3805181中,kernel写在扇区3795918至扇区3799674中,root-qtopia.img和u-boot.bin for nand分别在扇区3600000至3717941和扇区3800000至3800406中。现在如果我想擦除IROM_Fusing_Tool写在上面这些扇区中的数据该怎么做呢?我试了格式化没用,我还往sd卡中复制文件填满sd卡,发现还是没能擦除上面这些扇区内的数据,因为插入到开发板,选择sd卡启动,还是能启动的。

老大回答:这个可以不用去关心,软件是直接写物理扇区的,如果你的SD卡被写满了,自然就被擦除了


我是看到这个图,想试试这个。把我的bin文件按照这个规则写入sd卡,然后设置成sd卡启动,目前我还没有成功,我觉得主要问题是缺少sd卡的扇区编辑工具。

老大回答:

winhex可以自由编辑

收集3:

【朱兆祺带你学嵌入式】第二章第十节 IROM启动的概念

S3C6410由三星公司生产的ARM11应用处理器芯片,广泛用于移动电话和通用应用。市场上,很多公司纷纷推出自己的S3C6410学习开发板,风靡一时。处理器片内没有供用户存储数据的Flash,用户必须外接存储器存储数据。由表2. 1可知开发板唯一带有的存储介质是NAND Flash,如果不经过特殊方式,无法直接将U-Boot镜像文件烧写到里面。由于公司间的竞争关系,防止竞争对手的抄袭,很多开发板相关的代码并不开源。以本节涉及的内容为例,被开发板生产商誉为核心技术,商业机密。这对于以研究学习为目的的购买者来说,无疑是巨大的阻碍。本节内容充分结合S3C6410支持SD卡启动的特性,全面阐述利用SD卡烧写、运行嵌入式系统的原理。

    在生活中,如果不合理操作计算机,计算机经常会出现无法从硬盘中启动的情况。这时候可以通过设置BIOS选择从其它盘启动,比如启动CD、U盘等。在使用它们启动系统之前,必须将其制作成启动盘,把一个精简的操作系统写入其中。电脑启动时就会识别启动盘,加载存储设备特定扇区的数据至内存,从而启动系统,进行一些修复工作。

同样,如图2. 5所示,S3C6410有多种启动模式,分别由XSELNAND,OM[4:O]管脚控制。把OM[4:1]管脚外部电平设置为为llll时,选择IROM启动。GPN[15:13]管脚的电平状态用来选择IROM启动时的外部存储设备,如SD/MMC(CH0和CH1)、OneNAND和NAND(数据大小不同的页)。
三星公司在生产S3C6410芯片时,在地址为0x8000_0000的IROM 区域固化了一段大小为32KB的代码,称作BL0。处理器上电后,PC指向运行0x8000_0000,运行BL0,这种启动方式称作IROM启动。启动的大体流程如下:
1)        运行BL0进行一些初始化工作,如关闭看门狗,初始化TCM、系统时钟、堆栈等
2)        然后根据GPN[15:13]管脚的电平状态,判断选定的存储设备的类型,初始化存储设备和它对应的控制器。从存储设备(SD/MMC/OneNand/Nand)的特定区域读取8KB的程序到SteppingStone中运行,被拷贝的这段代码称Bootloader1(BL1)。
3)        BL1是用户自行编写的代码,必须简短精悍,运行与位置无关。BL1一般简单地重新初始化系统,开辟更广阔的内存空间,并将更加完善的Bootloader2(BL2)拷贝到SDRAM中。
4)        
类型
地址
用途
大小
IRAM
0x0C00_0000-0x0C00_1FFF
Stepping Stone (BL1)
8K
D-TCM0
0x0C00_2000-0x0C00_21FF0x0C00_2200-0x0C00_2FFF0x0C00_3000-0x0C00_3FFF
密钥(512B)保留(3.5k)堆区,保存全局变量(4K)
8K
D-TCM1
0x0C00_4000-0x0C00_40180x0C00_4019-0x0C00_5FFF
存储设备拷贝函数指针(24B)栈区
8K
表2. 2IROM启动内存映射地址


跳转到SDRAM中的BL2,继续运行,BL2功能更加强大,把存储设备中的内核和文件系统加载到SDRAM中,从而启动系统。
S3C6410在0x0C00_0000至0x0C005FFF的地址空间内定义了三类内存区域,IRAM、D-TCM0和D-TCM1。IRAM用于加载运行BL1。当选定SD/MMC作为IROM启动的存储设备时,D-TCM0保存了SD/MMC设备被IROM代码检测到的一些信息,如当前使用的SD/MMC控制器的基地址、SD/MMC卡的类别、设备的扇区总数等。它们被定义为三个全局变量存放,其中扇区总数的存放地址为0x0C00_3FFC。
表2. 3设备拷贝函数
函数指针地址
函数参数及返回值
描述
0x0C00_4000
int NF8_ReadPage(uint32 blcok,uint32 page, uint8 *buffer)blcok:块起始地址page:需要拷贝的页数buffer:目标地址返回值:0 失败        1 成功
支持512字节每页8位硬件ECC校验
0x0C00_4004
int NF8_ReadPage_Adv(uint32 blcok,uint32 page, uint8 *buffer)blcok:块起始地址page:需要拷贝的页数buffer:目标地址返回值:0 失败        1 成功
支持2K每页支持4K每页8位硬件ECC校验
0x0C00_4008
bool CopyMMCtoMem(int channel, uint32StartBlkAddress,uint16 blockSize, uint32*memoryPtr, bool with_init)channel:无效,取决于GPN15, GPN14 and GPN13管脚StartBlkAddress:扇区起始地址blockSize:需要拷贝的扇区数memoryPtr:目标地址with_init: :是否需要重新初始化返回值:0 失败        1成功
支持SD/MMC卡支持SDHC卡
0x0C00_400C
boolONENAND_ReadPage(uint32 Controller,uint32 uBlkAddr , uint8 uPageAddr, uint32* aData)Controller: OneNAND控制器编号,固定为0uBlkAddr:块地址uPageAddr:页地址aData:目标地址返回值:0 失败        1 成功
-
0x0C00_4010
bool ONENAND_ReadPage_4burst(uint32 Controller,uint32 uBlkAddr , uint8 uPageAddr, uint32* aData)Controller: OneNAND控制器编号,固定为0uBlkAddr:块地址uPageAddr:页地址aData:目标地址返回值:0 失败        1 成功
-
0x0C00_4014
bool ONENAND_ReadPage_8burst(uint32 Controller,uint32 uBlkAddr , uint8 uPageAddr, uint32* aData)Controller: OneNAND控制器编号,固定为0uBlkAddr:块地址uPageAddr:页地址aData:目标地址返回值:0 失败        1 成功
-
BL1的主要工作是从存储设备中,拷贝更完善的BL2至DRAM,并且BL1大小不能超过8K。如果需要用户自行编写函数实现拷贝功能,开发难度很大。事实上,S3C6410已经在IROM中固化了6个用于从不同外部存储设备拷贝数据到SDRAM中的函数,如表2. 3,这些函数的指针存放在D-TCM1的前24字节(每个指针变量占4字节)。用户根据需要调用即可,有效地降低了开发难度。以CopyMMCtoMem函数为例,可以通过以下形式调用该函数。
#define CopyMMCtoMem(a,b,c,d,e) (((int(*)(int, uint, ushort, uint *, int))(*((uint *)(0x0C004000 + 0x8))))(a,b,c,d,e))
为了更方便的阐释IROM-SD/MMC的启动原理,本书约定从IROM、以SD/MMC为存储设备的启动方式为SD卡启动。



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值