Linux,uboot,kernel启动流程,S5PV210芯片的启动流程,DRAM控制器初始化流程
一、S5PV210芯片的DRAM控制器介绍、初始化DDR的流程分析
1、DRAM的地址空间
1)从地址映射图可以知道,S5PV210有两个DRAM端口。 DRAM0的内存地址范围:0x20000000~0x3FFFFFFF(512MB);DRAM1:的内存地址范围:0x40000000~0x7FFFFFFF(1024MB);
2)S5PV210实际最多能接1.5G的内存。32位的CPU理论上能接4G的内存,但是ARM结构的机器是统一编址,寄存器会占掉一部分地址空间,所以实际是达不到4G的内存;
2、DRAM端口的引脚
DRAM端口的引脚:32根数据线(Xm1_DATAn) + 14根地址线(Xm1_ADDRn) + 3根片选信号线(Xm1_BAn) + 控制信号线。
3、DRAM控制器
DRAM是比较复杂的器件,初始化DRAM需要根据数据手册里的时序说明来写代码,没有对DRAM有深入的了解是没法写出合适的代码。但是DRAM的接口统一,于是在复杂CPU里集成了DRAM控制器,编程人员只需要操作寄存器就可以发出相应的时序,而不用去管时序是如何产生的。DRAM控制器简化了使用Soc开发人员的工作,我们只需要知道DRAM的大致过程和关键的参数就可以去初始化DRAM。
4、DRAM初始化
数据手册里初始化步骤
DRAM控制器支持多个版本的DRAM的,比如S5PV210支持LPDDR、LPDDR2、DDR2。不同版本的DRAM初始化步骤是不一样的,上面就是初始化DDR2的部分初始化步骤。初始化DDR2的代码就是按照上面的步骤进行的,但是上面的步骤很粗略,很多细节没有列举出来,但是可以辅助我们阅读DDR2的初始化代码;
实际代码初始化流程分析
代码来源:uboot中对DRAM的初始化代码,下面只是从逻辑上梳理了初始化过程,要结合代码才能真正理解整个初始化过程;
(1)设置GPIO引脚的驱动强度;
(2)设置DRAM控制器的DLL,给DRAM控制器提供稳定的时钟信号;
(3)关掉DRAM的自动重刷新;
(4)配置DRAM的相关参数:行地址、列地址、自动重刷新间隔、DRAM的有效地址空间、Memory Burst Length、数据线宽度、DRAM类型等关键参数;
(5)根据数据手册里的初始化步骤,依次给DRAM发命令进行初始化。发命令的实质就是按照时序去初始化DDR2,只不过时序由DRAM控制器产生,我们不再操心。
(6)最终DDR2初始化成功,后面的程序都重定位到DDR2中执行;
二、S5PV210芯片的启动流程
1、内存
1、只读
ROM,irom,不需要初始化,上电就可读2、可随机读写,任何地址
SRAM 静态内存 特点就是容量小、价格高,优点是不需要软件初始化直接上电就能用。
DRAM 动态内存 特点就是容量大、价格低,缺点就是上电后不能直接使用,需要软件初始化后才可以使用。
单片机中:内存需求量小,而且希望开发尽量简单,适合全部用SRAM
嵌入式系统:内存需求量大,而且没有NorFlash等可启动介质
PC机: 内存需求量大,而且软件复杂,不在乎DRAM的初始化开销,适合全部用DRAM
2、外存
1、都是不可随机访问地址,只能按块,页,一次性读或写NorFlash:特点是容量小,价格高,优点是可以和CPU直接总线式相连,CPU上电后可以直接读取,所以一般用作启动介质。
NandFlash:(跟硬盘一样):特点是容量大,价格低,缺点是不能总线式访问,也就是说不能上电CPU直接读取,需要CPU先运行一些初始化软件,然后通过时序接口读写。
emmc:和nandflash,一样,区别是集成好多nand颗粒,有坏快管理,比nandflash贵,好用
ufs:新出来的一种大容量存储器,比emmc还大,可以到500GB,和硬盘一样大,和emmc差不多。
3、方案设计
一般PC机都是:很小容量的BIOS(NorFlash)+ 大容量的DRAM + 很大容量的硬盘(类似于NandFlash)。
一般的单片机: 很小容量的NorFlash + 很小容量的SRAM(全部是上电即可使用) 。
嵌入式系统:因为NorFlash很贵,所以现在很多嵌入式系统倾向于不用NorFlash,直接用:SoC内置SRAM + 外接的大容量Nand + 外接的大容量DRAM。
4、S5PV210启动方式设计
S5PV210 使用的启动方式是:外接的大容量 Nand Flash 硬盘 + 外接的大容量 DRAM 内存 + SoC 内置 SRAM。
实际上 S5PV210 的启动还要更好玩一些,S5PV210 内置了一块 96KB 大小的 SRAM(叫 iRAM),同时还有一块内置的 64KB 大小的 NorFlash(叫 iROM)。
210 的启动过程大致是:
S5PV210内部有 iROM 和 iRAM,因此启动时分两个阶段:内部启动阶段和外部启动阶段。对于内部启动阶段各种S5PV210的开发板都是相同的,对于外部启动阶段,不同开发板会有不同。
S5PV210出厂时内置了 64KB iROM和 96KB iRAM。iROM 中预先内置烧录了一些代码(称为 iROM 代码),iRAM 属于 SRAM(不需软件初始化,上电即可使用)。210启动时首先在内部运行 iROM 代码,然后由 iROM 代码开启外部启动流程。
第一步:CPU 上电后,先从内部 IROM(NOR Flash)中读取预先设置的代码,执行。这一段 IROM 代码首先做了一些基本的初始化(CPU时钟、关看门狗···)(这一段 IROM 代码是三星出厂前设置的,三星也不知道我们板子上将来接的是什么样的 DRAM 内存,因此这一段 IROM 是不能负责初始化外接的 DRAM 内存 的,因此这一段代码只能初始化 SoC 内部的东西);然后这一段代码会判断我们选择的启动模式(我们通过硬件跳线可以更改板子的启动模式,sd卡启动,还是nandflash启动,看uboot,kernel烧录在那里),然后从相应的外部存储器去读取启动代码到内部 SRAM(叫 iRAM)。第二步:从 SRAM(叫 iRAM) 去运行刚上一步读取来的启动代码,然后执行。这一段启动代码就会负责初始化 Nand Flash 硬盘, 初始化 DRAM 内存 ,初始化板卡,然后将 OS 从 Nand Flash 硬盘读取到 DRAM 内存 , 然后运行。
IROM(NOR Flash)和 iRAM(SRAM)的地址空间,0xD0020000 - 0xD0037FFF
思路:因为启动代码的大小是不定的,有些公司可能 96kb 就够了,有些公司可能 1MB 都不够。所以刚才说的两步的启动方式不合适。三星的解决方案是:把启动代码分为两半(BL1 和 BL2),这两部分协同工作来完成启动。
实际的启动方式如下:
第一步:CPU 上电后先从内部 IROM 中读取预先设置的代码(BL0),执行。这一段 IROM 代码首先做了一些基本的初始化(CPU 时钟、关看门狗···)(这一段 IROM 代码是三星出厂前设置的,三星也不知道我们板子上将来接的是什么样的 DRAM 内存,因此这一段 IROM 是不能负责初始化外接的 DRAM 内存的,因此这一段代码只能初始化 SoC 内部的东西);然后这一段代码会判断我们选择的启动模式(我们通过硬件跳线可以更改板子的启动模式),然后从相应的外部存储器去读取第一部分启动代码(BL1,大小为16KB)到内部 SRAM(叫 iRAM)。第二步:从 SRAM(叫 iRAM)去运行刚上一步读取来的 BL1(16KB),然后执行。BL1 负责初始化 NandFlash 硬盘,然后将 BL2 读取到 SRAM(叫 iRAM)(剩余的 80KB)然后运行第三步:从 SRAM(叫 iRAM)运行 BL2,BL2 初始化 DRAM 内存,然后将 OS 读取到 DRAM 内存中,然后启动 OS,启动过程结束。
device copy function 的解释
The S5PV210 internally has a ROM code of block copy function for boot-u device. Therefore, developer may not needs to
implements device copy functions. These internal functions can copy any data from memory devices to SDRAM. User can
use these function after ending up the internal ROM boot process completely.
S5PV210内部有一个用于引导-u设备的块拷贝功能的ROM代码。因此,开发人员可能不需要实现设备复制功能。
这些内部函数可以将任何数据从内存设备复制到SDRAM。用户可以在完全结束内部ROM启动过程后使用这些功能。
也就是, IROM 代码(BL0)拥有针对各种启动介质(NOR Flash/eSSD/OneNand/Nand Flash)的块拷贝函数。因此,开发人员可能不需要实现设备复制功能。这些内部函数可以将任何数据从启动介质设备复制到SDRAM。用户可以在完全结束 IROM(BL0)阶段后使用这些拷贝函数,将 BL1 代码拷贝到 IRAM(internel SRAM)中执行。
如下,内置函数
bl0,bl1,内置copy函数
完整的启动框架图
3、Second boot support
When 1 st boot mode fails, SD/MMC boot will be tried through SD/MMC channel 2 with 4-bit data
当第一启动模式失败时,SD/MMC卡启动模式下将会从SD/MMC2通道尝试再次启动。
这种二级启动是一种冗余设计。SoC 中第一启动介质故障而导致不能启动时,可以从备用启动介质启动。一步检查外部启动介质
使用 iROM 启动的好处
1、降低BOM成本。因为 iROM 可以使 SOC 从各种外设启动,因此可以省下一块 boot rom(专门用来启动的rom,一般是norflash)
2、支持各种校验类型的nand flash
3、可以在不使用编程器的情况下使用一种外部存储器运行程序来给另一种外部存储器编程烧录。这样生产时就不用额外购买专用编程器了,降低了量产成本。
总结
不同启动介质sd,emmc,nandflash,烧录uboot时,块地址
可以看到,对于 SD卡、MMc、eSSD的启动介质,BL1 代码应该拷贝到启动介质的 1 号扇区;
而对于其他启动介质,BL1 代码应该拷贝到启动介质的 0 号扇区。
** Header information data for Boot Code description,BL1数据格式**
The BL1 must have header data. The header data is used for being copied to internal SRAM by iROM code.
The header data has two information. One is size of BL1 and Another is checksum data of BL1.BL1必须有报头数据。报头数据被用于通过iROM代码复制到内部SRAM。
头数据有两个信息。一个是BL1的大小,另一个是BL1的校验和数据。因为irom是不知道拷贝多大的,所以就像网络通信数据报头一样
需要告诉包号,大小,现在8年后,回来终于明白了,为啥要加数据头了,后面才是真正有用的数据段。
When loading BL1, iROM check size of BL1 in header data and copy BL1 to internal SRAM.
After coping BL1, iROM sum data of copied BL1 and compare it to checksum data in header data of BL1.
If it is success, BL1 start. otherwise iROM will try second boot(4-bit SD/MMC) from SDMMC channel 2 port.
当加载BL1时,iROM检查头数据中BL1的大小,并将BL1复制到内部SRAM。
拷贝BL1后,将复制的BL1的iROM数据求和,并将其与BL1头数据中的校验和数据进行比较。
如果成功,BL1开始。否则iROM将尝试从SDMMC通道2端口进行第二次引导(4位SD/MMC)。
这样校验目的是保证启动代码绝对正确,防止数据错误,被篡改。做芯片安全启动时,就有md5,计算数据,然后通过公钥匙私钥匙算法
验证启动代码的正确性。
朱友鹏开发板学习过来的额。