TI中文支持网
TI专业的中文技术问题搜集分享网站

am335x 怎么将clkout2设置为12MHz?

各位好,

    我们自己设计的板子,xdma_event_intr,直接从CPU出来接在TDA19988上,作为HDMI的12MHz时钟,请问应该怎么设置呢?原来clkout2为32.768khz,怎么将它改为12Mhz?

在board-am335xevm.c中

static struct pinmux_config clkout2_pin_mux[] = {
    {"xdma_event_intr1.clkout2", OMAP_MUX_MODE3 | AM33XX_PIN_OUTPUT},
    {NULL, 0},
};

static void clkout2_enable(int evm_id, int profile)
{
    struct clk *ck_32;

    ck_32 = clk_get(NULL, "clkout2_ck");
    if (IS_ERR(ck_32)) {
        pr_err("Cannot clk_get ck_32\n");
        return;
    }
    clk_enable(ck_32);
    setup_pin_mux(clkout2_pin_mux);
}

我在clock33xx_data.c中找到

static struct clk clkout2_ck = {
    .name        = "clkout2_ck",
    .parent        = &sysclkout_pre_ck,
    .ops        = &clkops_omap2_dflt,
    .clksel        = clkout2_div,
    .clksel_reg    = AM33XX_CM_CLKOUT_CTRL,
    .clksel_mask    = AM33XX_CLKOUT2DIV_MASK,
    .enable_reg    = AM33XX_CM_CLKOUT_CTRL,
    .enable_bit    = AM33XX_CLKOUT2EN_SHIFT,
    .recalc        = &omap2_clksel_recalc,
    .round_rate    = &omap2_clksel_round_rate,
    .set_rate    = &omap2_clksel_set_rate,
};

这里的parent, div是什么意思呢,应该怎么选取才能设置成12MHz?CM_CLKOUT_CTRL这个寄存器的值应该怎么确定?

Steven Liu1:

参考TRM手册的第八章,在8.1.6.11中,

对应的寄存器:CM_CLKOUT_CTRL:

Steven Liu1:

回复 Steven Liu1:

目前,我能想到的一种方式是选择LCD Pixel Clock作为源,在配置的过程中将这里设置为一个12MHz的倍频值,比如84MHz,然后在clkout2的分频中选择7,这样就能得到12MHz的时钟输出了。但这种设置的方式要看你是否使用了LCD,LCD的pixel clock是否已经有一些限制性的要求了。

Sean:

回复 Steven Liu1:

你好,

    感谢你的回复,但是我不太明白源,倍频,分频这些东西,这些配置是在clock33xx_data.c中吗?

比如下面这些是源吗?

/* Root clocks */static struct clk clk_32768_ck = {    .name        = "clk_32768_ck",    .rate        = 32768,    .ops        = &clkops_null,};/* On-Chip 32KHz RC OSC */static struct clk clk_rc32k_ck = {    .name        = "clk_rc32k_ck",    .rate        = 32000,    .ops        = &clkops_null,};/* Crystal input clks */static struct clk virt_19_2m_ck = {    .name        = "virt_19_2m_ck",    .rate        = 19200000,    .ops        = &clkops_null,};static struct clk virt_24m_ck = {    .name        = "virt_24m_ck",    .rate        = 24000000,    .ops        = &clkops_null,};static struct clk virt_25m_ck = {    .name        = "virt_25m_ck",    .rate        = 25000000,    .ops        = &clkops_null,};static struct clk virt_26m_ck = {    .name        = "virt_26m_ck",    .rate        = 26000000,    .ops        = &clkops_null,};static struct clk tclkin_ck = {    .name        = "tclkin_ck",    .rate        = 12000000,    .ops        = &clkops_null,};

倍频和分频的操作又是什么?希望你能为我答疑解惑,谢谢!!

Steven Liu1:

回复 Sean:

以下面这张图作为示例:

你在配置clkout2的时候,在对应寄存器中是需要选择其clock源的,和后面的分频的:clkout2=clock source / DIV

下面对clock source的配置,0就代表着32.768K,1代表L3FCLK(200MHz),这个源是不一样的。那个DIV可以选择从0-6,分别代表1/1, 1/2,…1/7.

举个例子,前面的寄存器配置为3,后面的选择1:那么这就代表了你选择了PER_CLKOUT_M2作为源,这个源是192MHz(可以从TRM手册里面找到),分频值选择了1/2,所以最终得到的CLKOUT2=192/2=96MHz。

至于你写的代码段的部分,查看一下其对应的含义吧,花点时间,不难懂。

user5063720:

回复 Steven Liu1:

你好,am437x类似的问题,希望clkout2输出24mhz,在am437x-gp-evm.dts和am43xx-clock.dtsi选择clkout2source为192mhz,但不知还应该怎样修改才能8分频得到24mhz的频率。

赞(0)
未经允许不得转载:TI中文支持网 » am335x 怎么将clkout2设置为12MHz?
分享到: 更多 (0)