在G870中,C版的SDRAM为128MB(DDR2),E版的SDRAM为64MB(MDDR),它们在系统存储空间的基地址都为0x8000_0000,具体见iMAX25RM的数据手册:
在uboot中,我们必须设置好这些参数,主要是基地址和SDRAM的大小等。这里主要采用到了uboot的一个全局的结构体变量: bd_t : board info数据结构定义,位于文件 include/asm-arm/u-boot.h。主要是用来保存板子参数。
typedef struct bd_info {
int bi_baudrate; /* serial console baudrate 串口波特率 */
unsigned long bi_ip_addr; /* IPAddress IP 地址 */
unsignedchar bi_enetaddr[6]; /*Ethernet adress MAC地址*/
structenvironment_s *bi_env; //结构体变量定义见46行
ulong bi_arch_number; /* uniqueid for this board 板子的id*/
ulong bi_boot_params; /*where this board expects params 启动参数*/
struct /* RAM configuration RAM 配置*/
{
ulong start;
ulong size;
} bi_dram[CONFIG_NR_DRAM_BANKS];
}bd_t;
其中红色部分为关于RAM的配置,初始化为:
int dram_init(void){
#ifdef CONFIG_MX25_MDDR
gd->bd->bi_dram[0].start = PHYS_SDRAM_1; // PHYS_SDRAM_1为0x8000_0000
gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
#else
gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
if(CONFIG_NR_DRAM_BANKS == 2) // 其中CONFIG_NR_DRAM_BANKS = 1 ,因为只有一个BANKS
{
gd->bd->bi_dram[1].start = PHYS_SDRAM_2;
gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE;
}
#endif
return 0;
}
这样,就设置好了RAM的参数。接下来就是设置SDRAM的控制寄存器了,这里不再介绍。