触摸屏驱动问题解决

原创 2015年07月10日 23:54:38

最近在做电子书是用到触摸屏是卡住了,因为之前触摸屏驱动编写的时候就遇到问题没有解决,网上说问题在于mini2440不同于其他开发板,触摸屏使用的一线触控,而不是四线触控,相关的解决方法也是找了好久,最终在一个帖子上找到了http://blog.csdn.net/doccode/article/details/46520275 这是网址。按照里面的方法修改电路之后,终于可以和视频一样用了。


今天晚上继续写触摸屏驱动。附上代码如下:

#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/input.h>
#include <linux/init.h>
#include <linux/serio.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/clk.h>
#include <asm/io.h>
#include <asm/irq.h>


struct s3c_ts_regs{
unsigned long adccon;
unsigned long adctsc;
unsigned long adcdly;
unsigned long adcdat0;
unsigned long adcdat1;
unsigned long adcupdn;
};
static struct input_dev *s3c_ts_dev;
static volatile struct s3c_ts_regs *s3c_ts_regs;


static void enter_wait_pen_down_mode(void)
{
s3c_ts_regs->adctsc=0xd3;//ADCTSC触摸屏控制寄存器为0xd3时进入准备中断模式
}


static void enter_wait_pen_up_mode(void)
{
s3c_ts_regs->adctsc=0x1d3;
}


static void enter_measure_xy_mode(void)
{
s3c_ts_regs->adctsc=(1<<3)|(1<<2);///
}


static void start_adc(void)
{
s3c_ts_regs->adccon|=(1<<0);
}


static irqreturn_t pen_down_up_irq(int irq, void *dev_id)
{
/*如果ADCDAT0数据寄存器的15位为0表示按下,1表示抬起*/
if(s3c_ts_regs->adcdat0&(1<<15))
{
printk("pen up!\n");
enter_wait_pen_down_mode();
}
else
{
printk("pen down!\n");
enter_measure_xy_mode();//进入自动转换模式
start_adc(); //使能ADC转换
}
return IRQ_HANDLED;
}


static irqreturn_t adc_irq(int irq,void *dev_id)
{
static int cnt=0;
printk("adc_irq cnt=%d,x=%d,y=%d\n",cnt++,s3c_ts_regs->adcdat0&0x3ff,s3c_ts_regs->adcdat1&0x3ff);
enter_wait_pen_up_mode();
return IRQ_HANDLED;
}


static int s3c_ts_init(void)
{
struct clk* clk;
/*分配一个结构体*/
s3c_ts_dev=input_allocate_device();
/*设置**/
set_bit(EV_KEY,s3c_ts_dev->evbit);
set_bit(EV_ABS,s3c_ts_dev->evbit);


set_bit(BTN_TOUCH,s3c_ts_dev->keybit);


input_set_abs_params(s3c_ts_dev,ABS_X,0,0x3FF,0,0);
input_set_abs_params(s3c_ts_dev,ABS_Y,0,0x3FF,0,0);
input_set_abs_params(s3c_ts_dev,ABS_PRESSURE,0,1,0,0);
/*注册**/
input_register_device(s3c_ts_dev);
/*硬件相关的操作***/
clk=clk_get(NULL,"adc");
clk_enable(clk);


s3c_ts_regs=ioremap(0x58000000,sizeof(struct s3c_ts_regs));


/*ADCCON控制寄存器,ADCCON[14]=1为预分频使能,
* ADCCON[13:4]=49分频系数为49,总线时钟为PCLK=50Mhz,
*分频后的ADC转换频率为50/(49+1)=1Mhz
*ADCCON[0]ADC转换使能,以后设置
*/
s3c_ts_regs->adccon=(1<<14)|(49<<6);


/*请求中断*/
request_irq(IRQ_TC,pen_down_up_irq,IRQF_SAMPLE_RANDOM,"ts_pen",NULL);
request_irq(IRQ_ADC,adc_irq,IRQF_SHARED|IRQF_SAMPLE_RANDOM,"adc",1);
enter_wait_pen_down_mode();

return 0;
}


static void s3c_ts_exit(void)
{
free_irq(IRQ_ADC,1);
free_irq(IRQ_TC,NULL);
iounmap(s3c_ts_regs);
input_unregister_device(s3c_ts_dev);
input_free_device(s3c_ts_dev);
}


module_init(s3c_ts_init);
module_exit(s3c_ts_exit);
MODULE_LICENSE("GPL");

分析:之前在注册IRQ_TS IRQ_ADC 中断时,request_irq函数的最后一个参数都设为NULL 后来发现虽然TS中断进入,但是ADC中断没有进入,在一篇帖子上看到不能写空,会导致请求中断失败,将其设为1之后,果然能正常进入中断了。

好开心,夜里起风了,台风来临,加油!

2015.7.11 0:08

相关文章推荐

tiny6410触摸屏驱动问题

硬件:arm1176jzfs tiny6410 写裸机程序驱动触摸屏 友善为了触摸屏的定位精准,专门弄了个“一线触摸”。 以下摘抄于友善的硬件手册:     为了方便用户使用,本开发板带有 3...
  • wen0605
  • wen0605
  • 2013年04月18日 16:32
  • 3191

ARM-Linux触摸屏驱动移植--问题总结

硬件平台:FL2440 内核版本:2.6.28 主机系统:Ubuntu 11.04 内核版本:2.6.39 原创作品,转载请标明出处 http://blog.csdn.net/...

触摸屏驱动调试常见问题总结

电阻式触摸屏的Controller从原理上,简单的说就是一个可切换通道的AD转换器,常见的有类似TSC2046这一系列的独立芯片,也有Buildin在MPU里的集成模块。这里记录的主要是这类触摸屏驱动...

Linux下的触摸屏驱动

版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127   一.触摸屏理论概述 对于触摸屏驱动,我们主要需要掌握触摸屏驱动代码和应用层测试代码。下面讲的是基...

触摸屏驱动三部曲之输入子系统

这篇主要是讲解输入子系统的框架,希望能通过触摸屏来窥探整个输入子系统的框架。...

Linux开发二十_触摸屏驱动

在人机交互系统中,键盘、触摸屏等输入设备是一个不可或缺的部分,触摸屏以其非常良好的用户体验得到了广泛的应用。此处以ft5206电容屏为例,实现Linux内核上的驱动。...

改善6410 触摸屏驱动(作者gooogleman) 改善641

改善6410 触摸屏驱动 // 平台:wince6.0.0 real6410 BSP (real6410开发板) // 发布日期:2010-09-11 // 最后修改: ...

触摸屏驱动分析之——tslib机制分析

tslib插件:     pthres 为Tslib 提供的触摸屏灵敏度门槛插件;     variance 为Tslib 提供的触摸屏滤波算法插件;     dejitter 为Tsli...

WINCE6.0+S3C6410的触摸屏驱动

WINCE6.0+S3C6410的触摸屏驱动    类别:WINCE 驱动开发 ********************************LoongEmbedded*...

触摸屏驱动设计----输入子系统模型

触摸屏驱动设计----输入子系统模型
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:触摸屏驱动问题解决
举报原因:
原因补充:

(最多只允许输入30个字)