基于S3C2410微处理器的触摸屏设计

发布者:WhisperingWaves最新更新时间:2013-02-19 来源: dzsc关键字:S3C2410  微处理器  触摸屏 手机看文章 扫描二维码
随时随地手机看文章

引言

随着信息家电和通讯设备的普及,作为与用户交互的终端媒介,触摸屏在生活中得到广泛的应用。如何在系统中集成触摸屏模块以及在嵌入式操作系统中实现其驱动程序,都成为嵌入式系统设计者需要考虑的问题。本文主要介绍在三星S3C2410X微处理器的硬件平台上进行基于嵌入式Linux的触摸屏驱动程序设计。

硬件实现方案

SPI接口是Motorola推出的一种同步串行接口,采用全双工、四线通信系统,S3C2410X是三星推出的自带触摸屏接口的ARM920T内核芯片,ADS7843为Burr-Brown生产的一款性能优异的触摸屏控制器。本文采用SPI接口的触摸屏控制器ADS7843外接四线电阻式触摸屏,这种方式最显著的特点是响应速度更快、灵敏度更高,微处理器与触摸屏控制器间的通讯时间大大减少,提高了微处理器的效率。ADS7843与S3C2410的硬件连接如图1所示,鉴于ADS7843差分工作模式的优点,在硬件电路中将其配置为差分模式。

图1 触摸屏输入系统示意图
图1 触摸屏输入系统示意图

嵌入式Linux系统下的驱动程序

设备驱动程序是Linux内核的重要组成部分,控制了操作系统和硬件设备之间的交互。Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,成为设备文件。应用程序可以打开、关闭、读写这些设备文件,对设备的操作就像操作普通的数据文件一样简便。为开发便利、提高效率,本设计采用可安装模块方式开发调试触摸屏驱动程序。

设备驱动在加载时首先需要调用入口函数init_module(),该函数完成设备驱动的初始化工作。其中最重要的工作就是向内核注册该设备,对于字符设备调用register_chrdev()完成注册,对于块设备需要调用register_blkdev()完成注册。注册成功后,该设备获得了系统分配的主设备号、自定义的次设备号,并建立起与文件系统的关联。字符设备驱动程序向Linux内核注册登记时,在字符设备向量表chrdevs中增加一个device_struct数据结构条目,这个设备的主设备标识符用作这个向量表的索引。向量表中的每一个条目,即一个device_struct数据结构包括两个元素:一个登记的设备驱动程序的名称的指针和一个指向一组文件操作的指针。这块文件操作本身位于这个设备的字符设备驱动程序中,每一个都处理特定的文件操作,比如打开、读写和关闭。所谓登记,就是将由模块提供的file_operations结构指针填入device_struct数据结构数组的某个表项。登记以后,位于上层的模块(内核)可以“看见”这个模块了。但是,应用程序却还不能“看见”它,因而还不能通过系统调用它。要使应用程序能“看见”这个模块或者它所驱动的设备,就要在文件系统中为其创建一个代表它的节点。通过系统调用mknod()创建代表此项设备的文件节点——设备入口点,就可使一项设备在系统中可见,成为应用程序可以访问的设备。另外,设备驱动在卸载时需要回收相应的资源,令设备的相应寄存器值复位并从系统中注销该设备。

Linux操作系统通过系统调用和硬件中断完成从用户空间到内核空间的控制转移。设备驱动模块的功能就是扩展内核的功能,主要完成两部分任务:一个是系统调用,另一个是处理中断。图2是一个设备驱动模块动态挂接、卸载和系统调用的全过程。系统调用部分则是对设备的操作过程,比如open,read,write,ioctl等操作,设备驱动程序所提供的这组入口点由几个结构向系统进行说明,分别是file_operations数据结构、inode数据结构和file 数据结构。内核内部通过file结构识别设备,通过file_operations数据结构提供文件系统的入口点函数,也就是访问设备驱动的函数,结构中的每一个成员都对应着一个系统调用。在嵌入式系统的开发中,我们一般仅仅实现其中几个接口函数:read、write、open、ioctl及release就可以完成应用系统需要的功能。写驱动程序的任务之一就是完成file_operations中的函数指针

触摸屏驱动程序设计

触摸屏驱动程序中重要数据结构

typedef struct {

unsigned short pressure;

unsigned short x;

unsigned short y;

unsigned short pad;

} TS_RET;

typedef struct {

unsigned int PenStatus;

TS_RET buf[MAX_TS_BUF];

unsigned int head, tail;

wait_queue_head_t wq;

spinlock_t lock;

} TS_DEV;

static struct file_operations s3c2410_fops = {

owner: THIS_MODULE,

open: s3c2410_ts_open,

read: s3c2410_ts_read, release: s3c2410_ts_release,

poll: s3c2410_ts_poll, };

