嵌入式Linux系统中触摸屏驱动的研究

发布者:BeaLaity0170最新更新时间:2012-05-21 来源: 微计算机信息 关键字:Linux  驱动程序  采样处理  校准 手机看文章 扫描二维码
随时随地手机看文章

引言

随着计算机相关技术的发展,嵌入式系统的应用越来越广泛,与人们生活紧密结合。触摸屏设备因其友善的人机交互性,操作方便灵活,输入速度快,被广泛的应用于嵌入式领域中。嵌入式Linux系统具有开发源代码、内核稳定、可裁减性等特点,吸引着众多商业公司和自由软件开发者的目光,成为嵌入式系统领域不可或缺的操作系统之一。触摸屏是一种输入设备,操作简单易学,不占额外的空间,可靠性高,是最常用的便携式系统的输入设备。特别是电阻式触摸屏结构简单,成本低,透光效果好,工作环境和外界完全隔离,不怕灰尘和水气,同时具有高解析度,高速传输反应,一次校正,稳定性高,不漂移等特点,因而广泛用于工业控制领域及在室内使用。

1 硬件平台

S3C2410是Samsung公司基于ARM 920T核心的一款MCU,集成了众多的外围设备,其中包括4线电阻式触摸屏控制器、8路模拟输入通道。在8路A/D转换通道中,A[5]和A[7]作为触摸屏的X、Y坐标的采集通道。S3C2410与4线电阻式触摸屏连接的电路原理图见图1。

在采样过程中,只需要通过读写一系列的特殊寄存器,S3C2410的触摸屏控制器就会自动控制触摸屏接口打开或关闭各MOS管,按顺序完成触摸屏X、Y坐标数据的采集。

图1  S3C2410连接4线电阻式触摸屏电路原理图

2 Linux设备驱动程序简介

设备驱动程序是操作系统内核和机器硬件之间的接口,由一组函数和一些私有数据组成,是应用程序和硬件设备之间的桥梁。在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,主要完成以下功能:对设备的初始化和释放;把数据从内核传送到硬件设备和从硬件设备读取数据;读取应用程序数据传送给设备文件和回送应用程序请求的数据;检测和处理硬件设备出现的错误。

Linux操作系统的设备有字符设备、块设备和网络设备等。字符设备是以单个字节为单位进行顺序读写操作,通常不使用缓存技术,例如鼠标、键盘等。块设备的读写都使用缓存技术来支持,并且必须能够进行随机存取,主要是针对磁盘等慢速设备设计的。网络设备主要基于BSD的Socket机制,为发送数据和接收数据提供缓存技术,提供对多协议的支持,例如以太网卡等。

3 Linux触摸屏驱动程序实现

在Linux系统中,设备驱动程序是一组相关函数的集合。它包括设备服务子程序和中断处理程序。设备服务子程序包含了所有与设备相关的代码,每个设备服务子程序只处理一种设备或者紧密相关的设备,从设备无关的软件中接受抽象的命令并执行。当执行一条请求时,具体操作是根据控制器对驱动程序提供的接口,并利用中断机制去调用中断服务子程序配合设备完成这个请求。设备驱动程序利用结构file_operations与文件系统联系起来,设备的各种操作的入口函数放在结构file_operations中,其中包括open()、release()、read()和write()等接口,简化了驱动程序的编写工作。这样,应用程序根本不必考虑操作的是设备还是普通文件,可一律看作文件处理,具有非常清晰统一的I/O接口。触摸屏的 file_operations结构定义如下:

static struct file_operations s3c2410_ts_fops = {

    owner:      THIS_MODULE,             

    read:       s3c2410_ts_read,          

    poll:       s3c2410_ts_poll,              

    ioctl:      s3c2410_ts_ioctl,             

    open:       s3c2410_ts_open,

    release:    s3c2410_ts_release,

    fasync:     s3c2410_ts_fasync,};[page]

在触摸屏设备驱动程序的开发中,全局变量struct s3c2410_ts_device global_ts是很重要的,用来保存触摸屏的相关参数、等待处理的消息队列、当前采样数据、上一次采样数据等信息,数据结构struct s3c2410_ts_device的定义如下:

struct s3c2410_ts_device {                          //管理触摸屏类

    struct s3c2410_ts_general  d;                   //触摸屏设置参数

    struct s3c2410_ts_calibration cal;              //校正触摸屏参数

    struct s3c2410_ts_event   buf[MOUSEBUF_SIZE];   //等待处理缓冲队列

    struct s3c2410_ts_event   cur_data, samples[3],last_data; };

                        //当前采样数据,采样原始数据,上次采样数据

在了解上面概念之后,编写触摸屏驱动的实际工作并不复杂,需要做如下工作:

