S5PV210_iROM_初级应用说明

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启动的优点

  1. 降低物料成本

    => 使用Movinand/iNAND/MMC/eMMC 等iROM启动,无需引导rom系统就可启动,所以无需其他引导rom设备(例如nor flash)

  2. 提高读干扰

    => 使用nand flash的iROM启动,S5PV210支持8/16位硬件校验

    ​ nand启动支持8位硬件校验

    ​ 只有4KB 5cycle的Nand支持16位校验

  3. 降低生产成本(可选)

    => 可以使用其他引导设备对引导设备内存进行编程

  4. 电路设计检查点

    ① 使用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的启动图)

  1. 禁用看门狗定时器
  2. 初始化指令缓存
  3. 初始化堆栈区域(请参见第2.5章中的“内存映射”)
  4. 初始化堆区域。 (请参见第2.5章中的“内存图”)
  5. 初始化块设备复制功能。 (请参见第2.7节中的“设备复制功能”)
  6. 初始化PLL并设置系统时钟。 (请参阅第2.11章的“时钟配置”)
  7. 将BL1复制到内部SRAM区域(请参见第2.7节“设备复制功能”)
  8. 验证BL1的校验和。如果校验和失败,则iROM将尝试第二次启动。 (SD / MMC通道2)
  9. 检查是否为安全启动模式。如果安全密钥值是在S5PV210中写入的,则它是安全启动模式。如果是安全启动模式,请验证BL1的完整性。
  10. 跳转到BL1的起始地址

2.3 V210开机图

在这里插入图片描述

2.4 第一次引导失败时,iROM第二次引导顺序

image-20210304230508096
这是非安全启动模式的情况。
在安全启动模式下,应在第一和第二启动步骤的校验和之后添加BL1的验证完整性。

[警告]三星建议将第2,UART和USB引导选项仅用于调试。

2.4.1 UART启动模式

S5PV210 iROM支持UART下载功能。UART下载无需考虑启动设备的选择,通过向DNW发送标志位来校验。UART下载没有选择信号,为了避免UART超时错误,用户应在SMDK上电之前设置DNW配置。当选择BL1代码并且下载过程开始时,iROM应该被启动。
image-20210304231458729.png
请参阅第3章引导配置设置uart引导的OM引脚。

2.4.2 USB启动模式

S5PV210 iROM支持USB下载功能。如果发生UART超时,则iROM尝试进入USB引导模式。为了避免USB协商超时错误,用户应事先在目标板和PC之间连接USB电缆。如果USB连接正常,用户可以通过USB下载BL1镜像

image-20210304231811017
在这里插入图片描述
在这里插入图片描述

由于UART / USB引导模式下BL1不需要头部信息,因此BL1的代码基址为0xd002_0000,其他模式下BL1应该具有头部信息,并且其代码基地址为0xd0020010。(参考2.9章节)

2.5 内存映射

在这里插入图片描述

2.6 全局变量

如果使用MMC设备进行启动,则MMC卡的信息必须保存在特殊区域中。

地址名称用途
0xD0037480globalBlockSizeSD / MMC设备的总块数
0xD0037484globalSDHCInfoBitglobalSDHCInfoBit[31:16] :RCA(卡相对地址)数据 globalSDHCInfoBit[2] :SD卡 globalSDHCInfoBit[1] : MMC卡 globalSDHCInfoBit[0] : 启用高容量
0xD0037488V210_SDMMC_BASE当前启动通道

2.7 设备复制功能

S5PV210内部具有用于boot-u设备的块复制功能的ROM代码。因此,开发人员可能不需要实现设备复制功能。这些内部功能可以将任何数据从存储设备复制到SDRAM,在完全结束内部ROM引导过程后,用户可以使用这些功能。

地址名称用途定义
0xD0037F90NF8_ReadPage_Adv8位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))
0xD0037F94NF16_ReadPage_Adv4位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))
0xD0037F98CopySDMMCtoMem此内部功能可以将任何数据从SD / MMC设备复制SDRAM。 在IROM引导过程完成后,用户可以使用此功能。 使用EPLL源时钟,工作在20MHzu32 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))
0xD0037F9CCopyMMC4_3toMem此内部功能可以将任何数据从eMMC设备复制到SDRAM。 在IROM引导过程完成后,用户可以使用此功能 使用EPLL源时钟,工作在20MHzu16 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))
0xD0037FA0CopyOND_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))
0xD0037FA4CopyOND_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))
0xD0037FA8Copy_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))
0xD0037FACCopy_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))
0xD0037FB0NF8_ReadPage_Adv128p8位ECC检查函数,仅适用于每个块具有128页且2K页大小的NAND。

2.8 引导块分配指南

2.8.1 SD/MMC/eSSD 引导块分配

在这里插入图片描述
本指南仅作为示例,但有1条强制性规则:不应该使用第一个块。 (预留的)

2.8.2 eMMC 引导块分配

image-20210315225215053.png

2.8.3 OneNAND/NAND 引导块分配

image-20210315225506511.png
[注意]如果要进行NAND引导,则NAND ECC数据应这样放置(Spare field-- 备用字段):

image-20210315225922250.png
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的校验和数据。

image-20210315230742006.png

加载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

    ARMCLKACLK200HCLK200PCLK100HCLK100
    4001331336666

    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=(MDIVFIN)/(PDIV2SDIV1))

  • MPLL : M:667, P:12, S:1 => 667MHz

    HCLK166PCLK83SCLK_FIMCARMATCLKHCLK133PCLK66
    1336613313313366

    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=(MDIVFIN)/(PDIV2SDIV)

  • 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)/(PDIV2SDIV)

3 启动配置

OM [5:0]引脚应直接与VDDSYS或GND相连,是为了进入睡眠模式时泄漏电流最小化,通过添加一个超过100K欧姆的上拉和下拉电阻实现。

image-20210315232807346.png

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工具。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值