在程序中有三个重要的数据结构:用于表示笔触点数据信息的结构TS_RET,表示ADS7843中有关触摸屏控制器信息的结构TS_DEV,以及驱动程序与应用程序的接口file_operations结构的s3c2410_fops。 [page]

TS_RET结构体中的信息就是驱动程序提供给上层应用程序使用的信息,用来存储触摸屏的返回值。上层应用程序通过读接口,从底层驱动中读取信息,并根据得到的值进行其他方面的操作。

TS_DEV结构用于记录触摸屏运行的各种状态,PenStatus包括PEN_UP、PEN_DOWN和PEN_FLEETING。buf[MAX_TS_BUF]是用来存放数据信息的事件队列,head、tail分别指向事件队列的头和尾。程序中的笔事件队列是一个环形结构,当有事件加入时,队列头加一,当有事件被取走时,队列尾加一,当头尾位置指针一致时读取笔事件的信息,进程会被安排进入睡眠。wq等待队列,包含一个锁变量和一个正在睡眠进程链表。当有好几个进程都在等待某件事时,Linux会把这些进程记录到这个等待队列。它的作用是当没有笔触事件发生时,阻塞上层的读操作,直到有笔触事件发生。lock使用自旋锁,自旋锁是基于共享变量来工作的,函数可以通过给某个变量设置一个特殊值来获得锁。而其他需要锁的函数则会循环查询锁是否可用。MAX_TS_BUF的值为16,即在没有被读取之前,系统缓冲区中最多可以存放16个笔触数据信息。

s3c2410_fops就是内核对驱动的调用接口,完成了将驱动函数映射为标准接口。上面的这种特殊表示方法不是标准C的语法,而是GNU编译器的一种特殊扩展,它使用名字进行结构字段的初始化,它的好处体现在结构清晰,易于理解,并且避免了结构发生变化带来的许多问题。

init_module函数

这是模块的入口函数。在函数内部通过s3c2410_ts_init( )实现模块的初始化工作。在本设计中设备与系统之间以中断方式进行数据交换。整个触摸屏的驱动程序处理比较复杂,而且耗时较长,因而触摸屏驱动程序不可能在中断服务程序中完成。在Linux操作系统中一般把中断处理切为两个部分或两半。中断处理程序是上半部——接收到一个中断,它就立即开始执行,但只做有严格时限的工作,例如对接收的中断进行应答或复位硬件。这些工作都是在所有中断被禁止的情况下完成的,能够被允许稍后完成的工作会推迟到下半部去。在Linux中下半部的实现有多种机制。按触摸屏时,从ADS7843输出的数值有一个抖动过程,即从ADS7846输出的数值有一个不稳定时期,这个过程大约为10ms。所以中断处理程序的下半部处理函数采用内核定时器机制,使下半部在中断发生50ms后再作处理。这样有效地避开了ADS7843输出值的不稳定时期,使中断服务程序和中断处理任务串行化,达到了处理时间较长的触摸屏事件的目的。驱动程序通过request_irq函数注册并激活一个中断处理程序,以便处理中断。

图2 设备驱动在内核中的挂接、卸载和系统调用过程
图2 设备驱动在内核中的挂接、卸载和系统调用过程

int reguest_irq(unsigned int irq, void(*handler)(int, void *, struct pt_regs *), unsigned long irq_flags, const char *dev_name, void *dev_id)

参数irq表示所要申请的中断号;handler为向系统登记的中断处理子程序,中断产生时由系统来调用;dev_name为设备名;dev_id为申请时告诉系统的设备标识符;irq_flags是申请时的选项,它决定中断处理程序的一些特性,其中最重要的是中断处理程序是快速处理程序还是慢速处理程序。

本设计中触摸屏控制器ADS7843的中断输出通过外部中断5接在中断控制器上,当触摸屏上有触摸事件发生时,会引发中断号为IRQ_EINT5的中断服务程序s3c2410_isr_tc()。图3所示为该中断处理程序的流程图。

图3 触摸屏硬件中断处理程序流程图
图3 触摸屏硬件中断处理程序流程图

在s3c2410_isr_tc()中设定了定时器的定时时间为50ms,并立即激活。因此有触摸屏硬件中断的情况下50ms后就会引发定时中断,中断服务程序为ts_timer_handler(),这个程序实现了触摸屏中断的下半部,即在过了抖动时间之后如果触摸屏确实有有效事件发生则采集触摸屏坐标,并将定时器的时间重新设为100ms并重新激活,这样做的目的是如果触摸笔是拖动的情况,以后每100ms采集一次坐标值,并存入缓冲区,如果不是拖动在采集一次坐标值之后,在第二次进入ts_timer_handler()时,查询管脚的状态值,则变为高电平,就将触摸屏状态tsdev.PenStatus设为PEN_UP,并释放定时器,为下次触摸屏事件做好准备,定时中断服务程序流程图如图4所示。 [page]