3.1模块初始化函数

是调用s3c2410_touchscreen_moudle_init()来实现的,主要完成触摸屏设备的内核模块加载、初始化、中断注册、设备注册等工作,主要涉及到的过程如下:

ADCTSC=(0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);

//触摸屏ADCTSC的设置

ADCDLY=ADC_DELAY_TIME;      //触摸屏开始和间隔延时

ADCCON = (1<<14)|( PreScale_n<<6)|(7<<3)|(0<<2)|(0<<1)|(0);

                            //触摸屏控制器设置

request_irq(IRQ_ADC_DONE,ts_down_interrupt,SA_INTERRUPT,g_ts_id,ts_down_interrupt);              //申请IRQ_ADC_DONE中断

request_irq(IRQ_TC,ts_up_interrupt,SA_INTERRUPT,g_ts_id,ts_up_interrupt);  

  //申请IRQ_TC中断

devfs_register_chrdev(0,S3C2410_TS_MODULE_NAME,&s3c2410_ts_fops);

//注册file_operations结构

request_irq(IRQ_TIMER1,touch_timer_irq,SA_INTERRUPT,g_ts_timer_id,NULL);               //申请IRQ_TIMER1中断

touch_timer_irq(int irq, void *dev_id, struct pt_regs *regs)

                     //根据状态调用触摸中断,控制数据采样

初始化模块利用内核提供的request_irq函数,将触摸笔的按下与弹起的中断号进行登记,从而将中断号与中断服务函数联系起来;利用devfs_register_chrdev函数,向系统注册一个字符型设备;最后注册定时器中断,用来控制触摸屏的数据采样。

3.2 设置触摸笔的状态及对应的处理

触摸屏的中断服务函数ts_down_interrupt和ts_up_interrupt是根据ADCDAT1和ADCDAT0的设置来选择触摸笔的状态,之后调用触摸屏坐标的数据采样处理函数s3c2410_ts_handler()进行处理。部分代码如下:

static void ts_down_interrupt(int irq, void *dev_id, struct pt_regs *regs)

{

if ( (ADCDAT1&0x8000)|| (ADCDAT0&0x8000) ) {

                 pen_data.state = PEN_UP;

        }

        else {

                 pen_data.state = PEN_DOWN;

        }

        s3c2410_ts_handler();}

3.3 获得采样值

触摸笔具有三种工作状态:PEN_UP,PEN_DOWN,PEN_SAMPLE。在采样处理函数中,依据触摸笔的状态,调用 ts_timer_operation()来启动或停止采样定时器,然后调用s3c2410_ts_handler()根据不同的状态进行不同的设置和处理,之后得到不同的采样值。[page]

3.4 对得到的触摸屏的数据进行处理

是调用data_processing()函数来实现的。根据采用下面介绍的中值滤波法来对采样数据进行处理。针对坐标点采样过程中产生的噪声,一般是采用平均法来去除噪声,但是这种方法对于采样数较少,并且个别噪声采样点比较大的时候,取平均值会使最后的结果误差较大,达不到数据处理的要求。故本文采用中值滤波法滤除干扰噪声,进一步地提高采样精度。

中值滤波法的原理如下:首先取奇数个触摸采样数据;之后根据采样数据的大小按照从小到大的顺序进行排列;最后取中间位置的值。此种方法一般在采样点不多,个别采样数据误差又较大的情况下,可以有效地减少误差。具体的过程见图2。

3.5触摸屏的校准

在实际的应用中,通常触摸屏是作为与显示屏配合使用的输入设备,需要从触摸屏采样得到的坐标与屏幕的显示坐标做一个映射。触摸屏和显示屏都是标准的矩形,见3所示。触摸屏的X方向坐标只与显示屏的X方向有关,Y方向只与显示屏的Y方向相关。

假设显示屏的分辨率是W×H,显示区域的左上角对应的触摸屏采样坐标是(x1,y1),右下角对应的坐标是(x2,y2),那么触摸屏上的任意一点采用坐标(x,y)与显示屏坐标(xd,yd)的对应关系可按照如下公式计算:

根据上述的公式计算出实际触摸屏对应的显示坐标,之后就是一个触摸屏的校准过程,本文采用三点校准的方法,与两点校准相比,三点校准的模型考虑到变相和旋转,更接近实际情况。首先选取3个相距较远的3个作为校准输入的采样点,它们相应的触摸屏采样坐标是P0(x0,y0)、P1(x1,y1)、P2(x2,y2),显示坐标是PD0(xD0,yD0)、PD1(xD1,yD1)、PD2(xD2,yD2)。直角坐标平面的两个点P和PD,定义P为触摸屏空间的坐标点, PD为显示屏空间的坐标点,P可以经过旋转、比例和平移得到PD坐标。化简得:

