IMX515有个内置的BOOTROM,保存了nebulizer的ROM boot code,在CPU复位是,ROM code会先把自己从内部的ROM中拷贝到内部的RAM中。
1. ROM code的主要工作
ROM code通过GPIO引脚的电平来决定识别启动的介质,从而决定了不同的启动流程。对于基于SD/MMC启动来说,ROM code的主要工作如下:
⑴把eSDHC设备上最开始的2KB数据拷贝到CPU的IRAM(内部的)中。其中第1KB是一般的eSDHC存储设备第一个sector(512Bytes,用作MBR,也就是主分区记录)和其他数据。第2KB数据是以Flash header开始的xldr镜像。
⑵拷贝出2KB数据到IRAM的0x1FFE2000(见下图)后,读取Flashheader的数据,主要用来完成一些诸如解密、初始化等工作,其中初始化工作主要包括时钟、内部总线、外部存储设备的控制器以及外部存储设备的初始化。
图1
⑶继续将剩余的xldr拷贝到IRAM中,然后跳转到xldr的入口函数StartUp执行,到此ROM code的工作就全部完成,控制流程就转到xldr这边了。
图2
图2是ROM code把xldr的1KB MBR+8KB xldr拷贝到内容IRAM涉及的内存区域。
2. Xldr_init.s
Xldr中主要的汇编代码文件有xldr.s和xldr_init.s,其中xldr_init.s为flash文件头定义,而xldr.s才是真正的可执行汇编文件。下面贴出xldr_init.s文件的主要部分:
IMAGE_HDR_SIZE EQU 0x800 ; 2 KB for image header and CSF
FLASH_HDR_SIZE EQU 0x28 ; 10 DWORD = 40 B
CSF_SIZE EQU (IMAGE_HDR_SIZE -FLASH_HDR_SIZE)
//CSF指certificate and command sequence file data: 证书和命令序列文件//数据
………………
XLDR_FLASH_HDR
DCD StartUp ; image entry point
DCD 0xB1 ; barker code
DCD (XLDR_FLASH_HDR + FLASH_HDR_SIZE) ;pointer to CSF
DCD XLDR_DCD_PTR ; pointer to DCD pointer
DCD hab_super_root_key ; pointer to SRK struct
XLDR_DCD_PTR
DCD XLDR_DCD_DATA ; pointer to DCD table
; This is the IRAM destination address thatrom code will copy
; image (1K MBR + 8K XLDR) from card to. Asxldr link address is 0x1FFEA000
; and the first 4 K jump page is choppedoff, the xldr.nb0 needs to be
; on address 0x1FFEB000, so that absoluteaddressing can be used in xldr.
; Consequently, the card image needs to beon address 0x1FFEAC00.
DCD 0x1FFEAC00
XLDR_DCD_DATA
DCD 0xB17219E9 ; barker code for DCD
DCD 0x0 ; length of DCDdata is 0, which means no DCD table
;应该是DCD段的数据的,但WINCE6.0中没有使用,android使用了。
DCD 0x2400 ; total length of image oncard (1K MBR + 8K XLDR)
XLDR_CSF_DATA
RESERVE_CSF CSF_SIZE ; reserved regsion for CSF data
END
xldr_init.s就是编译此文件生成的内容就是FLASH_HDR_T结构体的内容,为了更好理解,下面先来看此结构体:
typedef struct
{
UINT32 *app_code_jump_vector;
UINT32 app_code_barker;
UINT32 *app_code_csf;
HWCFG_T **hwcfg;
hab_rsa_public_key *super_root_key;
HWCFG _T *hwcfg_ptr;
UINT32 *app_dest_ptr;
}FLASH_HDR_T;
⑴ app_code_jump_vector
是指向第一条可执行指令的指针,这里其实就是xldr的入口函数StartUp,而且此指针的值就是0x1FFEAC00。
⑵app_code_barker
用于表示flash文件头已经存在的巴克码,对应IMX51来说是0x000000B1。
⑶app_code_csf
指向CSF数据的指针,IMX515没有用到。
⑷hwcfg
指向DCD(Device configurationTable,设备配置表)段的指针的指针,它指向flash文件头结构体的*hwcfg_ptr。
⑸ super_root_key
指向hab_super_root_key结构体类型变量的指针,主要用于加密启动:
typedef struct
{
UINT8 rsa_exponent[MAX_EXP_SIZE]; /* RSA public exponent */
UINT8 *rsa_modulus; /* RSAmodulus pointer */
UINT16 exponent_size; /*Exponent size in bytes */
UINT16 modulus_size; /*Modulus size in bytes */
BOOL init_flag; /*Indicates if key initialized */
} hab_rsa_public_key;
这个功能可用于授权启动设备,但目前没有使用,后续在深入,相关信息见CPU的IC Identification这一章,如下图:
图3
⑹ hwcfg_ptr
指向HWCFG _T结构体的指针,下面给出此结构体的定义:
typedef struct
{
HWCFG_PREAMBLE_T preamble;/*DCD端数据头*/
HWCFG_TYPE_ADDR_DATA_T type_addr_data;/*Array oftype/address/data elements*/
}HWCFG_T;
Preamble是DCD段的数据头,其指向的结构体定义如下
typedef struct
{
UINT32 barker; /**用于检查DCD段存在的巴克码/
UINT32 length; /*不包含DCD数据头的DCD段数组长度*/
}HWCFG_PREAMBLE_T;
typedef struct
{
UINT32 type; /*指针数据类型(byte,halfword,word,wait/read)*/
UINT32 *addr; /*把DCD数据写入的寄存器地址*/
UINT32 data; /*把DCD数据写入的寄存器的值*/
}HWCFG_TYPE_ADDR_DATA_T;
结合xldr_init.s文件的内容,可以得出FLASH_HDR_T结构体的值及说明如下:
图4