图4 定时中断服务程序流程图
图4 定时中断服务程序流程图

在s3c2410_ts_init()中的另一个重要任务是执行接口函数s3c2410_ts_open(),在这个函数中初始化缓冲区的头尾指针、触摸屏状态变量及触摸屏事件等待队列。

module_exit()

该函数调用s3c2410_ts_exit(),主要任务是撤销驱动程序向内核的登记以及释放申请的中断资源。

接口函数s3c2410_ts_read( )

这个函数实现的任务是将事件队列从设备缓存中读到用户空间的数据缓存中。实现的过程主要是通过一个循环,只有在事件队列的头、尾指针不重合时,才能成功的从tsdev.tail指向的队列尾部读取到一组触摸信息数据,并退出循环。否则调用读取函数的进程就要进入睡眠。

坐标读取函数s3c2410_get_XY()

在定时器中断处理程序中,当查询到与相连的EINT5/GPF5为低电平时,即表示有有效事件,应该调用s3c2410_get_XY()函数采集笔触信息。

ADS7843有多种转换时序,时序规定了芯片与设备及CPU间是如何配合工作的。设计中采用16个时钟周期启动一次转换的坐标转换方式。ADS7843的操作时序如图5所示。坐标的读取是通过多次采集取平均值的方法,以X坐标的读取为例,其读取过程如图6所示。循环过程中的每一步都在8个时钟周期内完成,数据的处理严格按照时序进行,Y坐标的采集与X坐标类似。

图5 ADS7843操作时序
图5 ADS7843操作时序

图6 X坐标采集流程
图6 X坐标采集流程

结语

在触摸屏的设计中,抗干扰设计是难点和重点,直接关系到触摸屏的工作性能。实验发现坐标采集时,丢弃第一次采集值读取的坐标转换值效果较好。本文所介绍的驱动程序已经在博创公司的教学实验设备UP-NETARM2410-S平台上经过实际验证,从数据稳定性和系统负载的角度看,效果良好。同时通过修改程序内部的定时器时钟频率可以改变笔在屏上移动所产生的数据量。

参考文献:

1. 毛德操,胡希明著.Linux内核源代码情景分析.杭州:浙江大学出版社,2001

2. 孙天泽,袁文菊,张海峰等.嵌入式设计及Linux驱动开发指南.北京:电子工业出版社,2005

3. R Love. Linux内核设计与实现. 陈莉君,康华,张波等译.北京:机械工业出版社,2006

4. 殷惠莉,刘少君,黄道平.基于uClinux触摸屏的设计.电子工程师.2004(2) .

关键字:S3C2410  微处理器  触摸屏 引用地址:基于S3C2410微处理器的触摸屏设计

上一篇:CMMB智能网络监测系统的设计与实现
下一篇:嵌入式视频监控系统设计方案

推荐阅读最新更新时间:2024-03-16 13:18