通过上式可以说明PD和P点之间存在一次线性关系满足:xD=Ax+By+C   yD=Dx+Ey+F

对于同一个设备,其中的A、B、C、D、E、F为常数,称为校准常数,故只需在触摸屏校准时,解出这6个常数,就可以实现触摸屏空间到显示空间的转换。

3.6 中断的释放和注册模块的卸载

是调用s3c2410_ts_cleanup_module()来实现的,分别释放在初始化过程中,申请的IRQ_TIMER1、IRQ_ADC_DONE、IRQ_TC的中断和字符设备的接口函数devfs_register_chrdev(),具体如下:

    free_irq(IRQ_TIMER1,g_ts_id);

     free_irq(IRQ_ADC_DONE,g_ts_id);

 free_irq(IRQ_TC,g_ts_timer_id);

     devfs_unregister_chrdev(gMajor, H3600_TS_MODULE_NAME);  //卸载字符设备

4结束语

本文作者创新点: 结合实际的硬件平台,详细地介绍基于嵌入式Linux操作系统下触摸屏驱动程序的开发过程,改进了处理采样数据的方法,最后改进了常用的校准方法。使该触摸屏驱动更能满足实际的要求,该触摸屏驱动程序已用于实际的嵌入式产品中,运行稳定可靠,具有很好的发展前景和社会经济效益。

参考文献:

[1]刘淼.嵌入式系统接口设计与Linux驱动程序开发[M].北京航空航天大学出版社.2006.5

[2]魏永明等译.LINUX设备驱动程序[M].中国电力出版社.2006

[3]张晓林等.嵌入式系统设计与实践[M]. 北京航空航天大学出版社.2006

[4]周红波.基于嵌入式操作系统的开发方法[J].微计算机信息.2006年 第7-2期;55-57

[5]Samsung Electronics.S3C2410X 32-Bit RISC Microprocessor User’s manual.2003

关键字:Linux  驱动程序  采样处理  校准 引用地址:嵌入式Linux系统中触摸屏驱动的研究

上一篇:基于Intel PXA272的Bootloader的设计与实现
下一篇:基于嵌入式WEB的AllLightSYS系统的设计与实现

推荐阅读最新更新时间:2024-05-02 22:04

