LPDDR4, Low Power Double-Data-Rate 4th Generation Synchronous Dynamic Random Access Memory。
属于SDRAM(结构是1个transistor+1个capacitor)。
这里有一些DDR的基本知识说明
最初是为移动装置设计的,后来推出了满足汽车温度等级的LPDDR4 SDRAM。
将来的后续发展是LPDDR4X,LPDDR5.
从CPU到DRAM颗粒之间依次按层级由大到小分为channel > DIMM > rank > chip > bank > row/column。
天然2通道,有2套命令地址(CA)输入和2套数据总线(DQ)。
功耗比DDR2/DDR3/DDR4更低,如引入DBI(Data Bus Inversion)特性。
为使功耗降低,LPDDR4将Data IO从
SSTL(终端电压是VDD/2)
->
POD(Pseudo Open Drain,(终端电压是VDD))
意味着,当总线上是高电平时,无电流流动。
这也是DBI(Data Bus Inversion)实现的基础。
DBI - 让高电平尽可能的多(无电流流动,功耗就低了),至少5bit低电平时,对所有的信号进行反转,同时,DBI=’0’(低电平)。
由于结构(1个transistor+1个capacitor)原因,会有泄漏电荷,所以需要定期刷新(refresh)来避免数据的丢失。而且,温度越高,要求刷新频率越频繁。
需要具有更高温度抗性的位单元。
引入纠错机制(注:是内联ECC,不是ECC),将(64data+8Hamming ECC)同时存放在同一memory内,所以在传输时,相比与ECC,带宽利用率较低。
与SOC互联时,要求SOC满足特定的汽车可靠性标准。
- AE-Q100,专注于可靠性和温度方面。
- ISO26262,专注于设计流程,设计和认证。
目前主要生产厂家:Micron, Hynix, Samsung。
R-Car系列支持的LPDDR4通道数量不同(32bits/通道)。
H3 | M3 | M3N |
---|---|---|
4 | 2 | 1 |
最大连接8GBytes。
LPDDR4的双通道连接方式有以下四种。
在R-Car开发板中采用的连接是“共享CA”方式。
实际应用中,用户根据需要选择适合自己的LPDDR4(厂家,容量,速率,等等),并搭建自己的连接,如果与Renesas官方学习板不同,就需要对代码进行修改,并且更改后要进行足够的评估。
以下是Yocto v3.15 DDR部分的目录结构和DDR的初始化流程(包括四部分内容:PHY、DRAM、Training、DBSC),供参考。
用户只需关心修改文件“boot_init_dram_config.c”以适应实际的硬件连接。
如果用到DRAM backup(fastboot中会用到),还需关心修改文件“dram_sub_func.c/.h”,有几个选项需要修改。
详细情况,请参考文档“引用7”。
索引 | 更改点 | 文件 | 说明 |
---|---|---|---|
1 | 宏 DBSC_REFINTS | boot_init_dram_regdef.h 或 build option(RCAR_REF_INT) | DBRFCNF1/2 register相关。refresh模式,会影响到QoS |
2 | 宏 BOARDNUM | boot_init_dram_config.c | Renesas评估板编号0~21 |
3 | 宏 BOARD_JUDGE_AUTO | boot_init_dram_config.c | 自动识别board |
4 | boardcnf.phyvalid | boot_init_dram_config.c | PHY通道是否valid |
5 | boardcnf.dbi_en | boot_init_dram_config.c | DBI模式 |
6 | boardcnf.cacs_dly/_adj | boot_init_dram_config.c | CA/CS delay及调整 |
7 | boardcnf.dqdm_dly_w/r | boot_init_dram_config.c | DQ W/R delay |
8 | boardcnf.channel.ddr_density | boot_init_dram_config.c | density of every channel(每个通道有2个CS端)。例:LPDDR4 DRAM内部有2 dies, 每个die容量8Gbit,2ranks, 总容量就是16Gbits. 设置为{0x02, 0x02}. First field: rank-1 (CS0) DRAM容量 die Second field: rank-2 (CS1) DRAM容量 |
9 | boardcnf.channel.ca/dqs/dq/dm_swap | boot_init_dram_config.c | swap(CA,DQS,DQ,DM),和实际物理连接顺序有关 |
10 | 宏 WDQLVL_PAT | boot_init_dram_config.c | data patterns for DQ/DM |
11 | boardcnf.channel.cacs_adj | boot_init_dram_config.c | 可以通过Eye Opening Tool查看调整后效果 |
12 | boardcnf.channel.dm_adj\w/r | boot_init_dram_config.c | DM调整。可以通过Eye Opening Tool查看调整后效果 |
13 | boardcnf.channel.dqdm_adj\w/r | boot_init_dram_config.c | DQ调整。可以通过Eye Opening Tool查看调整后效果 |
14 | 宏 _def_LPDDR4_ODT | boot_init_dram_config.c | MR11 register相关 |
15 | 宏 _def_LPDDR4_VREFCAT | boot_init_dram_config.c | MR12 register相关 |
16 | 宏 JS2_DERATE | boot_init_dram_config.c | 在温度区间[85~105 摄氏度]添加额外的timing margin |
17 | 宏 DDR_FAST_INIT | boot_init_dram_config.c | 初始化时间会快一点 |
18 | CLK & DIV | boot_init_dram_config.c | Extal时钟相关。MD14/MD13引脚相关 |
19 | 宏 DDR_FAST_INIT | boot_init_dram_config.c | MD17/MD19引脚相关,调整DDR速率 |
EMC知识整理如下:
R-Car系列是Renesas公司的SOC,功能很强大。
从以下几个方面描述:
R-Car boards是必须的,参考这里。
以下跳线指的是开发板(slavator-X(S)board)上的跳线。
跳线MD[7:6] | 描述 |
---|---|
B’00 | 从CA57启动 |
B’01 | 从CA53启动 |
B’10 | - |
B’11 | 从CR7启动 |
跳线MD[15] | 描述 |
---|---|
B’0 | AArch32 |
B’1 | AArch64 |
跳线MD[4:1] | 描述 |
---|---|
B’0000 | 从外部ROM启动 |
B’0001 | - |
B’0010 | 从HyperFlash ROM启动(160MHz),使用DMA |
B’0011 | 从HyperFlash ROM启动(80MHz),使用DMA |
B’0100 | 从Serial Flash ROM启动(40MHz),使用DMA |
B’0101 | 从eMMC启动(25MHzx1总线宽度),使用DMA |
B’0110 | - |
B’0111 | - |
B’1000 | - |
B’1001 | - |
B’1010 | 从HyperFlash ROM启动(160MHz),使用XIP模式 |
B’1011 | 从HyperFlash ROM启动(80MHz),使用XIP模式 |
B’1100 | - |
B’1101 | 从eMMC启动(50MHzx8总线宽度),使用DMA |
B’1110 | - |
B’1111 | SCIF download模式 |
有关CA57/CA53/CR7的启动流程,请参考【引用1】中的文档。
启动地址由reset模块来决定。 如果Cortex-A57以AArch64启动,启动地址由MD15,MD[7:6],RESET.CA57CPU0BARH/L寄存器决定。
如果Cortex-A57以AArch32启动并选择片上ROM启动,启动地址由RESET.CA57CPU0BARH/L寄存器决定。
如果Cortex-R7并选择片上ROM启动,启动地址由RESET.CR7BAR寄存器决定。
从HyperFlash/Serial Flash ROM/eMMC启动, 主启动处理器跳转到H’EB100000(AArch32)或H’EB10C000(AArch64),执行boot ROM中的指令,并用SYS-DMAC CH0将5KB或7KB(eMMC)数据copy到内部RAM。
有关启动参数的描述,请参考【引用1】中的文档。
这5KB或7KB(eMMC)数据包含Boot ROM参数(4bytes,存储在Serial Flash的H’0地址),IPL-A & B的地址信息及size信息。Boot ROM参数可以选择IPL-A还是IPL-B。 根据Boot ROM参数中指定的size,将IPL copy到RAM,传输完毕后,跳转到指定的IPL地址。详细描述,请参考【引用1】中的文档。
然后,再将IPL(Initial Program Loader) copy到内部RAM,然后跳转到指定的地址。
以从serial flash启动为例。
SW | 设置 | 描述 |
---|---|---|
SW10[5:8] | B’0100 | 从serial flash ROM启动(40MHz)启动,使用DMA |
SW1 | All ON | 使用serial flash ROM |
SW2 | All ON | 使用serial flash ROM |
SW3 | OFF | 使用serial flash ROM |
MiniMonitor能实现一些简单而有限的工作:
ATF是Arm Trusted Firmware的简称。 下面是ATF的工作流描述。
在基于Yocto的R-Car工程中,u-boot对应这里的bl33。
ATF将系统启动从最底层进行了完整的统一划分,将secure monitor的功能放到了bl31中进行,这样当系统完全启动之后,在CA或者TEE OS中触发了smc或者是其他的中断之后,首先是遍历注册到bl31中的对应的service来判定具体的handle,这样可以对系统所有的关键smc或者是中断操作做统一的管理和分配。ATF的code boot整个启动过程参考上图。
在上述启动过程中,每个Image跳转到下一个image的方式各不相同,下面将列出启动过程中每个image跳转到下一个image的过程:
bl1跳转到bl2执行 在bl1完成了bl2 image加载到RAM中的操作,中断向量表设定以及其他CPU相关设定之后,在bl1_main函数中解析出bl2 image的描述信息,获取入口地址,并设定下一个阶段的cpu上下文,完成之后,调用el3_exit函数实现bl1到bl2的跳转操作,进入到bl2中执行。
bl2跳转到bl31执行 在bl2中将会加载bl31, bl32, bl33的image到对应权限的RAM中,并将该三个image的描述信息组成一个链表保存起来,以备bl31启动bl32和bl33使用。在AACH64中,bl31为EL3 runtime software,运行时的主要功能是管理smc指令的处理和中断的主力,运行在secure monitor状态中bl32一般为TEE OS image,本章节以OP-TEE为例进行说明 bl33为非安全image,例如uboot, linux kernel等,当前该部分为bootloader部分的image,再由bootloader来启动linux kernel.从bl2跳转到bl31是通过带入bl31的entry point info调用smc指令触发在bl1中设定的smc异常来通过cpu将全向交给bl31并跳转到bl31中执行。
bl31跳转到bl32执行 在bl31中会执行runtime_service_inti操作,该函数会调用注册到EL3中所有service的init函数,其中有一个service就是为TEE服务,该service的init函数会将TEE OS的初始化函数赋值给bl32_init变量,当所有的service执行完init后,在bl31中会调用bl32_init执行的函数来跳转到TEE OS的执行
bl31跳转到bl33执行 当TEE_OS image启动完成之后会触发一个ID为TEESMC_OPTEED_RETURN_ENTRY_DONE的smc调用来告知EL3 TEE OS image已经完成了初始化,然后将CPU的状态恢复到bl31_init的位置继续执行。bl31通过遍历在bl2中记录的image链表来找到需要执行的bl33的image。然后通过获取到bl33 image的镜像信息,设定下一个阶段的CPU上下文,退出el3然后进入到bl33 image的执行。
目前,有R-Car H3/M3/M3N有基于Yocoto实现的开源工程。
详细情况,请参考博客搭建详细教程
如:xxx.github.io
挑几个主要的更改
文件名 | 描述 | 文件夹 |
---|---|---|
_config.yml | 配置数据 | 根目录 |
index.html | 首页 | 根目录 |
about.md | 关于 | \page |
*.md | blog文章 | _posts |
位于目录 _posts 下。
文件命名有一定规则,如:2019-09-18-blog标题.md