This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Linux/AM3354: DDR PLL configuration

Part Number: AM3354

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