标签:
在 /board/freescale/t104xrdb/ddr.c文件的initdram函数中
phys_size_t initdram(int board_type)
{
phys_size_tdram_size;
#if defined(CONFIG_SPL_BUILD) || !defined(CONFIG_RAMBOOT_PBL)
puts("Initializing....usingSPD\n");
dram_size= fsl_ddr_sdram();
dram_size = setup_ddr_tlbs(dram_size / 0x100000);
dram_size*= 0x100000;
#else
dram_size= fsl_ddr_sdram_size();
#endif
returndram_size;
}
从C语言角度来看,获取spd的过程本质上就是要对dram_size进行赋值的过程。
#############################################################
drivers/ddr/fsl/main.c/fsl_ddr_sdram调用了__fsl_ddr_compute函数
drivers/ddr/fsl/main.c/__fsl_ddr_compute函数中调用乐fsl_ddr_compute函数
fsl_ddr_compute函数中定义了获取SPD信息的函数。
case STEP_GET_SPD:
#if defined(CONFIG_DDR_SPD) || defined(CONFIG_SPD_EEPROM)
/*STEP 1: Gather all DIMM SPD data */
for(i = first_ctrl; i <= last_ctrl; i++) {
fsl_ddr_get_spd(pinfo->spd_installed_dimms[i],i,
dimm_slots_per_ctrl);
}
#############################################################
drivers/ddr/fsl/main.c/fsl_ddr_compute函数中调用了
compute_lowest_common_dimm_parameters函数.
compute_lowest_common_dimm_parameters该函数定义于/drivers/ddr/fsl/ls_common_dimm_params.c
在compute_lowest_common_dimm_parameters中定义打印了在uboot启动时显示的Detected UDIMM 18KSF51272AZ-1G6K1这句话,具体代码为:
#ifndef CONFIG_SPL_BUILD
printf("Detected UDIMM %s\n",
dimm_params[i].mpart);
#endif
############################################################
fsl_ddr_sdram_size函数定义在/drivers/ddr/fsl/main.c文件下:
/*
* fsl_ddr_sdram_size(first_ctrl,last_intlv) - This function only returns the
* sizeof the total memory without setting ddr control registers.
*/
phys_size_t
fsl_ddr_sdram_size(void)
{
fsl_ddr_info_t info;
unsignedlong long total_memory = 0;
memset(&info,0 , sizeof(fsl_ddr_info_t));
info.mem_base = CONFIG_SYS_FSL_DDR_SDRAM_BASE_PHY;
info.first_ctrl= 0;
info.num_ctrls= CONFIG_SYS_FSL_DDR_MAIN_NUM_CTRLS;
info.dimm_slots_per_ctrl= CONFIG_DIMM_SLOTS_PER_CTLR;
info.board_need_mem_reset= NULL;
/* Compute it once normally. */
total_memory= fsl_ddr_compute(&info, STEP_GET_SPD, 1);
returntotal_memory;
}
在同一文件下定义了fsl_ddr_compute函数,该函数在STEP1时调用了fsl_ddr_get_spd函数对i2c总线进行操作,获取DIMM内存条上的spd信息,具体如下:
/* STEP 1: Gather all DIMM SPD data */
for (i = first_ctrl; i <= last_ctrl; i++){
fsl_ddr_get_spd(pinfo->spd_installed_dimms[i],i,
dimm_slots_per_ctrl);
}
那么fsl_ddr_get_spd才是移植的时候应该重点关注的函数, 还是在/drivers/ddr/fsl/main.c文件下定义了fsl_ddr_get_spd函数。
void fsl_ddr_get_spd(generic_spd_eeprom_t *ctrl_dimms_spd,
unsigned int ctrl_num, unsigned int dimm_slots_per_ctrl)
{
}
这个空出来的函数即是需要关注的函数
spd.从DIMM内存条I2C设备移植到扣板NOR_FLASH
标签:
原文地址:http://blog.csdn.net/huchuan1985/article/details/51344670