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

2019-07-12 20:11发布

这里写图片描述 1、工作原理 首先我们要区分lcd和触摸屏,lcd是一个屏幕,触摸屏是贴在lcd上的两层膜。 接下来我们说一下四线电阻触摸屏的原理:触摸屏就是上下两层膜,比如上层代表x轴(XM:负端,XP:正端),下层代表y轴(YM:负端,YP:正端)。当读取x轴坐标时,XP接3.3v,XM接地,从YM读取按下点的电压值作为模拟输入信号,再经过AD转换后就得到了x轴坐标。同理,当读取y轴坐标时,YP接3.3v,YM接地,从XM读取按下点的电压值作为模拟输入,再经过AD转换后就得到了y轴坐标。为了把原理说清楚我们省去了不少细节的东西,详情可参考韦东山老师的书:嵌入式linux应用开发 2、工作流程 (1)当没有按下时,触摸屏控制器处于等待中断模式(这里等待的是INT_TC中断)。 (2)一旦被按下就会产生INT_TC中断 (3)在中断处理函数里,使其启用下面两种转换模式中的一种:一种是分离的x/y轴坐标转化模式,另一种是连续的x/y轴转换模式。 (4)一旦转换完,就会产生INT_ADC中断 (5)在中断处理函数中上报ADC转换值 但是这样是有一个问题的,因为我们按下一次,只会产生一个中断,如果我们滑动的话,就不会产生任何效果。为了处理滑动,我们可以在(5)中添加如下功能:启用定时器,每隔一段时间就启用一次AD转化,这样就可以得到按下点的实时信息了。 (6)松开 测试2th~7th:
1. make menuconfig 去掉原来的触摸屏驱动程序
-> Device Drivers
-> Input device support
-> Generic input layer
-> Touchscreens
<> S3C2410/S3C2440 touchscreens make uImage
使用新内核启动
  1. insmod s3c_ts.ko
    按下/松开触摸笔
测试2th~7th:
1. ls /dev/event*
2. insmod s3c_ts.ko
3. ls /dev/event*
4. hexdump /dev/event0
秒 微秒 type code value
0000000 29a4 0000 8625 0008 0003 0000 0172 0000
0000010 29a4 0000 8631 0008 0003 0001 027c 0000
0000020 29a4 0000 8634 0008 0003 0018 0001 0000
0000030 29a4 0000 8638 0008 0001 014a 0001 0000
0000040 29a4 0000 863c 0008 0000 0000 0000 0000
0000050 29a4 0000 c85e 0008 0003 0000 0171 0000
0000060 29a4 0000 c874 0008 0003 0001 027d 0000
0000070 29a4 0000 c87b 0008 0000 0000 0000 0000
0000080 29a4 0000 ed37 0008 0003 0018 0000 0000
0000090 29a4 0000 ed48 0008 0001 014a 0000 0000
00000a0 29a4 0000 ed4a 0008 0000 0000 0000 0000 使用: 当我们在调试输入设备时,如:键盘,触摸屏 会使用到hexdump工具。其内容如下:
  1. 键盘:

cat /dev/input/event0 | hexdump

0000000 f6a6 4e15 154b 0006 0001 0004 0001 0000
0000010 f6a6 4e15 1557 0006 0000 0000 0000 0000
0000020 f6a6 4e15 8510 0008 0001 0004 0000 0000
0000030 f6a6 4e15 8517 0008 0000 0000 0000 0000 共九列: 第六列表示上报事件: 0001 –> EV_KEY; 0000 —> EV_SYN 第七列表示键值: 0004 –> KEY_3 第八列表示按键事件: 0001 –> PRESS, 0000 –> RELEASE
  1. 触摸屏(电容屏)

cat /dev/input/event1 | hexdump

0000250 f832 4e15 c502 0006 0003 0039 0020 0000
0000260 f832 4e15 c50f 0006 0003 0030 0004 0000
0000270 f832 4e15 c514 0006 0003 0035 0263 0000
0000280 f832 4e15 c519 0006 0003 0036 01fd 0000
0000290 f832 4e15 c520 0006 0001 014a 0001 0000
00002a0 f832 4e15 c525 0006 0003 0000 0263 0000
00002b0 f832 4e15 c52b 0006 0003 0001 01fd 0000
00002c0 f832 4e15 c530 0006 0000 0000 0000 0000
00002d0 f832 4e15 be99 0007 0003 0039 ffff ffff
00002e0 f832 4e15 bea5 0007 0001 014a 0000 0000
00002f0 f832 4e15 bea8 0007 0000 0000 0000 0000 第七列表示上报事件和: 0039 –> ABS_MT_TRACKING_ID; 0030 –> ABS_MT_TOUCH_MAJOR; 0035 –> ABS_MT_POSITION_X; 0036 –> ABS_MT_POSITION_Y 014a –> BTN_TOUCH 第八列表示上报值