历史上的今天
返回首页

历史上的今天

今天是:2025年02月18日(星期二)

正在发生

2018年02月18日 | Linux操作系统中触摸屏控制器驱动程序设计的编程方法

2018-02-18 来源:eefocus

    在便携式的电子类产品中,触摸屏由于其便、灵活、占用空间少等优点,已经逐渐取代键盘成为嵌入式计算机系统常选用的人机交互输入设备。触摸屏输入系统由触摸屏、触摸屏控制器、微控制器及其相应的驱动程序构成。本文从触摸屏控制器的驱动程序设计着手,介绍触摸屏控制器ADS7843的内部结构及工作原理和在嵌入式Linux操作系统中基于PXA255微处理器的ADS7843驱动程序设计


    1、触摸屏控制器ADS7843的介绍

    1.1 ADS7843的内部结构

    ADS7843 内驻一个多路低导通电阻模拟开关组成的供电-测量电路网络、12bit逐次逼近A/D转换器和异步串行数据输入输出,ADS7843根据微控制器发来的不同测量命令导通相应的模拟开关,以便向触摸屏电极对提供电压,并把相应电极上的触点坐标位置所对应的电压模拟量引入A/D转换器,图1为ADS7843内部结构图。X+、Y+、X-、Y-为触摸屏电极模拟电压输入;CS为ADS7843的片选输入信号,低电平有效;DCLK接外部时钟输入,为芯片进行 A/D转换和异步串行数据输入/输出提供时钟;DIN串行数据输入端,当CS低电平时,输入数据在时钟的上升沿将串行数据锁存;DOUT串行数据输出端, 在时钟下降沿数据由此移位输出,当CS为高电平时,DOUT呈高阻态。BUSY为系统忙标志端,当CS为低电平,且BUSY为高电平时,表示 ADS7843正在进行数据转换;VREF参考电压输入端,电压值在+1V到+VCC之间变化;PENIRQ为笔触中断,低电平有效;IN3、IN4为辅助ADC转换输入通道;+VCC为电源输入。

30.jpg?imageView2/2/w/550
图1 ADS7843内部结构

    1.2 ADS7843的转换时序

    ADS7843 完成一次数据转换需要与微控制器进行3次通信,第一次微处理器通过异步数据传送向ADS843发送控制字,其中包括起始位、通道选择、8/12位模式、差分/单端选择和掉电模式选择,其后的两次数据传送则是微控制器从ADS7843取出16bitA/D转换结果数据(最后四位自动补零),每次通信需要8个时钟周期,完成一次数据转换共需24个时钟周期,图2为ADS7843转换时序。

31.jpg?imageView2/2/w/550
图2 ADS7843转换时序

    2、ADS7843与PXA255硬件接口

    PXA255 微处理器是Intel公司生产的第二代基于32位XScale微架构的集成系统芯片(ISOC),PXA255具有高性能、低功耗等优点,它除了 XScale微内核外,还集成了许多适用于手持设备市场需要的外围设备。图3为ADS7843触摸屏控制器与PXA255微处理器的硬件连线示意图。当屏触发生时ADS7843向PXA255发出中断请求,由PXA255响应该中断请求,启动通信过程,读取ADS7843的转换结果,从而得到触摸点的坐标。ADS7843各信号的时序受外部输入时钟信号频率的影响,一旦外部输入时钟频率固定,各信号的时序便完全确定,因此需要配置PXA255的接口信号时序,使之完全符合ADS7843的时序。

