U-Boot移植_DDR3移植

                                                                      疯雨-版权所有,转载请注明【http://blog.csdn.net/u010346967】

U-Boot移植_DDR3移植:首先在这里感谢网友fengtian的整理,没有你就没有这篇文章

在系统上电后,CPU并不知道外部的RAM是什么类型的存储器,因此U-Boot需要对CPU进行RAM初始化设置,然后将程序拷贝到RAM中运行。

本系统采用的RAM是DDR3类型存储芯片,容量是4GB,频率是1066KHz;系统从eMMC中启动。采用的是U-Boot-2009版,linux3.0.35系统内核,U-Boot对DDR3的配置在board/max6q/flash_header.S文件中,下面根据源代码对DDR3移植进行详细描述。

 

#include                          //包含配置头文件config.h

#include                   //包含配置头文件mx6.h

 

#ifdef        CONFIG_FLASH_HEADER     //if语句判断是否如果定义了CONFIG_FLASH_HEADER

#ifndef CONFIG_FLASH_HEADER_OFFSET   //如果没有定义CONFIG_FLASH_HEADER_OFFSET

# error "Must define the offset offlash header"  //提示"Mustdefine the offset of flash header"错误

#endif                            //结束ifndef

/**************************大小端转换函数*************************************/

/*ARM架构的CPU的数据支持大端和小端存储,而指令支持小端存储。由于程序编写时我们的习惯是大端,所以要进行大小端变换,将数据转换为小端格式。现代计算机中内存空间都是按照byte划分的,因此按照字节进行转换*/

#define CPU_2_BE_32(l) \                       //定义CPU_2_BE_32(l)函数

    ((((l) & 0x000000FF) << 24) | \        //取l中低7-0位,左移24位,既放在31-24位

         (((l)& 0x0000FF00) << 8)  | \        //取l中的15-8位,左移8位,放在23-16位

         (((l)& 0x00FF0000) >> 8)  | \        //取l中的23-16位,右移8位,放在15-8位

         (((l)& 0xFF000000) >> 24))          //取l中的31-24位,右移24位,放在7-0位

 

/****************************定义MXC_DCD_ITEM宏*************************/

/*ARM指令:4字节对齐,Thumb指令:2字节对齐*/

#define MXC_DCD_ITEM(i, addr, val)   \    //定义函数MXC_DCD_ITEM(i, addr, val),参数为//i, addr, val

/* dcd_node_ i,##为连接符,将dcd_node_与//i连接,dcd_node_i为标号名称。*/

/* dcd_node_##i:(Tab).wordCPU_2_BE_32(addr)是将CPU_2_BE_32(addr)的值直接放到dcd_node_##i位置。即: dcd_node_##i代表CPU_2_BE_32(addr)的值。汇编和C引用变量的不同:汇编是“绝对”引用,即没有指针的概念,引用得到的就是值;c语言是“间接”引用,相当于指针的概念,引用地址变量,得到的就是该变量所指的内容值。[标号名称]:(Tab).word 是汇编word标号的格式*/

/*ARM指令:4字节对齐,Thumb指令:2字节对齐。在执行完dcd_node_##i:(Tab).wordCPU_2_BE_32(addr)后,dcd_node_##i 对应的下一个地址放的是.word CPU_2_BE_32(val)*/

dcd_node_##i:                     \ 

        .wordCPU_2_BE_32(addr)  

       .word CPU_2_BE_32(val)      

/***************************定义段*******************************************/

/* b  _start跳到_start函数开始执行,_start函数在U-boot-2009.08/Cpu/Arm_cortexa8/start.S中定义,b是相对跳转指令符号。.org是将其后面的程序保存到org指定的地址上*/

.section ".text.flasheader","x"               //定义段.text.flasheader,类型为x执行段。

         b       _start 

         .org  CONFIG_FLASH_HEADER_OFFSET    //将如下程序保存到

//CONFIG_FLASH_HEADER_OFFSET地址

/*定义ivt_header标号,根据参考手册第433页IVT HeaderFormat定义,IVT Header Format的格式是[Tag] [Length] [Version],Tag是单字节数据,设置为0xD1。 Length是双字节大端数据,长度固定且只能为32 bytes。Version是单字节数据,设置为0x40 or 0x41。进行大小端转化后,得到0x402000D1。*/

ivt_header:       .word 0x402000D1 /* Tag=0xD1,Len=0x0020, Ver=0x40 */

app_code_jump_v:  .word _start           //定义标号app_code_jump_v,值为_start

reserv1:          .word 0x0              //定义标号reserv1,值为0x0

dcd_ptr:          .word dcd_hdr          //定义标号dcd_ptr,值为dcd_hdr

boot_data_ptr:          .word boot_data       //定义标号boot_data_ptr,值为boot_data

self_ptr:         .word ivt_header        //定义标号self_ptr,值为ivt_header

app_code_csf:     .word 0x0             //定义标号app_code_csf,值为0x0

reserv2:          .word 0x0             //定义标号reserv2,值为0x0

 

/*定义标号boot_data,值为TEXT_BASE,TEXT_BASE在config.mk中定义,其值为0x27800000。*/

boot_data:        .word TEXT_BASE     

/*定义标号image_len,值为_end_of_copy  - TEXT_BASE + CONFIG_FLASH_HEADER_OFFSET,_end_of_copy在u-boot.lds中定义,_end_of_copy = .; /* end_of ROM copy code here */CONFIG_FLASH_HEADER_OFFSET在u-boot-2009.08/include/configs/mx6q.h中定义,“#defineCONFIG_FLASH_HEADER_OFFSET 0x400”*/

image_len:        .word _end_of_copy  - TEXT_BASE + CONFIG_FLASH_HEADER_OFFSET

plugin:           .word 0x0   //定义标号plugin,值为0x0

 

你可能感兴趣的:(bootloader篇)