驱动路径:drivers/input/touchscreen/s3c2410_ts.c
在static int __init s3c2410ts_init(void)函数中注册了两个中断
1.if (request_irq(IRQ_ADC, stylus_action, IRQF_SHARED|IRQF_SAMPLE_RANDOM,
"s3c2410_action", dev))
2.if (request_irq(IRQ_TC, stylus_updown, IRQF_SAMPLE_RANDOM,
"s3c2410_action", dev))
中断处理函数stylus_action和stylus_updown。当点击触摸屏时进入该函数,在该函数中启动ad转换,转换完成就触发中断进入stylus_action在stylus_action中读取数据。
首先来看一下stylus_updown函数
1 static irqreturn_t stylus_updown(int irq, void *dev_id)
2 {
3 unsigned long data0;
4 unsigned long data1;
5 int updown;
6
7 if (down_trylock(&ADC_LOCK) == 0) { //判断是否adc可用,down_trylock可以用来获取信号量,不会休眠
8 OwnADC = 1;
9 data0 = ioread32(base_addr+S3C2410_ADCDAT0);
10 data1 = ioread32(base_addr+S3C2410_ADCDAT1);
11
12 updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN));
13
14 if (updown) { //判断触摸屏是否按下
15 touch_timer_fire(0); //启动adc
16 } else {
17 OwnADC = 0;
18 up(&ADC_LOCK);
19 }
20 }
21
22 return IRQ_HANDLED;
23 }
下面开一下touch_timer_fire是怎么个玩法
24 static void