long clk_round_rate(struct clk *clk, unsigned long rate) //获取时钟频率 unsigned long clk_get_rate(struct clk *clk) //设置时钟频率 int clk_set_rate(struct clk *clk, unsigned long rate) 准备/使能clk: /* 开时钟前调用,可能会造成休眠,所以把休眠
比如CAN的输入参考时钟频率:freqCAN_REF_CLK = 24MHz 波特率分频值:can.BRPR[BRP] = 29 那么时间份额频率:freqTQ_CLK = 24MHz / (29+1) = 800KHz 设置同步跳转宽度为 3、相位缓冲段1为 2、相位缓冲段2位 15 CAN波特率:freqBIT_RATE = 24MHz / ((29+1)*(3+2+15) = 40kbps 而波特率的分频系...
int clk_enable(struct clk *clk); void clk_disable(struct clk *clk); unsigned long clk_get_rate(struct clk *clk); void clk_put(struct clk *clk); long clk_round_rate(struct clk *clk, unsigned long rate); int clk_set_rate(struct clk *clk, unsigned long rate); int clk_set_parent(...
首先通过clk_get函数,根据clk节点的名字,获取clk节点。然后,使用clk_set_rate() 函数设置clk节点的时钟。clk_set_rate() 函数最终将会调用clk节点对象的成员函数clk->set_rate() 设置时钟。 层次关系如下图所示: 驱动层 1. 驱动层与porting层之间的api 驱动层与porting层之间的api,定义在include/linux/clk.h...
parent - clk是由parent分出来的。那么如果parent关闭了,当前clk也就没有了。 secondary - 第二时钟源,用于enable/disable当前clk。 usecount - 引用计数。 get_rate, set_rate, enable, disable, set_parent - 很显然,这些函数指针指到实际操作的函数。clk.h中的各接口函数最后都会调用到这里的函数指针。函数...
ret = clk_set_rate(clkp, rounded_rate); 2. 例子:LCD clk 设置 LCD 时钟框图: 从图中可以清晰的看到,LCD functional clk有多个时钟src,实际使用的有PLL1624M,PLL1416M和PLL3,它有两个MUX,外部的MUX由APMU寄存器控制,决定是选择PLL1624M还是PLL1416M,然后通过内部寄存器LCD_SCLK_DIV在外部选择的clk src和...
intclk_set_rate(structclk*clk,unsignedlongrate) 准备/使能clk: /*开时钟前调用,可能会造成休眠,所以把休眠部分放到这里,可以原子操作的放到enable里*/ intclk_prepare(structclk*clk) /*停止clock后的善后工作,可能会睡眠。*/ voidclk_unprepare(structclk*clk) ...
u8 clk_gate_flags, spinlock_t *lock); 3. divider clock 这一类clock可以设置分频值(因而会提供.recalc_rate/.set_rate/.round_rate回调),可通过下面两个接口注册: struct clk *clk_register_divider(struct device *dev, const char *name, const char *parent_name, unsigned long flags, ...
框架层主要分配两个对象,一个struct clk对象,另外一个是struct clk_core对象 clk框架层主要通过这两个结构管理时钟。 我们看clk_register()实现: /** * clk_register - allocate a new clock, register it and return an opaque cookie * @dev: device that is registering this clock ...
u8 clk_gate_flags,spinlock_t*lock) ; 3. divider clock 这一类clock可以设置分频值(因而会提供.recalc_rate/.set_rate/.round_rate回调),可通过下面两个接口注册: struct clk *clk_register_divider(struct device *dev,constchar*name, constchar*parent_name,unsignedlongflags, ...