Boot中timer定时器的设置(2)

上面的函数调用很复杂,不是讨论这个所以暂时不深究,直接看它调用arch/arm/cpu/arm920t/s3c24x0/timer.c文件中的函数int timer_init (void),代码如下:

int timer_init(void)
{
    struct s3c24x0_timers *timers = s3c24x0_get_base_timers();
    ulong tmr;

/* use PWM Timer 4 because it has no output */
    /* prescaler for Timer 4 is 16 */
    writel(0x0f00, &timers->TCFG0);
    if (timer_load_val == 0) {
        /*
        * 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
        */
        timer_load_val = get_PCLK() / (2 * 16 * 100);
        timer_clk = get_PCLK() / (2 * 16);
    }
    /* load value for 10 ms timeout */
    lastdec = timer_load_val;
    writel(timer_load_val, &timers->TCNTB4);
    /* auto load, manual update of Timer 4 */
    tmr = (readl(&timers->TCON) & ~0x0700000) | 0x0600000;
    writel(tmr, &timers->TCON);
    /* auto load, start Timer 4 */
    tmr = (tmr & ~0x0700000) | 0x0500000;
    writel(tmr, &timers->TCON);
    timestamp = 0;

return (0);
}

以下是对函数的详细分析:

1、先看数据结构s3c24x0_timers

struct s3c24x0_timers {
    u32 TCFG0;
    u32 TCFG1;
    u32 TCON;
    struct s3c24x0_timer    ch[4];
    u32 TCNTB4;
    u32 TCNTO4;
}; 

有引出来了另一个结构s3c24x0_timer

struct s3c24x0_timer {
    u32 TCNTB;
    u32 TCMPB;
    u32 TCNTO;
};

看下这两个结构是不是涵盖了所有timer的寄存器,对照s3c2440的datasheet得出结论是:timer寄存器地址空间从(0x51000000~0x51000040)依次对应的寄存器名是却是是上面的结构体中的寄存器,总共是17个寄存器.

为什么会有4个结构s3c24x0_timer呢?因为2440有5个timer,其中前四个timer0~timer3工作方式类似,都有外部引脚引出,而第五个timer4不同与他们,第一个就是它没有TCMPB寄存器,具体的区别可以看看这个文档或是datasheet:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/eca2c79d2e59d3745d8e4b7814130343.html