触摸屏驱动问题解决

原创 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

触摸屏驱动的改写

触摸屏驱动的改写 作者:宋老师,华清远见嵌入式学院讲师。 1、项目需求-Qt相关: 开发平台:开源平板         开发环境:ubuntu 10.10         Linux源码:l...
  • u013177084
  • u013177084
  • 2014年09月12日 20:42
  • 541

ubuntu12.04下触摸屏YT-104CQT驱动安装教程

1.解压pmLinux-CentOS_7_20150904.zip在Ubuntu12.04桌面,得到pmLinux-CentOS_7_20150904文件夹 2.打开终端,并命令行切换到pmLinu...
  • Jie_Sky_2015
  • Jie_Sky_2015
  • 2016年01月20日 21:37
  • 501

触摸屏驱动三部曲之硬件原理

触摸屏驱动三部曲概述 1.触摸屏驱动三部曲之硬件原理 写好一个驱动,一定要对硬件有所了解,这节我会讲解触摸屏的基础知识和电阻触摸屏的原理。...
  • u013584315
  • u013584315
  • 2014年04月30日 21:22
  • 2028

S5PV210(TQ210)学习笔记——触摸屏驱动编写

S5PV210(TQ210)学习笔记——触摸屏驱动编写 zzzz: http://blog.csdn.net/girlkoo/article/details/8756...
  • sno_guo
  • sno_guo
  • 2013年11月23日 22:00
  • 4655

嵌入式linux之触摸屏驱动框架

1、工作原理 首先我们要区分lcd和触摸屏,lcd是一个屏幕,触摸屏是贴在lcd上的两层膜。 接下来我们说一下四线电阻触摸屏的原理:触摸屏就是上下两层膜,比如上层代表x轴(XM:负端,XP:正端),下...
  • u013426958
  • u013426958
  • 2015年07月31日 09:55
  • 1271

imx283 zlg单板调试

今天从育松电子订的USB-232接头到货了了。AWD4驱小车和直流电机也到货了,抽空找个烙铁焊下才能够上电试下电机。 linux上USB-232接头的驱动不用特别安装,直接可以在PUTTY中显示上电...
  • ppp2006
  • ppp2006
  • 2014年03月30日 22:26
  • 566

我的触摸屏驱动源代码

/*C头文件*/#include "au_types.h"#define  DEVICE_NAME         "tpanel"#define    IRQ_1              7#de...
  • slippercat
  • slippercat
  • 2008年04月03日 19:27
  • 2593

Linux驱动学习笔记----------触摸屏驱动

关于 触摸屏的驱动,其实也是input输入子系统,只不过是一个升级版罢了。 我所说的都是基于韦老大所说,再加上自己的理解。这里关于输入子系统再做一些补充: —————–入子系统体系————...
  • m0_37661202
  • m0_37661202
  • 2017年06月18日 00:52
  • 1125

Linux下触摸屏驱动程序分析

本文以Linux3.5--Exynos4412平台,分析触摸屏驱动核心内容。Linux下触摸屏驱动(以ft5x06_ts为例)需要了解如下知识: 1.  I2C协议 2.  Exynos4412处理器...
  • fengel_cs
  • fengel_cs
  • 2016年01月22日 16:31
  • 758

Linux的I2C 设备驱动 -- mini2440 上i2c接口触摸屏驱动

本篇记录在友善之臂 mini2440 平台上挂载I2C接口触摸屏的驱动开发过程。 内核版本linux-2.6.32.2, 平台是ARM9 S3C2440+I2C接口的触摸屏 如上篇Li...
  • SUKHOI27SMK
  • SUKHOI27SMK
  • 2013年09月29日 06:47
  • 856
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:触摸屏驱动问题解决
举报原因:
原因补充:

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