32.jpg?imageView2/2/w/550
图3 ADS7843触摸屏控制器与PXA255微处理器的连线示意图

    3、ADS7843驱动程序的设计

    Linux 作为一个宏内核操作系统,其设备驱动都在内核,即系统空间实现,实现方式有两种,一种是将有关的设备驱动程序和数据结构静态地连接在内核映像中;另一种是将具体的设备驱动程序和数据结构独立加以编译,成为可安装的模块,需要时由应用程序通过系统调用动态地予以安装或拆卸。设备驱动的实现方法也有两种,一种是轮询(polling)方式,另一种是中断(inter-rupt)方式,轮询方式对设备的操作完全由CPU掌握,外部设备则完全处于被动状态。中断方式是由外部设备主动提出申请,CPU响应申请后对外部设备进行处理,是现在常用的设备驱动方式。Linux的设备驱动具有两个显著的特点,其一是把所有的设备视为一种设备文件,每个设备都呈现于文件系统的/dev目录下,设备驱动与文件操作具有相同的界面和语义,并通过同一组系统调用进行操作;另一个显著特点是Linux的设备驱动有着分明的层次和结构。

    Linux内核的新近版本为设备入口提供了一种特殊的文件系统,即设备文件系统 devfs(devICe file system)。新的devfs机制的优点在于:①各种设备驱动模块动态地向系统登记,设备初始化时在/dev目录下创建设备入口点,移除设备时将其删除。②设备驱动程序可以指定设备名、所有者和权限位。③不需要为设备驱动程序分配主设备号以及次设备号。④当装载和卸载模块时,不再需要运行脚本来创建设备文件,驱动程序自主地管理其设备文件。采用devfs机制的设备驱动程序调用下面的函数来处理设备的创建和删除工作。

    devf s_hander_t devf s_mk_dir ( devf s_ han2 der_t dir ,const char 3 name ,void 3 info)

    devf s_hander_t devf s_register ( devf s_ han2 der_t dir ,const char 3 name ,unsigned int flags , unsigned int major ,unsigned int minor ,umode_t mode ,void 3 op s ,void 3 info)

    void devf s_unregister (devf s_hander_t de)

    在 Linux操作系统编写设备驱动程序时有几个固定的功能模块:向Linux内核注册该设备时的初始化设备驱动程序模块;用于系统卸载模块时删除设备驱动程序的模块;提供用户使用该设备驱动程序的文件操作接口模块。对于各类具体设备编写驱动程序时还应具有对该设备进行操作的应用函数。下面就以ADS7843 驱动程序设计为例分析以上几个功能模块。

    1) ADS7843 向Linux 内核注册设备时的初始化函数

    int __init ads7843_t s_init (void)   / / 设备初始化函数

    {int ret ;

    if ( ( ret = devf s _ register _ chrdev ( TS _ MAJOR , TS _ NAME , &ads7843_t s_fops) ) ! = 0)

 

    { print k (“ registering of ” TS_NAME “ is faiLED n” ) ; return ret ;}

    devf s_t s_dir = devf s_mk_dir (NULL , “ touchscreen” , NULL) ;    / / 建立触摸屏设备目录

    devf s_handle = devf s_register ( devf s_t s_dir , “ t s” ,DEVFS_ FL_ DEFAUL T , TS _ MAJOR , 0 , S _ IFCHR | S _ IRUSR | S _ IWUSR , &ads7843_t s_fops , NULL) ;    / / 注册设备

    if ( ( ret = request_IRQ( IRQ_ GPIO_ADS7843 , ads7843_t s_inter-rupt ,

    SA_SHIRQ| SA_INTERRUPT , TS_NAME , dev_ id) ) ) / / 申请中断

    { print k (“ads7843_t s_init : failed to register IRQ n” ) ;

    f ree_irq( IRQ_GPIO_ADS7843 , dev_id) ; return ret ;}

    if ( ( ret = ads7843_init () ) ! = 0)     / / 初始化触摸屏

    {f ree_irq( IRQ_GPIO_ADS7843 , dev_id) ; return ret ;}

    GPDR0 & = ~GPIO_bit (ADS7843_BUSY) ;

    GPDR0 & = ~GPIO_bit (ADS7843_DOU T) ;

    Ads7843_Enable_IRQ() ;/ / 开启中断

    print k (“ads7843 touch screen driver initialized n” ) ;

    return 0 ;}

    2) 系统卸载ADS7843 驱动程序功能函数

    void __exit ads7843_t s_cleanup (void) / / 卸载驱动程序函数

    {   if (in_timehandle)

    del_timer ( &timer) ;

    f ree_irq( IRQ_GPIO_ADS7843 , dev_id) ;    / / 释放中断

    devf s_unregister_chrdev( TS_MAJOR , TS_NAME) ;/ / 从系统中删除设备驱动程序

    print k (“ ads7843 touch screen driver removed n” ) ;}

    3) 在驱动程序最后用于模块初始化和删除驱动的功能函数

    module_init (ads7843_t s_init) ;/ / 初始化驱动模块函数

    module_exit (ads7843_t s_cleanup) ;/ / 删除驱动模块函数

    4) ADS7843 设备文件操作结构体

    statIC st ruct file_operations ads7843_t s_fops = {

    read :ads7843_t s_read ,     / / 从设备中读数据操作

    poll :ads7843_t s_poll , / / 查询设备操作

    ioctl :  ads7843_t s_ioctl ,   / / 设备IO 控制操作

    fasync : ads7843_t s_fasync , / / 异步通知操作

    open : ads7843_t s_open , / / 打开设备操作

    release : ads7843_t s_release , } ; / / 当文件结构被释放时,调用释放操作

    由于文章篇幅所限,对设备文件操作的功能函数不再一一列出。

    5) ADS7843 具体操作函数

    ①ADS7843 串行输出控制字函数

    void ADS7843_din (char command)

    udelay(DELA Y) ; / / 延时

    for (int i = 0 ; i < 8 ; i + + ) / / 从串行输入端输入8 位控制字

    {  ADS7843_ClearBit (0 , ADS7843_CL K) ; / / 时钟变低,下降沿输出

    if ( (command > > i) &0x1)

    ADS7843_SetBit (0 , ADS7843_DIN) ; / / 数据位为1

    el se

    ADS7843_ClearBit (0 , ADS7843_DIN) ; / / 数据位为0

    udelay (DELA Y) ;

    ADS7843_SetBit (0 , ADS7843_CL K) ;}} / / 时钟变高

    ②微处理器读取X 坐标值函数(读取Y坐标值函数相类似,控制字为0x90)

    int ADS7843_t s_measure_x (void)

    { char i , int touch_data = 0 ;

    ADS7843_ClearBit (0 , ADS7843_CS) ; / / 片选端置低电平

    udelay(DELA Y) ;

    ADS7843_din (0xD0) ;    / / 向ADS7843 发送读X 坐标控制字0xD0

    ADS7843_ClearBit (0 , ADS7843_CL K) ;

    udelay(DELA Y) ;

    while ( ! ( GPLR0 & GPIO_ bit (ADS7843 _BUSY) ) ) print k ( “BUSY1 n” ) ;

    ADS7843_ClearBit (0 , ADS7843_CL K) ;

    for (i = 0 ; i < 15 ; i + + )    / / 读取坐标值

    { touch_data < < = 1 ;

    if ( GPLR0 & GPIO_bit (ADS7843_DOU T) )

    touch_data | = 0x01 ;

    else

    touch_data & = 0xffffe ;

    ADS7843_SetBit (0 , ADS7843_CL K) ;

    udelay(DELA Y) ;

    ADS7843_ClearBit (0 , ADS7843_CL K) ;}

    touch_data > > = 3 ;/ / 对最后4 位自动置0 处理

    return (touch_data & 0xfff) ;}

    4、驱动模块的安装

    在 Linux操作系统中,对于已编好的设备驱动程序,利用编译工具将驱动程序编译成驱动模块。对于驱动模块的安装,一种方法是重新编译Linux内核将驱动程序加载到系统内核,另一种方法就是利用inmod和rmmod函数动态地装载和卸载设备驱动模块。我们在IntelXscalePXA255评估板上利用重新编译Linux内核的方法将触摸屏控制器ADS7843的驱动模块加载到系统内核。运行后取得了理想的效果。


    5、结束语

    触摸屏已成为现代嵌入式设备人机交互的首选输入设备,触摸屏控制器的驱动程序设计当然也就成为嵌入式设备研发的必需工作。本文以ADS7843为例介绍了在嵌入式Linux操作系统中触摸屏控制器驱动程序设计的编程方法。对于在嵌入式Linux操作系统下进行其它设备的驱动开发具有一定的启示作用。


