s3c2440触摸屏程序架构

基本上所以的2440的触摸屏的驱动都有一个定时器,这是因为触摸屏有一个特性,在转换的模式下没有办法判断,笔尖的按下或抬起,所以一般都会在ADC中断处理函数里面先设置为等待模式,然后修改定时器的值,然后在定时器里判断笔尖的状态,再决定转进转换模式,还是等待模式。其实这里就是很简单的思想,就是当读完一个ADC的值后,然后等待笔尖提起,要是过一段时间笔尖还是没有提起,就开始转换,也就是交加进行。其实也可以去了定时器,就是在ADC中断处理函数用延时函数,那样子更加便于理解,但是浪费资源

static irqreturn_t adc_irq(int irq, void *dev_id)
{
 unsigned long i=0;
 unsigned long k,l;
 static int cnt = 0;
 static int x[4], y[4];
 int adcdat0, adcdat1;
 

 printk("test\n");
 /* 优化措施2: 如果ADC完成时, 发现触摸笔已经松开, 则丢弃此次结果 */
 adcdat0 = s3c_ts_regs->adcdat0;
 adcdat1 = s3c_ts_regs->adcdat1;

 
 x[0] = adcdat0 & 0x3ff;
 y[0] = adcdat1 & 0x3ff;
 
   /* 优化措施4: 软件过滤 */
 printk("x = %d, y = %d\n", (x[0])/*+x[1]+x[2]+x[3])/4*/, (y[0])/*+y[1]+y[2]+y[3])/4*/);
 enter_wait_pen_up_mode();
 mdelay(30);//延时等待笔尖抬起
 if(status_flag)//如果笔记没有抬起就转换
 {
  enter_measure_xy_mode();
  start_adc();
 }
   
*/
 }
 
 return IRQ_HANDLED;
}

static irqreturn_t pen_down_up_irq(int irq, void *dev_id)
{
 if (s3c_ts_regs->adcdat0 & (1<<15))
 {
  status_flag = 0;
  printk("pen up\n");
  enter_wait_pen_down_mode();
 }
 else
 {
  status_flag = 1;
  printk("pen down\n");
  enter_wait_pen_up_mode();
  enter_measure_xy_mode();
  start_adc();
 }
 return IRQ_HANDLED;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值