5、timer_load_val是一个全局变量,顾名思义它是装入TCNTB4寄存器的值。看下面的注释:
/*
* for 10 ms clock period @ PCLK with 4 bit divider = 1/2
* (default) and prescaler = 16. Should be 10390
* @33.25MHz and 15625 @ 50 MHz
*/
它的意思是如果要将timer4的时钟周期设置为10ms的话,要通过PCLK、分配器divider默认的值1/2和prescaler = 16来设置如何设置(?)来看一下下面这个函数
/* return PCLK frequency */
ulong get_PCLK(void)
{
struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
return (readl(&clk_power->CLKDIVN) & 1) ? get_HCLK() / 2 : get_HCLK();
}
看看结构s3c24x0_clock_power
/* CLOCK & POWER MANAGEMENT (see S3C2400 manual chapter 6) */
/* (see S3C2410 manual chapter 7) */
struct s3c24x0_clock_power {
u32 LOCKTIME;
u32 MPLLCON;
u32 UPLLCON;
u32 CLKCON;
u32 CLKSLOW;
u32 CLKDIVN;
#if defined(CONFIG_S3C2440)
U32 CAMDIVN;
#endif
};
涵盖了所有时钟设置的寄存器,s3c24x0_get_base_clock_power();返回的是(struct s3c24x0_clock_power *)0x4C000000也就是时钟设置寄存器的起始地址
return (readl(&clk_power->CLKDIVN) & 1) ? get_HCLK() / 2 : get_HCLK();
判断一下CLKDIVN是不是被设置成了1,如果是说明PCLK = 1/2HCLK,不在去看get_HCLK了。前面我已经说过PCLK = 101.25MHz,至于timer_load_val = 101.25MHz / (2*16*100);这个公式,分析如下:
我们要设置timer4的时钟周期是T = 10ms;
又 T = [1 /(PCLK / (预分频器的值(prescaler)*分频器的值(div)))] *timer_load_val
已知T、PCLK、perscaler、div,就可以求的
timer_load_val = PCLK / (perscaler * div)
但是这里为什么会有100呢?(暂时不清楚,望大家给我一个解释)
timer_clk下面暂时没有遇到,先不考虑。