各位好,
我们自己设计的板子,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的频率。