Internal ROM Booting 操作说明
1、综述
本文解释了带内存设备的iROM启动总体方案,支持三星MoviNAND/iNand,MMC/SD卡,pure Nand,eMMC,eSSD,UART和带iROM的USB启动。S5PV210 iROM启动通过引脚识别启动设备后重置 I/O.
1.1 硬件特征
IROM引导加载程序,需要如下硬件特性:
-
基于CortexA8的S5PV210X微处理器
-
64KB iROM(内置只读存储器)
-
96KB iSRAM(内置静态随机存储器)
-
SDRAM(同步动态随机存储器)和控制器
-
4/8 bit高速SD/MMC控制器
4位SD/4位MMC/4位或8位eMMC
-
Nand Flash控制器
-
OneNand控制器
-
eSSD控制器
-
UART/USB控制器
1.2特征
- OneNand启动(Mux/Demux)
- Nand启动(8/16位ECC)
- MMC启动
- eSSD启动
- 支持安全启动模式
- 除了UART/USB启动外,其他启动方式都会校验Bootloader的完整性
- 在生产过程中,如果写入安全密匙,就是安全启动模式,如果没有写入,那么就是非安全启动模式
- 支持二次启动
- 当第一种启动模式失败,SD/MMC启动会尝试从具有4位数据的SD / MMC通道2启动
1.3 iROM启动的优点
-
降低物料成本
=> 使用Movinand/iNAND/MMC/eMMC 等iROM启动,无需引导rom系统就可启动,所以无需其他引导rom设备(例如nor flash)
-
提高读干扰
=> 使用nand flash的iROM启动,S5PV210支持8/16位硬件校验
nand启动支持8位硬件校验
只有4KB 5cycle的Nand支持16位校验
-
降低生产成本(可选)
=> 可以使用其他引导设备对引导设备内存进行编程
-
电路设计检查点
① 使用OM引脚选择iROM引导设备(参考3 引导配置)
② V210的所有引导存储设备都使用MMC通道2进行了SD / MMC二次引导
③ Xm0CSn4/NFCSn2/ONANDXL_CSn0 应该用于OneNand 引导
(BL1开头包含校验数据,参考2.9章节)
④ Xm0CSn2/NFCSn0信号用于Nand引导
⑤ SD/MMC/eMMC 启动—MMC通道0用于第一次启动,通道2用于第二次启动
⑥ UART启动—使用UART通道端口2启动
2 操作
2.1 操作顺序
从引导设备复制可变大小的数据到内置的SRAM区域,BL1最大16KB,BL2最大80KB
① iROM进行初始启动:初始化系统时钟,设备特定的控制器和引导设备。
② iROM引导代码可以将引导加载程序加载到SRAM,引导加载程序称为BL1。在安全启动模式下,iROM会验证BL1的完整性。
③ 执行BL1:BL1将在SRAM上加载称为BL2的剩余引导加载程序,然后在安全启动模式下,BL1验证BL2的完整性。
④ 执行BL2:BL2初始化DRAM控制器,然后将OS数据加载到SDRAM。
⑤ 最后,跳转到操作系统的起始地址。 这将为使用系统创造良好的运行环境。
2.2 iROM(BL0)的启动顺序(请参阅2.3 V210的启动图)
- 禁用看门狗定时器
- 初始化指令缓存
- 初始化堆栈区域(请参见第2.5章中的“内存映射”)
- 初始化堆区域。 (请参见第2.5章中的“内存图”)
- 初始化块设备复制功能。 (请参见第2.7节中的“设备复制功能”)
- 初始化PLL并设置系统时钟。 (请参阅第2.11章的“时钟配置”)
- 将BL1复制到内部SRAM区域(请参见第2.7节“设备复制功能”)
- 验证BL1的校验和。如果校验和失败,则iROM将尝试第二次启动。 (SD / MMC通道2)
- 检查是否为安全启动模式。如果安全密钥值是在S5PV210中写入的,则它是安全启动模式。如果是安全启动模式,请验证BL1的完整性。
- 跳转到BL1的起始地址
2.3 V210开机图
2.4 第一次引导失败时,iROM第二次引导顺序
这是非安全启动模式的情况。
在安全启动模式下,应在第一和第二启动步骤的校验和之后添加BL1的验证完整性。
[警告]三星建议将第2,UART和USB引导选项仅用于调试。
2.4.1 UART启动模式
S5PV210 iROM支持UART下载功能。UART下载无需考虑启动设备的选择,通过向DNW发送标志位来校验。UART下载没有选择信号,为了避免UART超时错误,用户应在SMDK上电之前设置DNW配置。当选择BL1代码并且下载过程开始时,iROM应该被启动。
请参阅第3章引导配置设置uart引导的OM引脚。
2.4.2 USB启动模式
S5PV210 iROM支持USB下载功能。如果发生UART超时,则iROM尝试进入USB引导模式。为了避免USB协商超时错误,用户应事先在目标板和PC之间连接USB电缆。如果USB连接正常,用户可以通过USB下载BL1镜像
由于UART / USB引导模式下BL1不需要头部信息,因此BL1的代码基址为0xd002_0000,其他模式下BL1应该具有头部信息,并且其代码基地址为0xd0020010。(参考2.9章节)
2.5 内存映射
2.6 全局变量
如果使用MMC设备进行启动,则MMC卡的信息必须保存在特殊区域中。
地址 | 名称 | 用途 |
---|---|---|
0xD0037480 | globalBlockSize | SD / MMC设备的总块数 |
0xD0037484 | globalSDHCInfoBit | globalSDHCInfoBit[31:16] :RCA(卡相对地址)数据 globalSDHCInfoBit[2] :SD卡 globalSDHCInfoBit[1] : MMC卡 globalSDHCInfoBit[0] : 启用高容量 |
0xD0037488 | V210_SDMMC_BASE | 当前启动通道 |
2.7 设备复制功能
S5PV210内部具有用于boot-u设备的块复制功能的ROM代码。因此,开发人员可能不需要实现设备复制功能。这些内部功能可以将任何数据从存储设备复制到SDRAM,在完全结束内部ROM引导过程后,用户可以使用这些功能。
地址 | 名称 | 用途 | 定义 |
---|---|---|---|
0xD0037F90 | NF8_ReadPage_Adv | 8位ECC检查函数,仅适用于2048、4096页8位总线的Nand 将页面块复制到目标内存 | uint32 block 要复制的源块地址号 uint32 page 要复制的源页面地址号 uint8 buffer 目标缓冲区指针。 return int32 成功或者失败 #define NF8_ReadPage_Adv (a,b,c) (((int()(uint32, uint32, uint8*))(*((uint32 *) 0xD0037F90)))(a,b,c)) |
0xD0037F94 | NF16_ReadPage_Adv | 4位ECC检查函数,仅适用于2048页大小,5个循环地址,16位总线的Nand 将页面块复制到目标内存 | u32 block:要复制的源块地址号。 u32 page:要复制的源页面地址号。 u8 buffer:目标缓冲区指针。 return int :成功或者失败 #define NF16_ReadPage_Adv(a,b,c) (((int()(uint32, uint32, uint8*))(*((uint32 *) 0xD0037F94)))(a,b,c)) |
0xD0037F98 | CopySDMMCtoMem | 此内部功能可以将任何数据从SD / MMC设备复制SDRAM。 在IROM引导过程完成后,用户可以使用此功能。 使用EPLL源时钟,工作在20MHz | u32 StartBlkAddress :源卡(MoviNAND / iNand MMC))地址。必须是块地址 u16 blockSize:拷贝的块数 u32* memoryPtr:要复制的缓冲区。 bool with_init :定义卡的初始化 return bool(u8) :成功或者失败 #define CopySDMMCtoMem(z,a,b,c,e)(((bool()(int, unsigned int, unsigned short, unsigned int, bool))(*((unsigned int *)0xD0037F98)))(z,a,b,c,e)) |
0xD0037F9C | CopyMMC4_3toMem | 此内部功能可以将任何数据从eMMC设备复制到SDRAM。 在IROM引导过程完成后,用户可以使用此功能 使用EPLL源时钟,工作在20MHz | u16 blockSize:拷贝的块数 u32* memoryPtr:要复制的缓冲区。 u32 busWidth:数据总线宽度。 return bool(u8) :成功或者失败 #define CopyMMC4_3toMem(a,b,c,d)(((bool()(bool, unsigned int, unsigned int, int))(*((unsigned int *)0xD0037F9C)))(a,b,c,d)) |
0xD0037FA0 | CopyOND_ReadMultiPages | 此内部功能可以将任何数据从OneNand设备复制到SDRAM。 在IROM引导过程完成后,用户可以使用此功能。 (拷贝速度一般) 此函数将页面块复制到目标内存 | uDataAddr:目的地址 uBlockAddr:要读取的块地址 uPageAddr:要读取的页地址 uNumOfPages:要读取的页数 return bool(unsigend char) :成功或者失败 #define CopyOND_ReadMultiPages(a,b,c,d,e) (((bool()(unsigned int, unsigned int, unsigned char, unsigned int, unsigned int))(((unsigned int *) 0xD0037FA0)))(a,b,c,d,e)) |
0xD0037FA4 | CopyOND_ReadMultiPages_Adv | 此内部功能可以将任何数据从OneNand设备复制到SDRAM。 在IROM引导过程完成后,用户可以使用此功能。 (拷贝速度很快) 此函数将页面块复制到目标内存 | uDataAddr:目的地址 uBlockAddr:要读取的块地址 uPageAddr:要读取的页地址 uNumOfPages:要读取的页数 #define CopyOND_ReadMultiPages_Adv (a,b,c,d,e) (((bool()(unsigned int, unsigned int, unsigned char, unsigned int, unsigned int))(((unsigned int *) 0xD0037FA4)))(a,b,c,d,e)) |
0xD0037FA8 | Copy_eSSDtoMem | 此内部功能可以将任何数据从eSSD设备复制到SDRAM。 在IROM引导过程完成后,用户可以使用此功能。 (CPUPIO模式) PIOCPU模式转换 | u32 uStBlock :要复制的块数 u32 uBlocks:要复制的缓冲区。 u32 uBufAddr :数据总线宽度 #define Copy_eSSDtoMem(a,b,c) (((void()(unsigned int, unsigned int, unsigned int))(((unsigned int *)0xD0037FA8)))(a,b,c)) |
0xD0037FAC | Copy_eSSDtoMem_Adv | 此内部功能可以将任何数据从eSSD设备复制到SDRAM。 在IROM引导过程完成后,用户可以使用此功能。 (UDMA模式) UDMA模式转换 | u32 uStBlock :要复制的块数 u32 uBlocks:要复制的缓冲区。 u32 uBufAddr :数据总线宽度 #define Copy_eSSDtoMem_Adv(a,b,c) (((void()(unsigned int, unsigned int, unsigned int))(((unsigned int *)0xD0037FAC)))(a,b,c)) |
0xD0037FB0 | NF8_ReadPage_Adv128p | 8位ECC检查函数,仅适用于每个块具有128页且2K页大小的NAND。 |
2.8 引导块分配指南
2.8.1 SD/MMC/eSSD 引导块分配
本指南仅作为示例,但有1条强制性规则:不应该使用第一个块。 (预留的)
2.8.2 eMMC 引导块分配
2.8.3 OneNAND/NAND 引导块分配
[注意]如果要进行NAND引导,则NAND ECC数据应这样放置(Spare field-- 备用字段):
1) 8位ECC校验中ECC DATA大小是13Byte
2) 16位ECC校验中ECC DATA大小是26Byte
如果是16位ECC,每个NAND闪存都有可变的备用ECC大小。因此需要检查NAND Flash的数据表。
2.9 引导代码的头部信息说明
BL1必须具有头部代码。头部代码用于通过iROM代码复制到内部SRAM。头数据具有两个信息。 一个是BL1的大小,另一个是BL1的校验和数据。
加载BL1时,iROM会检查标头数据中BL1的大小,并将BL1复制到内部SRAM。拷贝完BL1之后,iROM将复制的BL1的数据求和并将其与BL1头数据中的校验和数据进行比较。如果成功,则BL1启动。 否则,iROM将尝试从SDMMC通道2端口进行第二次引导(4位SD / MMC)。
2.10 制作校验和示例代码
/*
*count:变量是unsigned int类型。
*dataLength:unsigned int类型,包含BL1的大小(字节)。
*buffer:unsigned short,用于从BL1读取1字节数据。
*checksum:unsigned int,它包含BL1的总和
*/
for(count=0;count< dataLength;count+=1)
{
buffer = (*(volatile u8*)(uBlAddr+count));
checkSum = checkSum + buffer;
}
2.11 时钟配置
V210中仅提供24MHz的外部晶体/振荡器。
-
APLL : M:200, P:6, S:1 => 800MHz
ARMCLK ACLK200 HCLK200 PCLK100 HCLK100 400 133 133 66 66 F O U T = ( M D I V ∗ F I N ) / ( P D I V ∗ 2 S D I V − 1 ) ) FOUT = (MDIV*FIN )/ (PDIV *2^{SDIV} -1)) FOUT=(MDIV∗FIN)/(PDIV∗2SDIV−1))
-
MPLL : M:667, P:12, S:1 => 667MHz
HCLK166 PCLK83 SCLK_FIMC ARMATCLK HCLK133 PCLK66 133 66 133 133 133 66 F O U T = ( M D I V ∗ F I N ) / ( P D I V ∗ 2 S D I V ) FOUT = (MDIV *FIN) / (PDIV * 2^{SDIV}) FOUT=(MDIV∗FIN)/(PDIV∗2SDIV)
-
EPLL : M:80, P:3, S:3, K:0 => 80MHz
F O U T = ( ( M D I V + K D I V ) ∗ F I N ) / ( P D I V ∗ 2 S D I V ) FOUT = ((MDIV+KDIV) * FIN) / (PDIV * 2^{SDIV}) FOUT=((MDIV+KDIV)∗FIN)/(PDIV∗2SDIV)
3 启动配置
OM [5:0]引脚应直接与VDDSYS或GND相连,是为了进入睡眠模式时泄漏电流最小化,通过添加一个超过100K欧姆的上拉和下拉电阻实现。
4 IROM引导模式的特点
OneNAND :
-
启动使用Xm0CSn4/NFCSn2/ONANDXL_CSn0 信号
-
iROM 检查校验和
(BL1代码必须包含校验和数据。 如果BL1代码已加载到内部SRAM中。iROM代码将比较iROM加载的校验和数据。 加载地址为0xD0020008。)
-
时钟33MHz ,使用MPLL(667MHz) 启动
NAND :
- 启动页使用硬件8位校验
- 4KB, 5cycle Nand 支持16位ECC
- 2KB, 5cycle 16-bit bus Nand 支持4位ECC
- iROM 检查校验和
- 启动使用Xm0CSn2/NFCSn0 信号
SD/MMC /eMMC
- 第一次引导使用SDMMC CH0作为4位。
- 第二次启动使用SDMMC CH2为4位
- iROM 检查校验和
- 时钟20MHz ,使用EPLL启动
eMMC :
- SDMMC CH0可用于eMMC引导(4/8位)。 总线宽度由OM设置控制
- iROM 检查校验和
- 时钟20MHz ,使用EPLL启动
NOR :
- 启动使用Xm0CSn0 信号
- iROM 检查校验和
UART/USB :
- UART CH2用于UART引导和调试消息
- UART模块频率为66.7MHz,使用MPLL进行引导
- USB引导模式需要DNW工具。
位。
- 第二次启动使用SDMMC CH2为4位
- iROM 检查校验和
- 时钟20MHz ,使用EPLL启动
eMMC :
- SDMMC CH0可用于eMMC引导(4/8位)。 总线宽度由OM设置控制
- iROM 检查校验和
- 时钟20MHz ,使用EPLL启动
NOR :
- 启动使用Xm0CSn0 信号
- iROM 检查校验和
UART/USB :
- UART CH2用于UART引导和调试消息
- UART模块频率为66.7MHz,使用MPLL进行引导
- USB引导模式需要DNW工具。