TIMER简介
GSC3290 芯片包含一个 TIMER 定时器模块,TIMER 定时器模块包含 TIMER0~TIMER3 共 4个相对独立的定时器。每个定时器内部包含一个 32bit 计数器。每一个定时器都有自己独立的时钟源,均支持循环定时模式和单次定时模式两种工作模式,每个定时器都有各自的中断,TIMER定时器模块将4个中断合并为一个中断输出给中断控制器。
TIMER 定时器模块的时钟与复位信号均由系统控制模块 SYSCTL 提供,TIMER0~TIMER3均有各自的时钟与复位信号,时钟可由SYSCTL系统控制模块分别配置
图1:硬件定时器的框图
TIMER 定时器包含的 4 个定时器 TIMER0~TIMER3 可分别使能和禁止。4 个定时器均有各自的设置寄存器 TIMERn_TCR(n 表示 TIMER0、TIMER1、TIMER2 或 TIMER3,下同),可通过TIMERn_TCR.bit0 来使能和禁止相应的 TIMER,置 1 为使能,置 0 为禁止。当 TIMER 使能后,计数器载入值寄存器(TIMERn_TLC)中的值载入计数器,计数器开始在之后的每个工作时钟信号上升沿递减计数。TIMER 的计数器宽度为 32bit。当某个定时器状态由开启变为关闭时,此定时器停止计数,同时包括计数器在内的所有寄存器被异步复位。
混杂设备的结构体定义:
static struct miscdevice gsc3290_timer_miscdev = {
MISC_DYNAMIC_MINOR,
"timer",
&gsc3290_timer_ops,};
操作函数:
static const struct file_operations gsc3290_timer_ops = {
.owner = THIS_MODULE,
.unlocked_ioctl = gsc3290_timer_ioctl
};
Ioctl函数完成交互:
static long gsc3290_timer_ioctl( struct file *file, unsigned int cmd, unsigned long arg)
{
struct timer_data* data=(struct timer_data*)arg;
timer_debug("\n%s\n",__func__);
switch(cmd){
case TIMER_CONFIG:
timer_init(data->index,data->arg);
timer_config(data->index,data->mode,data->period_us);
break;
case TIMER_START:
timer_start(data->index);
break;
case TIMER_STOP:
timer_stop(data->index);
break;
case TIMER_CLOSE:
timer_close(data->index);
break;
default:
printk(KERN_INFO"in ioctl default!\n");
break;
}
return 0;
}
TIMER_CONFIG:配置函数的分析:
主要配置的参数内容:io复用的配置,中断函数的注册,单次/循环定时模式的配置,中断使能,重载计数值写入寄存器(配置都是用户空间传入,用户自主控制定时器)
/*配置参数*/
data.index=0;
data.period_us=8000000;
data.mode=CYCLE;
data.arg=(void*)timer_handler;
总结:硬件定时器就是简单的混杂设备器件,主要功能就是借助用户的配置完成
设定定时的操作。