【OK210试用体验】裸机篇 -- DDR重定位
在S5PV210的启动流程中我们知道,S5PV210上电之后先从iROM中启动,iROM中的代码初始化完硬件之后会将外设储存器中的BL1段代码拷贝到iRAM中运行,再将BL2拷贝到iRAM中运行,最后跳转到OS的起始地址上运行。整个过程中代码不断在储存器中跳转,其中涉及到很重要的概念就是重定位。
对于S5PV210而言,启动时只会从NAND Flash/SD等启动设备中拷贝前16K的代码到iRAM中,那么当我们的程序超过16K怎么办?那就需要我们在前16K的代码中将整个程序完完整整地拷贝到DRAM等其他更大存储空间,然后再跳转到DRAM中继续运行我们的代码,这个拷贝然后跳转的过程就叫重定位。
本帖将学习将代码重定位到大容量的内存中运行,即DRAM。
S5PV210中的DRAM控制器
S5PV210中的DRAM部分的官方详细资料可以看S5PV210_UM_REV1.1中的 sections 05_memory 1. DRAM CONTROLLER。
在S5PV210中有两个独立的DRAM控制器和端口(引脚):DMC0、DMC1。。DMC0支持最大512M的DRAM,DMC1支持最大1G的DRAM。它们都支持DDR/DDR2,支持128Mb、256Mb、512Mb、1Gb、2Gb、4Gb的内存设备,支持16/32bit的位宽。
我们通过内存地址映射图来更好地认识这块:
DRAM0对应的地址是0x2000_0000~0x3FFF_FFF共512M,DRAM1对应的地址是0x4000_000~0x7FFF_FFFF共1G。
在OK210开发板中,搭载了4片K4T1G164QE,每片128 MByte,共512 MByte。
S5PV210官方手册中还提供了芯片的接线配置方案:
S5PV210中DRAM控制器块的框架图:
K4T1G164QE芯片
K4T1G164QE芯片资料:
。
,芯片引脚作用:
。
芯片手册提供了多种接线配置方案:
(其中一部分)。
程序编写
首先先创建两个文件夹来区别是BL1和BL2,在BL1中先编写start.S,可以起到引导作用,在这里我们要关闭看门狗、设置栈、初始化时钟、初始化串口、初始化DDR、跳转到main函数、重新设置栈、跳转到DDR的起始地址执行。
整个过程中的前部分我们在前面已经学习过怎么编写,这里只需要将代码拷贝到相应的位置下即可。
在初始化DDR中,官方手册给我们提供的方案,我们依照这个思路来配置寄存器。
。这个配置方案位于sections 05中的1.2.1.3.
将代码从一个储存器拷贝到另一个储存器,我们用C语言的方式来实现,在 S5PV210_iROM_ApplicationNote_Preliminary_20091126中有提供相应的方案:
。因为我们是在SD卡中启动,所以需要看一下手册中的SD/MMC部分,在sections 08中的7. SD/MMC CONTROLLER中有详细的讲解,这里需要SD卡的控制器的寄存器的映射地址,看这部分的7.9.1。
在BL2中我们只需跳转到main函数中执行,点亮LED和将在这个阶段运行的信息打印到PC上。
实验现象
将 bl1.bin 烧写到SD卡的第一扇区,bl2.bin 烧写到SD卡的第20扇区(这个可以自定义,修改相关代码),将SD卡从PC接口取出插入开发板上,调节到SD卡启动,上电后可以看到PC端打印出:
。在开发板上,四个LED灯交替闪烁:
。