找回密码
 注册
关于网站域名变更的通知
查看: 313|回复: 2
打印 上一主题 下一主题

基于Linux系统和i.MX27芯片的电阻式触摸屏驱动系统设计

  [复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-3-12 15:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
 1 引言
6 n0 H1 U% l( H5 m  随着计算机技术的发展和普及,触摸屏技术得到了越来越广泛应用,在各种手持设备中,如手机、MP4、掌上游戏机、掌上PDA 等,由于其方便、舒适,使其完全摆脱了键盘和鼠标的束缚,使人机交互更为直截了当。而在微软最新开发的windows 7操作系统中,就有其值得骄傲并加以推广的多点触摸技术,并成为一大卖点。可见,触摸屏技术引起了上到微软,下到普通老百姓的关注。而在我们的日常生活中,无论你是在商场购物,还是在银行存取款,触摸式的自动服务器将能为你提供了方便快捷的服务。这里通过对触摸屏原理的理解和分析,成功的设计出了CPU与触摸屏芯片之间的硬件连接,并依照硬件和驱动设计的原理,设计出了基于嵌入式Linux 和飞思卡尔i.MX27芯片以及AD7873触摸屏芯片的驱动程序,并成功移植到内核中,实现了家庭控制器系统的触摸技术。
; `) V( I+ C: S1 @1 j  2 硬件系统的构成
# p7 E) B( {- D# R  D8 F  2.1 电阻式触摸屏原理
0 r3 T. {2 p6 `. k3 h  电阻式触摸屏是一种传感器,它将矩形区域中触摸点(X,Y)的物理位置转换为代表X 坐标和Y 坐标的电压。当触摸屏表面受到的压力(如通过笔尖或手指进行按压)足够大时,顶层与底层之间会产生接触。所有的电阻式触摸屏都采用分压器原理来产生代表X 坐标和Y 坐标的电压。如图1 所示,分压器是通过将两个电阻进行串联来实现的。上面的电阻(R1)连接正参考电压(VREF),下面的电阻(R2)接地。两个电阻连接点处的电压测量值与下面那个电阻的阻值成正比。 为了在电阻式触摸屏上的特定方向测量一个坐标,需要对一个阻性层进行偏置:将它的一边接VREF,另一边接地。6 i* m6 {$ U4 b2 b
  同时,将未偏置的那一层连接到一个ADC 的高阻抗输入端。当触摸屏上的压力足够大,使两层之间发生接触时,电阻性表面被分隔为两个电阻。它们的阻值与触摸点到偏置边缘的距离成正比。触摸点与接地边缘之间的电阻相当于分压器中下面的那个电阻。因此,在未偏置层上测得的电压与触摸点到接地边之间的距离成正比。# [; R. }! w; L) ^$ \$ ~
  图1 原理示意图
2 Q1 y2 R/ Y3 C  2.2 AD7873 介绍及与系统硬件原理
7 y8 |: p% k3 b) W0 d, J  AD7873 是一款12 位逐次逼近型ADC,具有同步串行接口以及用于驱动触摸屏的低导通电阻开关,采用2.2 V 至5.25V 单电源供电,吞吐量大于125KBPS.
+ l. N# A3 t( e  ?( ?7 T  AD7873 可用于电池测量、温度测量和触摸压力测量,还具有一个2.5 V 片上基准电压源,可用于辅助输入、电池监控器和温度测量等模式。不使用时,可关断内部基准电压源以降低功耗。也可以使用外部基准电压,并可在1V 至VCC 范围内变化,模拟输入范围为0V 至VREF.这款器件具有关断模式,此模式下功耗不足1μA。
' }5 r3 x% R6 P& B/ c  2.3 AD7873 与CPU 和触摸屏的硬件连接图
' M; q3 _& t9 F5 _/ y  其硬件原理框图如下,其中的X+,Y+,X-,Y-与触摸屏的相应引脚相连,接受来自触摸屏的模拟信号,然后经过AD7873 芯片的内部处理成数字信号,通过SPI 总线将数据传送给CPU,请求处理。CS 为片选引脚,与CPU 的DTR_DCE1 相连,PENIRQ 为中断引脚,接CPU 的GPIO1_0.: J# y( E; I( r, R7 D2 S& J) h
  基于Linux系统和i.MX27芯片的电阻式触摸屏驱动系统设计
- k; a6 n& [! o! P- W% B3 f  图2 硬件连线图, _1 |' ?3 i6 G* y6 K
  基于Linux系统和i.MX27芯片的电阻式触摸屏驱动系统设计
+ x$ t' M: F; K' `& Q5 q  图3 触摸系统框图
; b" B# i: Z( m  3 软件系统
" U( o6 \+ l+ I( y7 n( n' u  3.1 Linux 设备驱动介绍2 k/ D+ p8 b' L8 N
  在Linux 系统中,为了简化对设备的管理,所有的外围设备被归结为3 类:字符设备、块设备、网络设备。Linux 对所有的物理设备进行了抽象,并定义了一个统一的概念:接口。AD7873 被定义为一个字符设备,采用spi 接口与CPU 通讯。# |* f6 i1 i$ s4 A" s3 j& P2 t
  3.2 驱动部分重要函数的设计
6 s; M( M, o, l  (1) 设备驱动程序中数据结构strcut driver 定义了一系列函数操作的接口,这个数据结构将整个驱动连为一体,由这个结构可以看出整个驱动的脉络。由于AD7873 与CPU 连接方式为SPI 总线连接,因此将此设备注册为SPI 设备,即要用到数据结构structspi_driver.! u$ R! g% w9 ?2 G
  对应于AD7873 设备,设计编写的数据结构如下:
! s1 T) Z0 L5 E1 s1 R: m  基于Linux系统和i.MX27芯片的电阻式触摸屏驱动系统设计- d. t8 c# \4 P
  其中,driver 中定义了驱动名称、总线类型和驱动所有者。
' o8 n. l, d5 x' L  probe 函数为探测设备的函数。其主要进行初始化设备数据结构、初始化中断、向设备发送控制字等。
' ~/ ]1 \4 i+ K5 T$ [3 M  remove 函数为设备移除函数。其主要进行移除设备文件、释放中断、释放设备。
0 u$ N) F- L$ f$ c  suspend 为设备暂停函数。8 ^  H2 I, a/ `! m' ]1 r; q
  resume 为设备恢复函数。% y" h* l4 c6 x: H4 H  G
  (2 设备初始化函数 static int __init ad7873_nit(void)即是注册上述数据结构,也即是注册一个驱动,其中主要的内容为:7 k  q9 i  P  I1 }3 f
  return spi_register_driver(&ad7873_driver);(3) 还要设计一个重要的函数,就是中断函数,在触摸屏被按下的时候产生中断,在中断函数中的重要工作就是启动定时器,以判断触摸后的动作是触摸笔被提起还是继续按下。其函数原型设计为staticirqreturn_t ads7873_irq(int irq, void *handle);(4)定时器函数设计的目的就是判断触摸屏是否被提起,被提起就立刻刷新设备的数据到应用层,仍然处于“按下”状态,则需要继续测量。其函数原型设计为:
& u3 T8 n! P9 V  static void ads7873_timer(unsigned longhandle);. X8 \% @! |& @! X
  3.3 驱动的编译和加载
) g9 n/ L2 n0 c  驱动程序加入内核有两种方式动态和静态,动态就是只是把驱动编译为模块, 系统启动后执行insmod 后加载,静态是指直接编译进内核,系统启动后自动加载了。由于我们的驱动需要经过测试才能加入内核,因此采用动态的方式加载驱动。. T, u) a0 q" U  J/ z! V
  在已经安装好开发平台的主机上执行make, 就可以得到目标文件ad7873.ko,这就是我们需要的驱动。在platform_data 数据结构中设置好驱动需要的数据,如中断、触摸屏大小、触摸压力上下限等数值,并编译好内核下载到开发板中运行。然后将ad7873.ko 复制到开发板,在终端下执行insmodad7873.ko,得到如下提示:
& z; t" X9 Q4 t  基于Linux系统和i.MX27芯片的电阻式触摸屏驱动系统设计' D6 _5 E: |2 P  p( ^1 N: `
  图4 驱动加载信息
* D$ S, j6 b( s5 s8 [  显示驱动已经加载成功,中断号为126.% T, H( ]* L+ j, ]; a
  (注:“this sectence has been”,为调试驱动中断的测试语句)然后用应用广泛的tslib 触摸屏测试程序对驱动进行测试,测试结果显示,触摸屏工作正常。下图触摸屏上白色的字“桂林电子科技大学触摸屏”为在tslib 的测试程序下用触摸笔写的字,证明了触摸屏工作是正常的。- F: V1 `# l6 t& ^
  将此设计应用到家庭智能网关系统中,证明其工作稳定,响应很快。  U' E1 l2 i4 E4 w( m
  基于Linux系统和i.MX27芯片的电阻式触摸屏驱动系统设计
& W, p1 r1 A) H" o  图5 触摸屏正常响应图, F: t: E+ l, K2 t
  4 驱动程序出现的问题及解决方法
9 z9 S1 f7 [; H  在调试驱动的过程中,出现了很多问题,主要有以下两个:4 F) U8 J3 p. F6 s- B
  4.1 加载时报错
% b" U) B0 d# e# s) ~9 {) e6 m  在执行insmod ad7873.ko 时,报错为:
, `7 [! P3 g5 G7 b  ad7873: no version for “struct_module”found: kernel tainted.
0 N" Y6 h2 L' P  经过检查,发现是因为platform_data 里面定义的。model=“7873”被写成了。model=“7883”,造成了系统无法识别这个驱动,产生了错误,修改后执行insmod ad7873.ko 成功。- g) x4 B0 G% n  Z5 ]0 s
  4.2 使用tslib 测试软件测试的时候,屏幕无反应
( J$ s( O7 E# a3 Y% M# \9 P- p  {( r  原以为是中断程序出了问题,因此在中断里面设置打印信息,发现可以打印,于是确定了中断时正常响应了的。然后跟踪代码检查,发现定时器函数很可疑,于是在定时器函数设置打印信息,发现定时器函数没有正确执行,找到了问题的所在。于是顺藤摸瓜,终于发现原来是在这个函数中fn_get_pendown_state(void),也就是用来得到触摸屏状态的引脚设置不正确,导致定时器函数里面无法得到触摸屏的状态,所以无响应。修改了定时器的引脚定义使其指向正确的引脚便一切OK。! ]9 P  z  ~; T9 B! r' q- Z
  5 结论* M- z. `7 y, k, J9 Q
  本文从硬件到软件设计了整个触摸屏驱动系统。作为家庭无线智能控制器的一部分,触摸屏使整个系统使用更方便与高效。而未来随着对触摸技术的越来越高的要求,如多点触摸技术,需要驱动为上层应用提供更稳定的处理与更多的接口,以便上层应用可以更加高效的编写应用程序来应对复杂的机制。这就需要在内核驱动层改进驱动的结构与算法来应对。
5 t& b. I8 H7 k! e! k- R$ m: l

评分

参与人数 1威望 +2 收起 理由
CE_Manager + 2 赞一个!

查看全部评分

该用户从未签到

2#
发表于 2020-3-12 16:37 | 只看该作者
将此设计应用到家庭智能网关系统中,证明其工作稳定,响应很快。

该用户从未签到

3#
发表于 2020-3-13 17:35 | 只看该作者
这里通过对触摸屏原理的理解和分析,成功的设计出了CPU与触摸屏芯片之间的硬件连接,并依照硬件和驱动设计的原理,设计出了基于嵌入式Linux 和飞思卡尔i.MX27芯片以及AD7873触摸屏芯片的驱动程序,并成功移植到内核中,实现了家庭控制器系统的触摸技术。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-21 07:16 , Processed in 0.109375 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表