基于ARM处理器的远程参数测量的设计
1 引言 嵌入式系统由于性价比高开发周期短等优点目前得到了迅猛发展,各类基于 ARM 处理器的应用开发更是如火如荼。这里介绍基于 ARM9 嵌入式芯片 S3C2410 构建的测量监控系统,该系统设计方案先进,集成度较高,在实践中得到了广泛的应用。   2. 嵌入式 ARM9 S3C2410X 简介   S3C2410X 是三星公司提供的基于 ARM920T 内核的 32 位 RISC 处理器,它的低功耗、低价格、高性能设计特别适合于手持设备和通用嵌入式应用场合,为降低整个系统的成本,它提供了丰富的内部设备,包括分开的 16KB 指令 Cache 和 16KB 数据 Cache,MMU 虚拟存储器管理,24bbp 模式
[单片机]
基于ARM处理器的远程参数测量的设计
ARM9 S3C2440—ADC和触摸屏控制详解
S3C2440芯片内部共有8路A/D转换通道,AIN0-AIN7,转换器只有一个,转换精度为10位,最大转换率为2.5MHz A/D 转换器时钟下的500 KSPS。A/D 转换器支持片上采样-保持功能和掉电模式的操作。在常见的设计中,一般AIN4,AIN5,AIN6,AIN7被用作四线电阻触摸屏的YM、YP、XM、XP通道,剩余的AIN0~AIN3被引出,其中AI0外接一个可调电阻。 ADC的配置流程如下: 1、ADCDLY(P446) rADCDLY=50000; //Normal conversion mode delay about
[单片机]
MMU的理解
MMU,全称Memory Manage Unit, 中文名 存储器管理单元。 许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以 内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面 前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆盖块(overlay)的片段。覆盖块0首先运行,结束时他将调用另一个覆盖块。虽然覆盖块的交换是由OS完成的,但是必须先由程序员把程序先进行分割,这是一个费时费力的工作,而且相当枯燥
[单片机]
Microchip推出新型电容触摸式控制器,加速汽车触摸屏EMI认证
为解决汽车触摸屏开发人员面临的电磁干扰( EMI )和电磁兼容性(EMC)问题, Microchip Technology Inc.(美国微芯科技公司)宣布推出三款全新的maXTouch? 触摸屏控制器和附加优化服务。新款TD系列触摸控制器采用全新差分交互信号采集技术,可显著提高触摸屏的信噪比(SNR),即使在被厚玻璃或塑料覆盖时仍可正常工作,同时也支持驾驶员戴手套多点触控操作,可支持厚达4.5毫米聚甲基丙烯酸甲酯(PMMA)材料。 针对9至13英寸汽车触摸屏, Microchip 基于MXT1067TD、MXT1189TD和MXT1665TD推出了一些低成本型号,它们与近期推出的可支持20英寸触摸屏的MXT449TD、MXT6
[汽车电子]
十速科技发布USB界面的8位微处理器TMU3132
十速科技新推出TMU3132是USB界面的8位 微处理器 ,是以精简指令集运算、双周期的微处理器,应用于USB2.0全速通用型产品,支持USB2.0规范,主要的特点为4K*14 MTP ROM,可进行多次程序烧录,内置振荡频率提供USB界面做数据传输界面,内置振荡频率可提供误差在千分之二点五的48MHZ频率,以及可输出12MHZ频率提供无线2.4G模组使用。 TMU3132拥有USB界面DMA功能,作为SPI与USB界面之间数据的传送,SPI界面支持MODE 0/1/2/3 MASTER,速率可调整到6MBPS.具待机模式与外部唤醒功能、 看门狗 计时等功能。内含程序记忆体4K*14 internal MTP ROM以及F
[工业控制]
组态王、触摸屏与多台PLC在PN协议下的自组网无线通信
本文以组态王与西门子触摸屏和2台西门子S7-200SMART为例,介绍组态王、触摸屏与多台 PLC在Profinet协议下的自组网无线通信实现过程。在本方案中采用了西门子PLC无线通讯终端——DTD418M,作为实现无线通讯的硬件设备。我们无需更改网络参数和原有程序,也不必了解协议细节,通过欧美系PLC专用无线通讯终端-- DTD418M,即可直接替换组态王与PLC之间有线以太网通讯,且稳定方便的实现PLC无线以太网通讯。 无线网络图 ▼ 测试设备与参数: ● 西门子PLC型号:S7-200Smart × 2台 ● 上位机:组态王6.55 × 1台 ● 西门子触摸屏: SMART 700 IE V3 × 1台 ● 无线通讯
[嵌入式]
组态王、<font color='red'>触摸屏</font>与多台PLC在PN协议下的自组网无线通信
汽车ECU工作原理介绍
  ECU是ABS系统的控制中心,它的本质是微型数字计算机,一般是由两个微处理器和其它必要电路组成的、不可分解修理的整体单元,电控单元的基本输入信号是四个轮上传感器送来的轮速信号,输出信号是:给液压控制单元的控制信号、输出的自诊断信号和输出给ABS故障指示灯的信号。   1、ECU的防抱死控制功能   电控单元有连续监测四轮传感器速度信号的功能。电控单元连续地检测来自全部四个车轮传感器传来的脉冲电信号,并将它们处理、转换成和轮速成正比的数值,从这些数值中电控单元可区别哪个车轮速度快,哪个车轮速度慢。电控单元根据四个轮子的速度实施防抱死制动控制。电控单元以四个轮子的传感器传来的数据作为控制基础,一旦判断出车轮将要抱死,它立刻
[嵌入式]
IC Insights:2022年微处理器销售额将增长12%
根据 IC Insights 更新的数据,尽管今年经济困难重重,但由于平均售价(ASP)的提高,预计2022年微处理器(MPU)总销售额将增长近12%,达到创纪录的1148亿美元。今年MPU总出货量仅增长3%,继2021年和2020年分别增长6%和5%之后,这将推动近250万个处理器销量的历史新高。 第二季度更新表示,继去年平均价格增长7%和2020年增长10%之后,预计2022年MPU收入将受到ASP 增长(8%)的推动。 2021年,五家最大的微处理器供应商的市场份额合计达到全球1027亿美元MPU销售额的86%。接下来的五家最大的MPU供应商(英伟达、三星、紫光展锐、海思和恩智浦)合计占4.3%。 值得注意的是,
[嵌入式]
IC Insights:2022年<font color='red'>微处理器</font>销售额将增长12%
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

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