推荐阅读

史海拾趣

FETek Technology(东沅)公司的发展小趣事

随着业务的不断扩展,东沅开始寻求国际化的发展道路。他们积极参加国际电子展会和技术交流活动,与全球各地的客户和合作伙伴建立了广泛的联系。同时,东沅还加大了对品牌建设的投入,通过广告宣传、媒体合作等方式提升品牌知名度和美誉度。这些努力使得东沅在国际市场上逐渐崭露头角,成为一家备受瞩目的电子企业。

EFINIX公司的发展小趣事

随着中国电子行业的快速发展,EFINIX公司看到了巨大的市场潜力。公司积极拓展中国市场,与中国本土企业展开合作,推动Quantum™可编程加速器技术和Trion FPGA产品在中国市场的应用。EFINIX公司的产品和服务得到了中国客户的广泛认可,为中国电子行业的发展做出了积极贡献。

绿宝石(BERYL)公司的发展小趣事

绿宝石公司注重品牌建设和形象提升。公司加大了广告宣传的投入力度,通过电视、网络、户外广告等多种渠道进行品牌推广。此外,绿宝石公司还积极参与社会公益活动,履行企业社会责任。这些举措不仅提升了公司的知名度和美誉度,也增强了消费者对绿宝石品牌的认同感和忠诚度。

