主要讲一下硬件启动的流程以及DDR是在什么时候初始化的。


S3C6410支持Nand/Nor/OneNAND/Modem/iROM(内部ROM)几种启动方式,OneNand用的比较少,就不说了。这里比较新的就是iROM启动,当OM[1:4]全部设置为1时就为iRom启动方式(OM[0]脚用于对时钟源的选择控制),此时当板子上电后,会首先执行iRom中的代码,iRom中的代码会根据GPN[15:13]的管脚来判断从哪个存储设备中取4KB的启动代码到SteppingStone中运行,这段代码被称为Bootloader1 BL1,其实就是异常向量表和_start代码,包含初始化DDR的代码,因为SteppingStone是SRAM,不需要初始化就可以使用,因此当BL1执行了DDR初试化的代码后,再将GPN[15:13]的管脚指定的存储设备中的所有的bootload代码拷贝到DDR中,包括之前已经拷贝的BL1,这样就顺利完成了启动。也就说iROM中并没有初始化DDR的代码,这很容易可以想到:DDR的初始化方式各种各样,iROM没有那么多的代码空间去实现所有型号的DDR的初始化。


假如不是使用iROM启动,也就是使用Nand/Nor/Modem启动(注意,不支持SD启动),那么启动的流程就会有点小变化了,我们以NandFlash为例:


当芯片上电后,并不是执行iRom的代码,而是NandFlash控制器会自动使用DMA将自己的bootloader区域的前4KB代码搬运到iRAM(内部SRAM),注意,这步操作是硬件执行的,并不是由C代码驱动的,当然前提是芯片内部的NandFlash控制器支持NandFlash启动这个功能,很明显S3C6410的NandFlash控制器是支持NandFlash启动功能的。这里再补充一点:很多做软件的人平时习惯了C代码驱动外设的方式,就会觉得很奇怪:硬件怎么能自动使用DMAC搬运数据呢,其实这很简单,在现代的SOC设计中,任何控制器均是由Verilog语言编写的,然后整合到ARM芯片中,再进行综合和布局布线,到最后进行后端处理,比如画版图、流片,那么使用Verilog语言编写一个从NandFlash芯片中取数据的硬件语言代码应该还是蛮简单的吧。


我们言归正传,如果nandflash中没有bootloader程序,那么此时芯片肯定无法启动,DDR也是没有初始化的。同样使用Nor启动也是一样。执行iRAM中的代码跟执行BL1中的代码是一样的,后面的流程也是一样的了。


这样应该就很清楚DDR是什么时候初始化的了吧。


QT6410开发板,设计板子的人已经将GPN【15:13】焊死,接了GND,所以当IROM启动时候只支持SD/MMC(CH0)。