第二章第十节 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卡启动。 |