AM1808启动流程

来源:互联网 发布:ni软件卸载工具 编辑:程序博客网 时间:2024/05/16 16:58

AM1808支持多种启动方式,而作为产品发布一般都以NAND启动为主,串口启动作为调试,至于NOR启动,为了降低成本,很少使用。

AM1808NAND启动特性:
不支持一次性全部启动,比如向三星2440这种CPU,不管是从NOR启动还是NAND启动,都是一次性的,只需一级boot就可以引导LINUX/WINCE等,这就是一次性启动。
相反的TI的达芬奇价格的OMAPL系列以及引脚兼容的单核产品均不支持一次启动,而是三级启动,分为RBL(ROM bootloader),UBL(user bootloader),U-boot.
RBL是CPU内部ROM上固件程序,在出厂时就已经烧写进去了,这部分我们不用关心,只需知道,在复位时,CPU会采集BOOT[7:0]引脚状态,从而选择对应的启动方式。
这里以NAND 启动为例:
片上RAM为128KB,0x8000 0000 ~ 0x8002 0000
    ROM为64KB   0xfffd 0000 ~ 0xfffe 0000
    NAND flash 片选必须为CS3 统一编码地址为0x6200 0000

复位时:ROM中的代码拷贝进RAM,RBL里面有相关的NAND匹配设置,查找NAND芯片的ID,然后将NAND中前14KB的代码加载进内部RAM,故在选择NAND芯片时,必须使用TI能识别ID的芯片,在其手册中有附表。
复制代码后,UBL运行在内部RAM,它会初始化DDR2/mDDR,及NAND flash,并搬运代码(U-BOOT)至DDR2中并跳转运行。
具体特性,支持largepage 4KBytes,支持错误检测,比如在NAND中存在坏块,它最多都取24个块,直到在page0找到特殊标志,支持ECC校验,使用4bit硬件ECC,即每512B使用4BECC位数

RBL拷贝UBL的过程,当RBL搬运进内部RAM后就开始执行,初始化一些基本设置,比如串口和NAND,就会在NAND的第一个块page0开始查找UBL的表述符,如果没有找到一个合法的UBL,RBL会继续在下一个块的page0查找,最多查找到第24块,如果找到UBL,将UBL描述符读取到内部RAM,得到UBL的块地址,页面数等信息,然后搬运UBL到内部RAM运行。
page0地址 描述符      说明
0  0X     特殊标识
4  UBL入口地址  绝对地址
8   UBL共使用的页面数
12  UBL开始块号
16  UBL开始页面号 ,支持连续页面多块
读取配置后,RBL会将20B以后的UBL复制到RAM中,然后跳转执行
到这里,第二级boot就已经启动了,至于为什么不直接拷贝U-BOOT到内部RAM中,估计是RAM只有128K,现在的U-BOOT往往大于128K。

UBL引导U-BOOT,和RBL引导UBL一样,通过描述符查找,不过是从第二个块开始的,
第0个块为U-BOOT的环境变量,第一个块是UBL,第二个块开始才是U-BOOT,但实际上,在设计时会多留几个块以防止坏块的影响。
U-BOOT加头信息:
偏移地址  内容
0   描述符 0x55424cxx
4   U-BOOT入口地址
8   共计的页面数
12   起始块
16   起始页面号
20   加载地址
 在搬运代码过程中,会从起始块,起始页面开始,搬运偏移地址8内的页面数。支持不同块连续页的搬运,至于如何得到上面的描述符,UBL会从第二个块遍历第24个块的第0页,d读取是否存在描述符。
 头信息描述符为0x55424cBB 表示为U-BOOT为bin_image格式,此时偏移地址20的内容为U-BOOT需要载入SDRAM的地址,即在U-BOOT定义的TEXT_BASE = 0xc1080000 ,当代码被搬运进DDR后,将偏移地址4中的入口地址取出,强制转化为一个空类型空参数的函数指针并赋值给一个函数,然后调用该函数就跳转到U-BOOT的入口地址运行了。代码如下:
108   APPEntry = (void (*)(void)) gEntryPoint;
109   (*APPEntry)();
到此U-BOOT就已经BOOT起来了。

原创粉丝点击