Tool/software: Linux
hi
i got a question regarding how ddr_pll_config() works in u-boot-2016.Extracted from processor sdk 03.02.00.05.
generally the DDR init code is like this in board/ti/am335x/board.c:
void sdram_init(void)
{
if (board_is_evm_sk()) {
/*
* EVM SK 1.2A and later use gpio0_7 to enable DDR3.
* This is safe enough to do on older revs.
*/
gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en");
gpio_direction_output(GPIO_DDR_VTT_EN, 1);
}
if (board_is_icev2()) {
gpio_request(ICE_GPIO_DDR_VTT_EN, "ddr_vtt_en");
gpio_direction_output(ICE_GPIO_DDR_VTT_EN, 1);
}
if (board_is_evm_sk())
config_ddr(303, &ioregs_evmsk, &ddr3_data,
&ddr3_cmd_ctrl_data, &ddr3_emif_reg_data, 0);
else if (board_is_bone_lt())
config_ddr(400, &ioregs_bonelt,
&ddr3_beagleblack_data,
&ddr3_beagleblack_cmd_ctrl_data,
&ddr3_beagleblack_emif_reg_data, 0);
else if (board_is_evm_15_or_later())
config_ddr(400, &ioregs_etcs, &ddr3_etcs_data,
&ddr3_etcs_cmd_ctrl_data, &ddr3_etcs_emif_reg_data,
0);
else if (board_is_icev2())
config_ddr(400, &ioregs_evmsk, &ddr3_icev2_data,
&ddr3_icev2_cmd_ctrl_data, &ddr3_icev2_emif_reg_data,
0);
else
config_ddr(266, &ioregs, &ddr2_data,
&ddr2_cmd_ctrl_data, &ddr2_emif_reg_data, 0);
}
now.
for a 400MHz DDR. it should be like:
config_ddr(400, &ioregs_evmsk, &ddr3_icev2_data,
&ddr3_icev2_cmd_ctrl_data, &ddr3_icev2_emif_reg_data,
0);
Right?
as you can see the config_ddr() is like:
void config_ddr(unsigned int pll, const struct ctrl_ioregs *ioregs,
const struct ddr_data *data, const struct cmd_control *ctrl,
const struct emif_regs *regs, int nr)
{
ddr_pll_config(pll);
#ifndef CONFIG_TI816X
config_vtp(nr);
#endif
config_cmd_ctrl(ctrl, nr);
config_ddr_data(data, nr);
#ifdef CONFIG_AM33XX
config_io_ctrl(ioregs);
...
It calls ddr_pll_config() to set the ddr pll .
what's strange is . the definition of ddr_pll_config is :
void __weak ddr_pll_config(unsigned int ddrpll_m)
{
}
and there's nothing in the inside.
there is indeed a definition is clock_ti814x.c. But this file is not even compiled with am335x_evm_defconfig
but even in clock_ti814x.c.
it's also strange:
void ddr_pll_config(unsigned int ddrpll_m)
{
pll_config(DDR_PLL_BASE, DDR_N, DDR_M, DDR_M2, DDR_CLKCTRL, 1);
}
the parameter "ddrpll_m" is not even used inside the function.
i really got confused here...
normally ddr_pll_config() should do something like configuring the CM_CLKSEL_DPLL_DDR register.Right? How come it be empty?
yandong