GHI Electronics公司的发展小趣事

随着业务的不断拓展,GHI Electronics开始实施全球化战略。公司积极寻求与全球合作伙伴的合作机会,共同开拓新市场。同时,GHI Electronics还在多个国家和地区设立了分支机构或研发中心,以便更好地服务当地客户并快速响应市场需求。这种全球化战略布局不仅增强了GHI Electronics的市场竞争力,也为其带来了更多的商业机会和发展空间。

CINTERION公司的发展小趣事

近年来,随着智能电网技术的快速发展,CINTERION凭借其领先的M2M通信技术,在该领域取得了显著突破。其EU3 M2M模块因其卓越的性能和稳定性,荣获了SmartGrid.TMCnet.com颁发的2011年智能电网杰出奖。这一奖项的获得,不仅证明了CINTERION在智能电网技术创新方面的实力,也为公司在该领域的进一步发展奠定了坚实基础。

Ferraz Shawmut(Mersen)公司的发展小趣事

1885年,Shawmut熔丝公司在美国麻省波士顿市成立,开启了其在电气保护领域的征程。随着技术的不断进步和市场需求的增长,Shawmut逐渐崭露头角。1999年,法国Carbone Lorraine公司收购了Gould Shawmut,并将其与Ferraz公司合并,成立了Ferraz Shawmut公司。这一合并不仅增强了公司的技术实力,也扩大了其市场影响力。

问答坊 | AI 解惑

LCD基础及S3C2410 LCD控制器详解

电视机所采用的 CRT(阴极射线管)有着体积大、重量重、尺寸受限等缺点。随着电子科技的发展,对移动显示的要求越来越多,CRT 的先天限制,让其小型化、行动化的理想受到阻碍。这使得开发新一代的显示器技术变得更有其必要!新一代的显示器讲求几个重 ...…

查看全部问答>

基于TinyOS的装备温度检测系统

摘要:运用无线传感网络技术构建小型无线传感网络,并以基于嵌入式系统TinyOS的结构化编程语言nesC编制系统软件,实现对装备中多个运行部件的无线实时温度检测。其软件含两个模块,分别用于温度采集和无线传送,以及实现无线传送的中继功能。在完成 ...…

查看全部问答>

分享一个National Semiconductor 的网络大学,里面是国半工程师的技术报告视频

里面涵盖广泛 仁者见仁,智者见智啦。 http://www.national.com/analog/training FYI…

查看全部问答>

利用低成本四运放驱动RF调制器

本帖最后由 paulhyde 于 2014-9-15 09:18 编辑  本文介绍的视频电路组合了音频副载波   图1. 用于NTSC制式的陷波器和延迟均衡器   为了获得最佳性能,输入应该由低阻信号源驱动,例如运算放大器或有源滤波器。两个二阶全通滤波环节(U1a、 ...…

查看全部问答>

tooflat的sfilter问题,又来麻烦大家了!

我是初学过滤驱动透明加解密开发,学习了tooflat的源程序,我用ifs kit编译成功了,安装上之后重启,系统就是进不去,请学过这个源程序的同仁帮忙指点一下!…

查看全部问答>

求助......一个IC的擦除问题

MC68HC711KS2 请问哪位老大知道这颗IC写完程序后如何擦除.. 编程器上只有一个erse EEprom,这个不能擦掉全部的…

查看全部问答>

求WINCE下做视频播放方案

在WINCE下做视频播放,要求能播放播放AVI等文件(视频支持MEPG1\\2\\4、Divx、xVid格式,音频支持MP3、WAV、WAV)。对视频播放方面不太了解,请高人赐教方案及技术,有源码更好!~…

查看全部问答>

批量产生警告,请指点!!!!!!!!!!

module        state(rst,clk,bale,iow,la,ld,dout,ad);input        rst;input        clk;input        bale;input        iow;input[3:0 ...…

查看全部问答>

申请TI LM3S8962 评估套件试用

申请TI LM3S8962 评估套件试用分类信息 - 开发板申请预期成果 实现 IEEE 1588精确对时协议时间安排/项目实施细则 11月份上半月熟悉LS3M8962以及contex-m3开发环境。11月下半月到熟悉MDK软件,和Linux 系统移植问题。12月完成Linux系统移植和实现以 ...…

查看全部问答>