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.

请问OMAPL138 LCDK的PLLDIV3在哪里配置的?

Other Parts Discussed in Thread: OMAP-L138, AM1808, SYSBIOS

想知道OMAPL138-LCDK的PLLDIV3配置的多少,以及在哪里配置的,从“http://processors.wiki.ti.com/index.php/L138/C6748_Development_Kit_(LCDK)#How_to_setup_a_C6748_Development_Kit_.28LCDK.29”下载了ti-sdk-omapl138-lcdk-01.00.00,但是在u-boot和kernel里面找不到完整的配置PLLDIV3的地方,同时有个文件夹名为ubl,但是也没有这个寄存器的配置。同事发给我一个armubl-03.20.00.14,里面有PLLDIV3的配置,但不知道是不是OMAPL138-LCDK的配置。请问OMAPL138 LCDK的PLLDIV3在哪里配置的?

  • 从LCDK_AISGen_Config.cfg看到,

    PLL0 Div3=5,是这样的吗?

  • 在ti-sdk-omapl138-lcdk-01.00.00/host-tools/flash_utils/OMAP-L138_FlashAndBootUtils_2_40/OMAP-L138/Common/src/device.c中看到:

    Uint32 DEVICE_PLL0Init(Uint8 clk_src, Uint8 pllm, Uint8 prediv, Uint8 postdiv, Uint8 div1 ,Uint8 div3, Uint8 div7);

      #if defined(AM1808)
        // CPU(s) at 456 MHz
        status |= DEVICE_PLL0Init(0, 18, 0, 0, 0, 18, 8);
      #else
        // CPU(s) at 300 MHz
        status |= DEVICE_PLL0Init(0, 24, 0, 1, 0, 11, 5);
      #endif 

    如果工作频率在300M,那么PLLDIV3设置的就是11吧,而armubl-03.20.00.14中PLL0的PLLDIV3设置的就是默认值2。

  • 《OMAP-L138_LCDK_Linux_SDK_Getting_Started_Guide》里面提到的LCDK软件列表LCDK Linux SDK Main Software Components,里面包含如下软件,但是没有UBL:

    U-boot source
    Linux Kernel source 
    ARMv5 File System 
    GCC Tool Chain 
    SysBIOS
    SysLink
    C6x Tool Chain 

  • 一般PLL都是在bootloader里面配置的

    不同SDK的BOOTLOADER不一样

    建议在UBL或者UBOOT下面找找

  • Denny Yang 说:

    一般PLL都是在bootloader里面配置的

    不同SDK的BOOTLOADER不一样

    建议在UBL或者UBOOT下面找找

     

    谢谢,我在整个LCDK包中找了,请问知道哪里可以下载LCDK编译安装的文档吗?

  • http://software-dl.ti.com/sdoemb/sdoemb_public_sw/mcsdk/latest1/index_FDS.html

  • 多谢多谢!

    还是没有提到UBL的事情,而且安装之后,直接通过TFTP下载,是不是UBL已经烧在板子上,不对用户开放?如果把flash全部擦除,如何从头操作?

  • ubl也是需要手动烧写进去的

    如果找不到ubl可能是现在最新的SDK可能已经没有ubl了,直接uboot搞定

  • 是的,也用过别家ARM,就没用UBL,而是把uboot分成两段,第一段叫SPL,相当于UBL吧

  • 对的

    我们也有的叫MLO

  • Peter Fan2 说:
    如果工作频率在300M,那么PLLDIV3设置的就是11吧,而armubl-03.20.00.14中PLL0的PLLDIV3设置的就是默认值2。

    上面这个函数是配置PLL的,不过上面这个11设的有点太大了,把SYSCLK3配成25MHz了,可以配置成100MHz, 即设为2.

    还有,上面这个是flash utility的,里面的UBL和SFT共用了这个device.c,如果你的boot过程采用了UBL,那么这个配置就会生效,如果直接从UBOOT启动,则与这个文件无关了。

    从uboot直接启动的话,按照下面链接说明在转换AIS文件时加入配置。

    http://processors.wiki.ti.com/index.php/Building_PSP_Components_for_OMAP-L1x_on_v3.x_Kernel#AIS_image_generation_for_omapl138_LCDK_EVM

  • 翻了一下mcsdk里的uboot源码,PLL的配置在Da850_lowlevel.c里有配置:

    int arch_cpu_init(void)
    {
    /* Unlock kick registers */
    writel(DV_SYSCFG_KICK0_UNLOCK, &davinci_syscfg_regs->kick0);
    writel(DV_SYSCFG_KICK1_UNLOCK, &davinci_syscfg_regs->kick1);

    dv_maskbits(&davinci_syscfg_regs->suspsrc,
    CONFIG_SYS_DA850_SYSCFG_SUSPSRC);

    /* configure pinmux settings */
    if (davinci_configure_pin_mux_items(pinmuxes, pinmuxes_size))
    return 1;

    #if defined(CONFIG_SYS_DA850_PLL_INIT)
    /* PLL setup */
    da850_pll_init(davinci_pllc0_regs, CONFIG_SYS_DA850_PLL0_PLLM);
    da850_pll_init(davinci_pllc1_regs, CONFIG_SYS_DA850_PLL1_PLLM);
    #endif

    int da850_pll_init(struct davinci_pllc_regs *reg, unsigned long pllmult)
    {
    if (reg == davinci_pllc0_regs)
    /* Unlock PLL registers. */
    clrbits_le32(&davinci_syscfg_regs->cfgchip0, PLL_MASTER_LOCK);

    /*
    * Set PLLENSRC '0',bit 5, PLL Enable(PLLEN) selection is controlled
    * through MMR
    */
    clrbits_le32(&reg->pllctl, PLLCTL_PLLENSRC);
    /* PLLCTL.EXTCLKSRC bit 9 should be left at 0 for Freon */
    clrbits_le32(&reg->pllctl, PLLCTL_EXTCLKSRC);

    /* Set PLLEN=0 => PLL BYPASS MODE */
    clrbits_le32(&reg->pllctl, PLLCTL_PLLEN);

    da850_waitloop(150);

    if (reg == davinci_pllc0_regs) {
    /*
    * Select the Clock Mode bit 8 as External Clock or On Chip
    * Oscilator
    */
    dv_maskbits(&reg->pllctl, ~PLLCTL_RES_9);
    setbits_le32(&reg->pllctl,
    (CONFIG_SYS_DV_CLKMODE << PLLCTL_CLOCK_MODE_SHIFT));
    }

    /* Clear PLLRST bit to reset the PLL */
    clrbits_le32(&reg->pllctl, PLLCTL_PLLRST);

    /* Disable the PLL output */
    setbits_le32(&reg->pllctl, PLLCTL_PLLDIS);

    /* PLL initialization sequence */
    /*
    * Power up the PLL- PWRDN bit set to 0 to bring the PLL out of
    * power down bit
    */
    clrbits_le32(&reg->pllctl, PLLCTL_PLLPWRDN);

    /* Enable the PLL from Disable Mode PLLDIS bit to 0 */
    clrbits_le32(&reg->pllctl, PLLCTL_PLLDIS);

    #if defined(CONFIG_SYS_DA850_PLL0_PREDIV)
    /* program the prediv */
    if (reg == davinci_pllc0_regs && CONFIG_SYS_DA850_PLL0_PREDIV)
    writel((PLL_DIVEN | CONFIG_SYS_DA850_PLL0_PREDIV),
    &reg->prediv);
    #endif

    /* Program the required multiplier value in PLLM */
    writel(pllmult, &reg->pllm);

    /* program the postdiv */
    if (reg == davinci_pllc0_regs)
    writel((PLL_POSTDEN | CONFIG_SYS_DA850_PLL0_POSTDIV),
    &reg->postdiv);
    else
    writel((PLL_POSTDEN | CONFIG_SYS_DA850_PLL1_POSTDIV),
    &reg->postdiv);

    /*
    * Check for the GOSTAT bit in PLLSTAT to clear to 0 to indicate that
    * no GO operation is currently in progress
    */
    while ((readl(&reg->pllstat) & PLLCMD_GOSTAT) == PLLCMD_GOSTAT)
    ;

    if (reg == davinci_pllc0_regs) {
    writel(CONFIG_SYS_DA850_PLL0_PLLDIV1, &reg->plldiv1);
    writel(CONFIG_SYS_DA850_PLL0_PLLDIV2, &reg->plldiv2);
    writel(CONFIG_SYS_DA850_PLL0_PLLDIV3, &reg->plldiv3);
    writel(CONFIG_SYS_DA850_PLL0_PLLDIV4, &reg->plldiv4);
    writel(CONFIG_SYS_DA850_PLL0_PLLDIV5, &reg->plldiv5);
    writel(CONFIG_SYS_DA850_PLL0_PLLDIV6, &reg->plldiv6);
    writel(CONFIG_SYS_DA850_PLL0_PLLDIV7, &reg->plldiv7);
    } else {
    writel(CONFIG_SYS_DA850_PLL1_PLLDIV1, &reg->plldiv1);
    writel(CONFIG_SYS_DA850_PLL1_PLLDIV2, &reg->plldiv2);
    writel(CONFIG_SYS_DA850_PLL1_PLLDIV3, &reg->plldiv3);
    }

    上面配置值的宏定义在Da850evm.h里,如果要修改,改这些宏定义的值就可以了:

    /*
    * PLL configuration
    */
    #define CONFIG_SYS_DV_CLKMODE 0
    #define CONFIG_SYS_DA850_PLL0_POSTDIV 1
    #define CONFIG_SYS_DA850_PLL0_PLLDIV1 0x8000
    #define CONFIG_SYS_DA850_PLL0_PLLDIV2 0x8001
    #define CONFIG_SYS_DA850_PLL0_PLLDIV3 0x8002
    #define CONFIG_SYS_DA850_PLL0_PLLDIV4 0x8003
    #define CONFIG_SYS_DA850_PLL0_PLLDIV5 0x8002
    #define CONFIG_SYS_DA850_PLL0_PLLDIV6 CONFIG_SYS_DA850_PLL0_PLLDIV1
    #define CONFIG_SYS_DA850_PLL0_PLLDIV7 0x8005

    #define CONFIG_SYS_DA850_PLL1_POSTDIV 1
    #define CONFIG_SYS_DA850_PLL1_PLLDIV1 0x8000
    #define CONFIG_SYS_DA850_PLL1_PLLDIV2 0x8001
    #define CONFIG_SYS_DA850_PLL1_PLLDIV3 0x8003

    #define CONFIG_SYS_DA850_PLL0_PLLM 24
    #define CONFIG_SYS_DA850_PLL1_PLLM 21

  • 多谢回复,我们使用和LCDK相同的Flash芯片,但是Flash总是会出现比特翻转甚至大面积数据近乎清零,我们Flash时钟频率25M,也时长发生这种情况,请问能帮我们分析可能发生此情况的原因吗?比如内核中有一部分数据突然编程下面的样子,每个字节只有零星的“1”,大部分变成了“0”,从而导致内核CRC校验错误或文件系统不能启动或出错。

    00 00 02 00 10 08 01 00 00 04 01 82 10 08 00 08
    00 84 00 00 01 00 00 00 11 44 02 00 00 00 20 04
    00 00 12 00 00 82 10 00 00 10 01 2C 11 00 80 00
    08 04 00 08 11 00 11 00 04 08 01 00 00 00 20 0A
    20 00 00 00 20 40 01 08 00 00 01 00 00 00 00 05
    22 42 00 00 00 40 14 08 08 80 20 20 01 00 00 00
    40 80 00 00 00 04 00 01 00 00 00 00 38 80 20 88
    20 00 04 00 10 40 04 00 00 00 00 08 00 80 00 00
    00 80 00 00 20 00 00 00 00 00 24 00 81 00 20 08
    00 00 00 00 28 00 20 00 20 84 00 00 00 00 30 00
    02 00 00 05 00 00 14 40 02 00 10 01 84 00 20 00
    00 08 04 00 00 00 00 14 00 88 00 A2 04 80 20 00
    11 10 04 00 20 80 10 00 70 00 05 00 00 00 00 00
    00 02 20 00 A0 00 00 02 20 00 00 00 00 88 09 08
    03 02 10 00 A0 00 00 00 10 00 20 04 05 00 00 00
    04 00 22 00 10 00 0A 00 00 11 10 00 20 04 00 00

  • 多谢再次如此详细的回复,因为使用的uboot版本不同,MCSDK使用的uboot-2012,我们使用的uboot-2010,没有da850_lowlevel.c,也没有PLLDIVx的设置,完全依赖UBL的配置。而且我们的设备没有设计网卡,所以没有使用uboot,而是使用UBL直接载入了内核,烧写使用JTAG+NandWriter。

  • 这个问题建议还是需要先判断一下是软件还是硬件的问题。

    因为你的软件改动比较多,能否用TI最新的SDK来实验,看看这个问题是否还在?