Deepen AI推出雷达和IMU传感器校准以及优化器 提高准确性
据外媒报道,自动驾驶系统计算机工具的全球领导者Deepen AI宣布推出雷达和IMU传感器校准。 (图片来源:美通社) Deepen Calibrate是一种基于Web浏览器的易于使用的工具,支持内部和外部校准,且可将校准多传感器数据的时间从几小时缩短到几分钟,从而实现准确定位、映射、传感器融合感知和控制。Deepen Calibrate目前支持以下10个校准对:雷达到摄像头(新);惯性测量单元(IMU)到车辆(新);IMU内在(新);车辆到摄像头;激光雷达(LiDAR)到摄像头;激光雷达到车辆;立体摄像头;非重叠摄像头;激光雷达到激光雷达;摄像头内在。 Deepen AI还开发了一种专有的基于循环的校准优化器(Ca
[汽车电子]
Deepen AI推出雷达和IMU传感器<font color='red'>校准</font>以及优化器 提高准确性
基于ARM9和Linux的液晶驱动终端
1 引言 液晶驱动终端是将液晶控制器、微控制器等集成在一起,并将液晶控制与图形界面显示等功能通过软件封装在一起,为用户开放操作接口、屏蔽液晶显示器的控制细节,使用户通过熟悉的接口(如RS232接口)发送预定义命令即可控制液晶显示,进行图形界面开发工作。 目前.已有的液晶驱动终端主要采用微控制器与前、后台软件结合的方法进行设计,该类终端只能够显示字模方式的图片.该种类型的终端显示数据存放在自带的NANDFlash中, 在人机界面设计过程中对NAND Flash中的数据管理是以扇区为基本操作单元,图片下载需要专用的软件工具完成,增加了界面设计的逻辑复杂性与操作性。这里采用ARM9微控制器与 Linux操作系统结合的方法,设计出
[单片机]
基于ARM9和<font color='red'>Linux</font>的液晶驱动终端
在矢量网络分析仪校准中, 对单端口表征器件进行灵敏度分析
在本文中,我们探讨了表征器件在微波矢量网络分析仪 (VNA) 的校准和测量中发挥的作用。本文简略地介绍了单端口表征器件校准的理论知识。与更为脆弱的滑动负载相比,单端口表征器件— 例如同轴开路/短路/负载 — 拥有便于操作和坚固耐用的优势。本文还提到了散射参数误差框以及广泛用于单端口 VNA 校准的误差术语(例如方向性、信号源匹配和跟踪)。基于这些参数,我们检测了 一组单端口VNA 校准的质量(使用表征器件来进行校准),以及不同类型的误差对 VNA 校准产生的影响。计算分析揭示了此类校准的一些有趣特性,将会显著改进网络分析仪 (VNA) 测量精度。 序 误差校正技术在双端口器件中的应用已有一段时间。假定矢量网络分析仪(VNA) 的非
[测试测量]
在矢量网络分析仪<font color='red'>校准</font>中, 对单端口表征器件进行灵敏度分析
MSP430F1121与PCF8576驱动程序
#include MSP430x11x1.h #define uint unsigned int #define uchar unsigned char //器件地址 uchar PCF8576=0x70; //内存数据定义 uchar ByteCnt; //I2C 数据字节计数器 uchar SlvAdr; //被控器地址 uchar SubAdr; //被控器单元地址 uchar XmtDat ; //发送数据缓冲区 //uchar MODE1=0x45; uchar MODE2=0xCD; // uchar Bank_sel=0x78; uchar flag; uc
[单片机]
NAND Flash的驱动程序设计方案
NAND Flash的驱动程序设计方案 以三星公司K9F2808UOB为例,设计了NAND Flash与S3C2410的接口电路,介绍了NAND Flash在ARM嵌入式系统中的设计与实现方法,并在UBoot上进行了验证。所设计的驱动易于移植,可简化嵌入式系统开发。 关键词 ARM UBoot NAND Flash K9F2808UOB 驱动程序 引言   当前各类嵌入式系统开发设计中,存储模块设计是不可或缺的重要方面。NOR和 NAND是目前市场上两种主要的非易失闪存技术。NOR Flash存储器的容量较小、写入速度较慢,但因其随机读取速度快,因此在嵌入式系统中,常用于程序代码的存储。与NOR相比,NAND闪存的优
[模拟电子]
NAND Flash的<font color='red'>驱动程序</font>设计方案
基于ARM9与Linux的门禁监控系统软件设计
摘要:提出了一种可配置、功耗低的门禁监控系统软件设计方案,该方案基于ARM9与Linux相结合的软硬件平台,同时结合CGI技术实现。系统由前端撮像头,读卡器,门禁控制器以及客户端组成。人员出入的时候,经刷卡后将卡内信息传输到门禁控制器,门禁控制器检测卡权限是否合法以决定是否开门,同时控制前端摄像头摄录图片传输到门禁控制器存储并进行日志记录。用户可以在客户端通过Internet访问门禁控制器,进行人员信息的录入和日志访问等。与传统方法相比,该方案设计在易操作和低成本上具有明显优势。 关键词:嵌入式;门禁;ARM9;CGI;boa服务器;Berkeley DB     门禁,又称出入管理控制系统,是一种管理人员进出的数字化管理系统。目
[嵌入式]
示波器探头自校准的操作步骤
相信对于电源工程师,示波器的功劳是不可替代的,一旦产品有问题就需要抓波形,抓时序,测试准确数值,以帮助工程师分析,处理,一切看波形说话。如何使测试的数据准确和可靠是非常重要的,准确的数字能够帮助我们,而失真的波形和数值只能误导我们。 本人从事电源行业有多年,示波器就相当于我的左右手。我常常看到很多小公司用的示波器过于低端,带宽低,采样率低,认为示波器操作简单,能抓到波形就行,根本没有必要买好的示波器。 甚至在使用示波器之前,并没有做测试准备。其实往往就是这个操作不正确导致测试结果失真,影响分析。 很多工程师直接拿起探头就测试,根本不去检查探头是否需要补偿,示波器是否需要校验。 示波器使用前需要自校准和需要探头补偿调节
[测试测量]
示波器探头自<font color='red'>校准</font>的操作步骤
Linux之父发话:Rust即将出现在Linux内核中
今天早上,Linus Torvalds 在 Linux 基金会开源峰会上发言称,Rust 有可能很快就会出现在 Linux 的内核中,最快是下一个内核周期。 Linus Torvalds 和 Dirk Hohndel 在开源峰会上的常规演讲 / 对话中,Linus 评论了内核中的 Rust 编程语言代码。 Torvalds 称,他们希望很快能将 Rust 编写的代码合并到内核中,甚至 Rust 可能出现在下一个版本中,即 Linux 5.20。 目前,还没有任何 Rust for Linux 拉取请求被发送或合并,但是用于基础设施、一些基本的示例驱动程序中时,内核的 Rust 启动代码已经开始稳定下来。 上个月看到
[嵌入式]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved