/* 模块初始化 */
static int __init s3c2410ts_init(void)
{
获得ADC时钟,并使能;
对ADC寄存器地址映射到内存;
配置寄存器;GPIO口: XM,XP,YM,YP, ADC有关的寄存器;
申请input设备;
设置可支持的事件为同步、按键、绝对坐标事件;设置按键时间类型为触摸屏;有关的数值范围;
设置设备的身份信息;
申请触摸屏中断IRQ_TC,ADC转换完成中断IRQ_ADC;
注册设备;
}
/* 触摸屏中断函数 */
static irqreturn_t stylus_updown(int irq, void *dev_id)
{
OwnADC = 1;
读取ADCDAT0和ADCDAT1寄存器,判断是按下中断还是弹起中断;
按下中断
touch_timer_fire(0);
弹起中断
OwnADC = 0;
}
/* 定时器函数可以由定时器中断触发,也可以由触摸屏中断函数触发 */
static void touch_timer_fire(unsigned long data)
{
读取ADCDAT0和ADCDAT1判断为弹起还是按下 ;
按下
如果count 不是0,报告xp,yp值;报告按键事件; 报告触摸屏的状态,1表明触摸屏被按下;同步;
上报了一次完整的触摸屏事件,用来间隔下一次的报告;
弹起
将count清0,并报告弹起事件,再次设置触摸屏为按下中断模式;
}
/* ADC中断函数 */
static irqreturn_t stylus_action(int irq, void *dev_id)
{
OwnADC = 1
读取转换后X,Y值;
设置时间定时器的定时值;到时 touch_timer_fire 被调用; // 因为这个定时器,可以画出轨迹
重新设置触摸屏为等待弹起信号;
}
/* 模块卸载 */
static void __exit s3c2410ts_exit(void)
{
释放中断资源;
释放时钟;
卸载input设备;
释放内存;
}