标签:s5pv210 cortex-a8 arm linux 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> //包含配置头文件config.h
#include <asm/arch/mx6.h> //包含配置头文件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
标签:s5pv210 cortex-a8 arm linux ddr3
原文地址:http://blog.csdn.net/u010346967/article/details/46551373