新闻中心

EEPW首页 > 光电显示 > 设计应用 > 基于Linux系统的触摸屏驱动方案

基于Linux系统的触摸屏驱动方案

作者:时间:2012-03-09来源:网络收藏

引言

本文引用地址:http://www.eepw.com.cn/article/168330.htm

作为一种输入设备,具有坚固耐用、反应速度快、节省空间、易于交流等优点,提供简单、方便、自然的人机交互方式,目前被广泛应用于工业控制、电子查询、消费性电产品领域。

作为是目前最流行的操作之一,在桌面、服务器领域有大量用户,具有源代码开放,支持的硬件丰富、高可移植等优点,在嵌入式领域也备受青睐。根据不同设备,将程序分为字符设备、块设备、网络设备驱动三种,输入子u是对字符类型输入设备驱动实现方式的抽象,是对分散的、多种不同类别的输入设备进行统一处理的内核驱动模型。输入子系统具高效、无Bug和可重用等优点。本文对Linux输入子系统的驱动进行深入的讨论。

1 硬件平台

S3C2440是三星公司推出的采用ARM920t内核的MCU,集成了丰富的外围设备,其中包括4线电阻式控制器和8通道多路复用ADC。

触摸屏由触摸检测部件和触摸屏控制器构成,对应S3C2440平台的四线电阻触摸屏的外接电路和S3C2440芯片自带的A/D转换控制部分。四线电阻触摸屏的外接电路控制上下两层导电层的通断情况以及如何取电压,取电压之后由S3C2440芯片中的A/D将模拟量转换成数字量。S3C2440芯片的A/D转换器有8个输入通道,转换结果为10bit数字,转换过程在芯片内部自动实现,转换的结果从寄存器中取值,再进行一定的转后可直接得到触摸点的坐标。S3C2440提供的ADC和触摸屏接口如图1所示,触摸屏直接与引脚XP,XM,YP和YM连接,对触摸屏两个导电层的通断通过XP,XM,YP和YM4个引脚控制。通过读写指定的特殊寄存器,S3C2440的触摸屏控制器将自动控制触摸屏接口打开或关闭,按指定操作模式完成触点数据的采集。

26.jpg

2 输入子系统体系结构简介

设备驱动程序在Linux内核中占很重要地位,设备驱动以内核模块方式实现,可动态加载和卸载。Linux设备驱动的实现只需根据内核提供的一组相关数据结构和驱动接口标准,完成关键数据结构初始化和回调函数的编写。对字符设备驱动内核提供cdev数据结构和file_operatiONs结构体及操作方法,实现字符设备驱动只需完成cdev的初始化、file_operations中操作函数的实现并向内核注册。

Linux输入子系统是对物理形态各异的功能相似的输入设备的抽象,是内核中字符设备驱动接口的封装。输入子系统由设备驱动层、核心层和事件处理层构成。设备驱动层提供对硬件各寄存器的读写访问和将底层硬件对用户输入访问的响应转换为标准的输入事件,通过核心层提交给事件处理层;核心层对设备驱动层提供编程接口,对事件处理层的也提供编程接口;事件处理层为用户空间的应用程序提供了统一访问设备的接口和驱动层提交来的事件处理。输入子系统设计驱动时要实现设备驱动层的驱动和事件处理层的驱动,而输入子系统在事件处理层为触摸屏提供标准的事件接口,所以只要须完成设备驱动层的驱动,即硬件寄存器的操作和提交输入事件信息。输入子系统的设备驱动层驱动的实现过程如下:

1)驱动模块加载函数中设置输入设备支持输入子系统的事件;Linux内核用input_dev代表一个输入设备,对于触摸屏通过对input_dev实例的evbit[0]的设置来支持同步(EN_SYN)、按键(EN_KEY)和绝对坐标(EV_ABS)事件。

2)通过内核提供的input_regiSTer_device0函数向输入子系统注册输入设备。

3)输入设备发生输入操作时提交所发生的事件及对应键值或坐标等状态信息。触摸屏使用输入子系统提供的通用输入事件驱动程序Evdev,将事件信息打包成Input_event类型进行报告。

3 Linux触摸屏驱动的实现

3.1 触摸屏触点数据采集

S3C2440触摸屏控制器有四种工作模式,通过读写ADCTSC、ADCDA、ADCDATl和ADCDLY寄存器完成触摸屏控制器工作模式的选择和触摸屏触点数据采集。由于触摸动作时间的随机性,驱动设计时选择中断工作方式。设置ADCTSC寄存器为0xD3使触摸屏控制器进入等待中断模式,设置ADCDLY采样延迟时间。当触摸屏被按下,触摸屏控制器将产生INT_TC中断:在ⅡTC中断处理程序中,设置ADCTSC寄存器为0x0C,触摸屏控制器切换为自动X/Y坐标转换模式,将自动转换触点对应的x,y坐标值,并分别写入ADCDAT0寄存器和ADCDTA1寄存器,发出INTADC中断表示ADC转换完成;进入INT_ADC中断处理程序读取ADCDAT0寄存器和ADCDTA1寄存器中坐标数据并进行相应转换,数据采集后重新设置ADCTSC寄存器为0xD3使触摸屏控制器进入等待中断模式,等待触摸屏被按下。

3.2 驱动初始化模块

Linux驱动程序以内核模块方式加载运行。实现驱动加载函数s3c2440ts_init()并通过module_init(s3c2440ts_init)向内核注册。在驱动加载函数主要完成:启用ADC所需要的时钟、映射10地址、初始化ADC和触摸屏控制器相关的寄存器、申请INT_TS和INT_ADC中断、初始化输入设备、将输入设备注册到输入子系统。关键代码如下:

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

linux相关文章:linux教程



上一页 1 2 下一页

评论


相关推荐

技术专区

关闭