IMX51+WINCE6.0基于SD_MMC启动---XLDR(2)之xldr_init.s

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这边了。

 IMX51+WINCE6.0基于SD_MMC启动---XLDR(2)之xldr_init.s_第1张图片

图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这一章,如下图:

IMX51+WINCE6.0基于SD_MMC启动---XLDR(2)之xldr_init.s_第2张图片

图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结构体的值及说明如下:

IMX51+WINCE6.0基于SD_MMC启动---XLDR(2)之xldr_init.s_第3张图片

图4

 

你可能感兴趣的:(IMX51+WINCE6.0基于SD_MMC启动---XLDR(2)之xldr_init.s)