触摸屏驱动之概念介绍

触摸屏其实我们也是用输入子系统做的,回过头来看看我们输入子系统,

触摸屏跟输入子系统一样的,右边的handler用的是edev.c,左边的device我们分配,设置,注册,和硬件操作

开发板厂商一般提供了触摸屏驱动,我们在内核代码里面搜索 s3c2410_ts.c

我们大概浏览一遍,然后自己来写

static int __init s3c2410ts_init(void)
{
return platform_driver_register(&s3c_ts_driver);
}

这里注册一个平台驱动

static struct platform_driver s3c_ts_driver = {
.driver         = {
.name   = "samsung-ts",
.owner  = THIS_MODULE,
#ifdef CONFIG_PM
.pm = &s3c_ts_pmops,
#endif
},
.id_table = s3cts_driver_ids,
.probe = s3c2410ts_probe,
.remove = __devexit_p(s3c2410ts_remove),
};

这把有个名字 然后会有个设备跟这个名字一样,到时候probe函数就会被调用

input_dev = input_allocate_device();
if (!input_dev) {
dev_err(dev, "Unable to allocate the input device !!\n");
ret = -ENOMEM;
goto err_iomap;

这里是分配一个input_dev设备


ts.input = input_dev;
ts.input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);  //设置它能够产生按键类事件,绝对位移类事件

ts.input->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);  //能够产生按键类的哪一类事件呢,触摸屏事件

input_set_abs_params(ts.input, ABS_X, 0, 0x3FF, 0, 0);
input_set_abs_params(ts.input, ABS_Y, 0, 0x3FF, 0, 0);  //设置绝对位移相关的东西

ret = input_register_device(ts.input);
if (ret < 0) {
dev_err(dev, "failed to register input device\n");
ret = -EIO;
goto err_tcirq;
} //然后注册


当有事情发生的时候上报事件

static void touch_timer_fire(unsigned long data)

在这个函数里面 ,调用input_report_abs(ts.input, ABS_X, ts.xp);这个函数

然后我们看看这个函数是什么

static inline void input_report_abs(struct input_dev *dev, unsigned int code, int value)
{
input_event(dev, EV_ABS, code, value);
}

实际上也是input_event 跟我们之前做得完全一样

先参考别人的代码

我们先把里面一系列的头文件全部考过来

/*绝对位移*/
 29     input_set_abs_params(ts_dev, ABS_X, 0, 0x3FF, 0, 0);//x方向
 30     input_set_abs_params(ts_dev, ABS_Y, 0, 0x3FF, 0, 0);//y方向
 31     input_set_abs_params(ts_dev,ABS_PRESSURE,0,1,0,0);//压力方向

我们来看看这个函数

void input_set_abs_params(struct input_dev *dev, unsigned int axis,int min, int max, int fuzz, int flat)

这个参数:第一个是设备,第二个是是方向,第三个是最小值,第四个是最大值,后面两个参数我们不知道什么意思

最小是0,最大为什么是0x3ff 我们来看看芯片手册 

ADC & TOUCH SCREEN INTERFACE 有这么一章


Resolution: 10-bit / 12-bit (optional) 触摸屏其实就是个ADC转换器

这里表示可以产生10位或者12位 10位最大值就是0x3ff


还有压力方向,如果你用过绘图板就知道,你越用力线就越粗,这个压力有很多级别,我们触摸屏要么0,要么1,要么按下要么松开

设置好了就注册

框架就出来了 所有的触摸屏驱动都是这个框架

#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/gpio.h>
#include <linux/input.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/clk.h>
#include <linux/io.h>
#include <plat/adc.h>
#include <plat/regs-adc.h>
#include <plat/ts.h>


static struct input_dev *ts_dev;
static int ts_init(void)
{
/*1.分配一个input_dev结构体*/
ts_dev=input_allocate_device();


/*2.设置*/
/*2.1能产生哪一类事件*/
set_bit(EV_KEY,ts_dev->evbit);//能够产生按键类事件
set_bit(EV_ABS,ts_dev->evbit);//能够产生绝对位移事件
/*2.2能产生这类事件的哪些事件*/
set_bit(BTN_TOUCH,ts_dev->keybit);//能够产生按键事件里面的触摸屏事件
/*绝对位移*/
input_set_abs_params(ts_dev, ABS_X, 0, 0x3FF, 0, 0);//x方向
input_set_abs_params(ts_dev, ABS_Y, 0, 0x3FF, 0, 0);//y方向
input_set_abs_params(ts_dev,ABS_PRESSURE,0,1,0,0);//压力方向

/*3.注册*/
input_register_device(ts_dev);


/*4.硬件相关的操作*/




return 0;
}


static void ts_exit(void)
{


}


module_init(ts_init);
module_exit(ts_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("eight");


在写硬件操作之前,我们先看一下触摸屏的示意图

触摸屏巧妙的运用到了欧姆定律,假设一个电阻,就接一个3.3V的电源和地。你哪电压表去量,越接近地电压越低,越接近3.3V电压越高。最高电压3.3v,最低电压0v。

触摸屏是什么东西呢?我们拿到开发板之后,会有个屏幕,实际上他不仅是一个屏幕,触摸屏是有两层很薄的膜盖在这个屏幕上。触摸屏是触摸屏,LCD是LCD,它们是两个不同的东西。他们只不过大小刚好一样并且粘在一块而已。

这有两层膜,假设有四条边,p表示正极的意思,m是负极的意思,平时上下两层膜是不接触的,当我们有触摸,上下两层膜就会连在一块。

那我怎么测了x坐标呢,xp接3.3V,xm接地。Ym,Yp都不接,然后测Yp电压。上面这一层不就相当于电阻么,Yp越靠近Xp电压就越高,越靠近xm电压就越低

然后这样就可以测的x坐标。x坐标只是电压值,并不是我们800*480的那个值,测量Y坐标就是倒过来,Yp接3.3v,Ym接地,Xp,Xm不接,测Xp电压,跟测量x坐标一样的

,但是这里也只不过是电压值。至于怎么转换,就是应用程序的问题,我们用电阻屏的时候首先得校验,就是这么个原因,建立联系


触摸屏使用过程:

1.按下 产生中断

2.在按下的中断处理程序里面启动ADC转换x,y坐标(电压坐标)

3.adc结束产生中断

4.在adc中断处理函数里面上报,用inpue_event上报

5.等待松开

但是这样有个缺点,我按下之后之后启动一次

那我按下不松开怎么处理呢???所以我们第五步没有到松开,我们第四步上报还要启动定时器,时间到再次启动ADC就可以处理我们滑动的过程了 这里可以处理滑动,处理长按,然后在松开




  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值