Linunx设备驱动之ADC与触摸屏驱动移植
2017-08-16 22:43
465 查看
1.ADC与触摸屏硬件介绍
S3C2440的CMOS模数转换器可以接收8个通道的模拟信号输入,并将它们转换为10位的为进制数据。在2.5MHz的A/D转换时钟下,最大的转化速率可达500KSPS。
S3C2440提供了与触摸屏直接相连的4个引脚,不需外接晶体管。其接口结构如图所示。
![](https://img-blog.csdn.net/20170819131015930?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTcxMDU2NDY3Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
对于S3C2440,在使用触摸屏时,引脚XP、XM、YP和YM被用于和触摸屏直接相连,只剩下AIN[3:0]共4个引脚用于一般的ADC输入;当不使用触摸屏时,XP、XM、YP和YM这4个引脚也可以用于一般的ADC输入。
2.工作原理
关于fl2440的触摸屏的移植,首先要了解关于输入设备是怎样与用户进行交互的。
input子系统处理输入事务,任何输入设备的驱动程序都可以通过input输入子系统提供的接口注册到内核,利用子系统提供的功能来与用户空间交互。输入设备一般包括键盘,鼠标,触摸屏等,在内核中都是以输入设备出现的。
1.input子系统是分层结构的,总共分为三层:硬件驱动层,子系统驱动层,事件驱动层。
(1)其中硬件驱动层负责操作具体的硬件设备,这层的代码是针对具体的驱动程序的,需要驱动程序的作者来编写。
(2)子系统核心层是链接其他两个层之间的纽带与桥梁,向下提供驱动层的接口,向上提供事件处理层的接口。
(3)事件处理层负责与用户程序打交道,将硬件驱动层传来的事件报告给用户程序。
2.各层之间通信的基本单位就是事件,任何一个输入设备的动作都可以抽象成一种事件,如键盘的按下,触摸屏的按下,鼠标的移动等。事件有三种属性:类型(type),编码(code),值(value),input子系统支持的所有事件都定义在input.h中,包括所有支持的类型,所属类型支持的编码等。事件传送的方向是 硬件驱动层-->子系统核心-->事件处理层-->用户空间
3.以触摸屏为例说明输入子系统的工作流程:
(1)s3c2440_ts模块初始化函数中将触摸屏注册到了输入子系统中,与此同时,注册函数在事件处理层链表中寻找事件处理器,这里找到的是evdev,并且将驱动与事件处理器挂载。并且在/dev/input中生成设备文件event0,以后我们访问这个文件就会找的我们的触摸屏驱动程序。
(2)应用程序打开设备文件/dev/input/event0,读取设备文件,调用evdev模块中read,如果没有事件进程就会睡眠。
(3)当触摸屏按下,驱动层通过子系统核心将事件(就是X,Y坐标),传给事件处理层也就是evdev,evdev唤醒睡眠的进程,将事件传给进程处理。
3.修改配置文件
1.[weiming@Huangweiming linux-3.0]$ vim arch/arm/mach-s3c2440/mach-smdk2440.c
(1)添加头文件
![](https://img-blog.csdn.net/20170819131019860?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTcxMDU2NDY3Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
(2)添加smdk2440_ts_cfg设备结构体相关信息
![](https://img-blog.csdn.net/20170819131025130?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTcxMDU2NDY3Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
(3)将adc和ts 设备结构体加入主设备结构体
![](https://img-blog.csdn.net/20170819131030146?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTcxMDU2NDY3Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
(4)在smk2440_machine_init添加smdk2440_ts_cfg信息
![](https://img-blog.csdn.net/20170819131034865?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTcxMDU2NDY3Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2.[weiming@Huangweiming linux-3.0]$ vim drivers/input/touchscreen/s3c2410_ts.c
![](https://img-blog.csdn.net/20170819131040003?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTcxMDU2NDY3Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170819131046596?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTcxMDU2NDY3Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170819131051482?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTcxMDU2NDY3Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
4.make menuconfig选项
Device Drivers --->
Input device support --->
<*> Event interface
<*> Event debugging
[*] Touchscreens --->
<*> Samsung S3C2410/generic touchscreen input driver
5.编译内核,烧录开发板
内核打印信息:
![](https://img-blog.csdn.net/20170819131056169?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTcxMDU2NDY3Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
6.编写测试程序
[weiming@Huangweiming driver]$ vim adc_ts.c
[b]7.用交叉编译器编译adc_ts.c文件将生成的可执行文件test_ts拷贝到开发板上并赋予可执行权限[/b]
[weiming@Huangweiming driver]$ /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc adc_ts.c -o test_ts
>:tftp -gr test_ts 192.168.1.2
>: chmod 777 test
>:./test
begin handle_event0...
当触摸触摸屏时会打印如图所示:
![](https://img-blog.csdn.net/20170819131100344?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTcxMDU2NDY3Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
说明触摸屏与ADC驱动移植成功了。
点击打开链接
S3C2440的CMOS模数转换器可以接收8个通道的模拟信号输入,并将它们转换为10位的为进制数据。在2.5MHz的A/D转换时钟下,最大的转化速率可达500KSPS。
S3C2440提供了与触摸屏直接相连的4个引脚,不需外接晶体管。其接口结构如图所示。
对于S3C2440,在使用触摸屏时,引脚XP、XM、YP和YM被用于和触摸屏直接相连,只剩下AIN[3:0]共4个引脚用于一般的ADC输入;当不使用触摸屏时,XP、XM、YP和YM这4个引脚也可以用于一般的ADC输入。
2.工作原理
关于fl2440的触摸屏的移植,首先要了解关于输入设备是怎样与用户进行交互的。
input子系统处理输入事务,任何输入设备的驱动程序都可以通过input输入子系统提供的接口注册到内核,利用子系统提供的功能来与用户空间交互。输入设备一般包括键盘,鼠标,触摸屏等,在内核中都是以输入设备出现的。
1.input子系统是分层结构的,总共分为三层:硬件驱动层,子系统驱动层,事件驱动层。
(1)其中硬件驱动层负责操作具体的硬件设备,这层的代码是针对具体的驱动程序的,需要驱动程序的作者来编写。
(2)子系统核心层是链接其他两个层之间的纽带与桥梁,向下提供驱动层的接口,向上提供事件处理层的接口。
(3)事件处理层负责与用户程序打交道,将硬件驱动层传来的事件报告给用户程序。
2.各层之间通信的基本单位就是事件,任何一个输入设备的动作都可以抽象成一种事件,如键盘的按下,触摸屏的按下,鼠标的移动等。事件有三种属性:类型(type),编码(code),值(value),input子系统支持的所有事件都定义在input.h中,包括所有支持的类型,所属类型支持的编码等。事件传送的方向是 硬件驱动层-->子系统核心-->事件处理层-->用户空间
3.以触摸屏为例说明输入子系统的工作流程:
(1)s3c2440_ts模块初始化函数中将触摸屏注册到了输入子系统中,与此同时,注册函数在事件处理层链表中寻找事件处理器,这里找到的是evdev,并且将驱动与事件处理器挂载。并且在/dev/input中生成设备文件event0,以后我们访问这个文件就会找的我们的触摸屏驱动程序。
(2)应用程序打开设备文件/dev/input/event0,读取设备文件,调用evdev模块中read,如果没有事件进程就会睡眠。
(3)当触摸屏按下,驱动层通过子系统核心将事件(就是X,Y坐标),传给事件处理层也就是evdev,evdev唤醒睡眠的进程,将事件传给进程处理。
3.修改配置文件
1.[weiming@Huangweiming linux-3.0]$ vim arch/arm/mach-s3c2440/mach-smdk2440.c
(1)添加头文件
(2)添加smdk2440_ts_cfg设备结构体相关信息
(3)将adc和ts 设备结构体加入主设备结构体
(4)在smk2440_machine_init添加smdk2440_ts_cfg信息
2.[weiming@Huangweiming linux-3.0]$ vim drivers/input/touchscreen/s3c2410_ts.c
4.make menuconfig选项
Device Drivers --->
Input device support --->
<*> Event interface
<*> Event debugging
[*] Touchscreens --->
<*> Samsung S3C2410/generic touchscreen input driver
5.编译内核,烧录开发板
内核打印信息:
6.编写测试程序
[weiming@Huangweiming driver]$ vim adc_ts.c
/********************************************************************************* * Copyright: (C) 2017 Huang Weiming<710564672@qq.com> * All rights reserved. * * Filename: adc_ts.c * Description: This file * * Version: 1.0.0(2017年05月10日) * Author: Huang Weiming <710564672@qq.com> * ChangeLog: 1, Release initial version on "2017年05月10日 14时21分51秒" * ********************************************************************************/ #include #include static int event0_fd = -1; struct input_event ev0[64]; static int handle_event0() { int button = 0, realx=0, realy=0, i, rd; rd = read(event0_fd, ev0, sizeof(struct input_event)* 64); if(rd < sizeof(struct input_event)) return 0; for(i=0;i 0) { close(event0_fd); event0_fd = -1; } return 0; }
[b]7.用交叉编译器编译adc_ts.c文件将生成的可执行文件test_ts拷贝到开发板上并赋予可执行权限[/b]
[weiming@Huangweiming driver]$ /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc adc_ts.c -o test_ts
>:tftp -gr test_ts 192.168.1.2
>: chmod 777 test
>:./test
begin handle_event0...
当触摸触摸屏时会打印如图所示:
说明触摸屏与ADC驱动移植成功了。
linux触摸屏驱动开发中的s3c_ts_probe()函数的分析
点击打开链接
相关文章推荐
- 【TINY4412】LINUX移植笔记:(26)设备树ADC驱动
- 移植触摸屏驱动后,i2c_add_driver返回0,设备与驱动没有匹配成功,怎么处理呢?
- fl2440触摸屏与ADC驱动移植
- s3c2440 触摸屏和ADC驱动移植
- 触摸屏和ADC驱动移植
- 触摸屏和ADC驱动的移植 (fl2440)
- s3c2440 LCD驱动,USB驱动,触摸屏以及ADC驱动移植
- S3c2410触摸屏驱动移植
- 【TINY4412】LINUX移植笔记:(25)设备树RTC驱动
- S3c6410 linux内核移植(8)---添加adc驱动、电池电量检测之原理
- 基于s3c2410的lcd和触摸屏驱动移植
- linux驱动摸索 --DS1302芯片移植(基于总线驱动设备模型)
- s3c2440的ADC触摸屏驱动——学习笔记
- FS_S5PC100触摸屏驱动移植
- 基于ARM的嵌入式Linux移植真实体验(4)――设备驱动
- Linux-2.6.32.2内核在mini2440上的移植(七)---添加ADC驱动
- ARM的嵌入式Linux移植体验之设备驱动
- Linux-2.6.30.4在2440上的移植之触摸屏驱动
- 在触摸屏驱动中,通常在probe函数中会调用input_set_abs_params给设备的input_dev结构体初始化 ,上报点input_mt_sync(input);
- 设备驱动外传 - 触摸屏的校正原理