📄 电子设计信息网 - 基于pxa255的触摸屏控制器ads7843驱动程序设计.htm
字号:
target=_self>新闻</A> <SPAN class=n12>|</SPAN> <A
class=link3 id=Navigator1_HyperLink3
href="http://www.edires.net/index/marketing.html"
target=_self>市场</A> <SPAN class=n12>|</SPAN> <A
class=link3 id=Navigator1_HyperLink4
href="http://www.edires.net/index/subjectindex.html"
target=_self>专题</A> <SPAN class=n12>|</SPAN> <A
class=link3 id=Navigator1_HyperLink5
href="http://www.edires.net/index/product.html"
target=_self>产品</A> <SPAN class=n12>|</SPAN> <A
class=link3 id=Navigator1_HyperLink6
href="http://www.edires.net/index/talk.html"
target=_self>访谈</A> <SPAN class=n12>|</SPAN> <A
class=link3 id=Navigator1_HyperLink7
href="http://www.edires.net/index/tech.html"
target=_self>技术文章</A> <SPAN class=n12>|</SPAN> <A
class=link3 id=Navigator1_HyperLink8
href="http://www.edires.net/index/solution.html"
target=_self>解决方案</A> <SPAN class=n12>|</SPAN> <A
class=link3 id=Navigator1_Hyperlink13
href="http://www.edires.net/index/techhot.html"
target=_self>技术热点</A> <SPAN class=n12>|</SPAN> <A
class=link3 id=Navigator1_HyperLink9
href="http://www.edires.net/index/freshman.html"
target=_self>新手园地</A> <SPAN class=n12>|</SPAN> <A
class=link3 id=Navigator1_HyperLink10
href="http://www.edires.net/index/yellow.html"
target=_self>黄页</A> <SPAN class=n12>|</SPAN> <A
class=link3 id=Navigator1_HyperLink11
href="http://www.edires.net/download/"
target=_self>下载</A> <SPAN class=n12>|</SPAN> <A
class=link3 id=Navigator1_Hyperlink14
href="http://www.edires.net/index/exhibition.html"
target=_self>展会</A> <SPAN class=n12>|</SPAN> <A
class=link3 id=Navigator1_Hyperlink15
href="http://www.edires.net/hr/" target=_self>人才</A>
<SPAN class=n12>|</SPAN> <A class=link3
id=Navigator1_HyperLink12
href="http://www.edires.net/bbs/" target=_blank>论坛</A>
</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<P></P></TD></TR>
<TR>
<TD width="1%"></TD>
<TD width="74%" height=23><SPAN class=n12>您的位置: <SPAN
id=lblNavigation><A class=link2 href="http://www.edires.net/">首页</A>
> <A class=link2
href="http://www.edires.net/index/tech.html">技术文章</A> > <A
class=link2
href="http://www.edires.net/snewssystem/listnews.aspx?type=%c7%b6%c8%eb%ca%bd%cf%b5%cd%b3">嵌入式系统</A>
> 正文</SPAN></SPAN></TD>
<TD width="11%" height=23><IMG height=14
src="电子设计信息网 - 基于PXA255的触摸屏控制器ADS7843驱动程序设计.files/zt1_01.gif"
width=18> <A class=link6
href="http://www.edires.net/article/129.html#">打印版</A></TD>
<TD width="14%"><IMG height=11
src="电子设计信息网 - 基于PXA255的触摸屏控制器ADS7843驱动程序设计.files/zt1_02.gif"
width=17> <A class=link6
href="http://www.edires.net/article/129.html#">推荐给同仁</A></TD></TR>
<TR>
<TD vAlign=top bgColor=#ffffff colSpan=4>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%">
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top width=10 bgColor=#ffffff rowSpan=10></TD>
<TD class=title3 vAlign=center bgColor=#ffffff colSpan=2
height=40>
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="100%"
border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><SPAN id=lblTitle
style="FONT-SIZE: 14px">基于PXA255的触摸屏控制器ADS7843驱动程序设计</SPAN><BR><SPAN
id=lblSubTitle
style="FONT-SIZE: 12px"></SPAN></DIV></TD></TR></TBODY></TABLE></DIV></TD></TR>
<TR>
<TD class=n12 vAlign=center bgColor=#ffffff colSpan=2
height=40>
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="100%"
border=0>
<TBODY>
<TR>
<TD>
<DIV align=center>作者:<SPAN id=lblAuthor>李外云 胡文静
刘锦高</SPAN> <SPAN
style="WIDTH: 10px"></SPAN>来源:<SPAN
id=lblFrom>电子设计信息网-www.edires.net</SPAN> <SPAN
style="WIDTH: 10px"></SPAN>时间:<SPAN
id=lblTime>2006-11-30 9:42:12</SPAN> <SPAN
style="WIDTH: 10px"></SPAN>阅读次数:<SPAN
id=lblClickNum>654</SPAN> <SPAN
style="WIDTH: 10px"></SPAN>阅读等级:<SPAN
id=lblLevel></SPAN> <SPAN
style="WIDTH: 10px"></SPAN>需要积分:<SPAN
id=lblNeedScore>0</SPAN>
</DIV></TD></TR></TBODY></TABLE></DIV></TD></TR>
<TR>
<TD vAlign=top width="100%" bgColor=#ffffff>
<BLOCKQUOTE>
<DIV style="FLOAT: right">
<OBJECT id=obj1
codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0
height=250 width=300 border=0
classid=clsid:D27CDB6E-AE6D-11CF-96B8-444553540000><PARAM NAME="_cx" VALUE="7938"><PARAM NAME="_cy" VALUE="6615"><PARAM NAME="FlashVars" VALUE=""><PARAM NAME="Movie" VALUE="../images/电源300250.swf"><PARAM NAME="Src" VALUE="../images/电源300250.swf"><PARAM NAME="WMode" VALUE="Window"><PARAM NAME="Play" VALUE="-1"><PARAM NAME="Loop" VALUE="-1"><PARAM NAME="Quality" VALUE="High"><PARAM NAME="SAlign" VALUE=""><PARAM NAME="Menu" VALUE="-1"><PARAM NAME="Base" VALUE=""><PARAM NAME="AllowScriptAccess" VALUE=""><PARAM NAME="Scale" VALUE="ShowAll"><PARAM NAME="DeviceFont" VALUE="0"><PARAM NAME="EmbedMovie" VALUE="0"><PARAM NAME="BGColor" VALUE=""><PARAM NAME="SWRemote" VALUE=""><PARAM NAME="MovieData" VALUE=""><PARAM NAME="SeamlessTabbing" VALUE="1"><PARAM NAME="Profile" VALUE="0"><PARAM NAME="ProfileAddress" VALUE=""><PARAM NAME="ProfilePort" VALUE="0"><PARAM NAME="AllowNetworking" VALUE="all"><PARAM NAME="AllowFullScreen" VALUE="false">
<embed
src="../images/电源300250.swf"
pluginspage="http://www.macromedia.com/go/getflashplayer"
type="application/x-shockwave-flash"
name="obj1" width="300" height="250" quality="High">
</OBJECT> </DIV><SPAN class=n12
id=lblContent>摘要:在研发具有操作系统的设备时,高质量的设备驱动程序可以大大提高设备的稳定性与可靠性。本文以<A
class=keyword
href="http://www.edires.net/snewssystem/search.aspx?q=触摸屏"
target=_blank>触摸屏</A>控制器ADS7843为例,介绍了其内部结构、工作原理,并详细阐述了在Linux操作系统的设备文件系统机制中编写设备驱动程序的过程与方法,同时给出基于PXA255微外理器的触摸屏控制器ADS7843中断方式的驱动程序。
<BR><BR>关键词:嵌入式Linux;触摸屏;ADS7843;PXA255微处理器
<BR><BR>在便携式的电子类产品中,触摸屏由于其便、灵活、占用空间少等优点,已经逐渐取代键盘成为嵌入式计算机系统常选用的人机交互输入设备。触摸屏输入系统由触摸屏、触摸屏控制器、微控制器及其相应的驱动程序构成。本文从触摸屏控制器的驱动程序设计着手,介绍触摸屏控制器ADS7843的内部结构及工作原理和在嵌入式Linux操作系统中基于PXA255微处理器的ADS7843驱动程序设计。
<BR><BR>1 触摸屏控制器ADS7843的介绍 <BR>1.1 ADS7843的内部结构
<BR>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正在进行数据转换;V<SUB>REF</SUB>参考电压输入端,电压值在+1V到+V<SUB>CC</SUB>之间变化;PENIRQ为笔触中断,低电平有效;IN3、IN4为辅助ADC转换输入通道;+V<SUB>CC</SUB>为电源输入。
<BR><IMG
src="电子设计信息网 - 基于PXA255的触摸屏控制器ADS7843驱动程序设计.files/257.jpg"
border=0><BR>图1 ADS7843内部结构 <BR><BR>1.2 ADS7843的转换时序
<BR>ADS7843完成一次数据转换需要与微控制器进行3次通信,第一次微处理器通过异步数据传送向ADS843发送控制字,其中包括起始位、通道选择、8/12位模式、差分/单端选择和掉电模式选择,其后的两次数据传送则是微控制器从ADS7843取出16bitA/D转换结果数据(最后四位自动补零),每次通信需要8个时钟周期,完成一次数据转换共需24个时钟周期,图2为ADS7843转换时序。<BR><IMG
src="电子设计信息网 - 基于PXA255的触摸屏控制器ADS7843驱动程序设计.files/256.jpg"
border=0><BR>图2 ADS7843转换时序
<BR><BR>2 ADS7843与PXA255硬件接口
<BR>PXA255微处理器是Intel公司生产的第二代基于32位XScale微架构的集成系统芯片(ISOC),PXA255具有高性能、低功耗等优点,它除了XScale微内核外,还集成了许多适用于手持设备市场需要的外围设备。图3为ADS7843触摸屏控制器与PXA255微处理器的硬件连线示意图。当屏触发生时ADS7843向PXA255发出中断请求,由PXA255响应该中断请求,启动通信过程,读取ADS7843的转换结果,从而得到触摸点的坐标。ADS7843各信号的时序受外部输入时钟信号频率的影响,一旦外部输入时钟频率固定,各信号的时序便完全确定,因此需要配置PXA255的接口信号时序,使之完全符合ADS7843的时序。
<BR><IMG
src="电子设计信息网 - 基于PXA255的触摸屏控制器ADS7843驱动程序设计.files/258.jpg"
border=0><BR>图3 ADS7843触摸屏控制器与PXA255微处理器的连线示意图
<BR><BR>3 ADS7843驱动程序的设计
<BR>Linux作为一个宏内核操作系统,其设备驱动都在内核,即系统空间实现,实现方式有两种,一种是将有关的设备驱动程序和数据结构静态地连接在内核映像中;另一种是将具体的设备驱动程序和数据结构独立加以编译,成为可安装的模块,需要时由应用程序通过系统调用动态地予以安装或拆卸。设备驱动的实现方法也有两种,一种是轮询(polling)方式,另一种是中断(inter-rupt)方式,轮询方式对设备的操作完全由CPU掌握,外部设备则完全处于被动状态。中断方式是由外部设备主动提出申请,CPU响应申请后对外部设备进行处理,是现在常用的设备驱动方式。Linux的设备驱动具有两个显著的特点,其一是把所有的设备视为一种设备文件,每个设备都呈现于文件系统的/dev目录下,设备驱动与文件操作具有相同的界面和语义,并通过同一组系统调用进行操作;另一个显著特点是Linux的设备驱动有着分明的层次和结构。
<BR><BR>Linux内核的新近版本为设备入口提供了一种特殊的文件系统,即设备文件系统devfs(device
file
system)。新的devfs机制的优点在于:①各种设备驱动模块动态地向系统登记,设备初始化时在/dev目录下创建设备入口点,移除设备时将其删除。②设备驱动程序可以指定设备名、所有者和权限位。③不需要为设备驱动程序分配主设备号以及次设备号。④当装载和卸载模块时,不再需要运行脚本来创建设备文件,驱动程序自主地管理其设备文件。采用devfs机制的设备驱动程序调用下面的函数来处理设备的创建和删除工作。<BR><BR>devf
s_hander_t devf s_mk_dir ( devf s_ han2 der_t dir
,const char 3 name ,void 3 info) <BR>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) <BR>void devf s_unregister (devf s_hander_t de)
<BR><BR>在Linux操作系统编写设备驱动程序时有几个固定的功能模块:向Linux内核注册该设备时的初始化设备驱动程序模块;用于系统卸载模块时删除设备驱动程序的模块;提供用户使用该设备驱动程序的文件操作接口模块。对于各类具体设备编写驱动程序时还应具有对该设备进行操作的应用函数。下面就以ADS7843驱动程序设计为例分析以上几个功能模块。
<BR><BR>1) <A class=keyword
href="http://www.edires.net/snewssystem/search.aspx?q=ADS7843"
target=_blank>ADS7843 </A>向Linux 内核注册设备时的初始化函数 <BR>int
__init ads7843_t s_init (void) / / 设备初始化函数 <BR>{int
ret ; <BR>if ( ( ret = devf s _ register _ chrdev ( TS
_ MAJOR , TS _ NAME , &ads7843_t s_fops) ) ! = 0)
<BR>{ print k (" registering of " TS_NAME " is failed\
n" ) ; return ret ;} <BR>devf s_t s_dir = devf
s_mk_dir (NULL , " touchscreen" , NULL) ; / /
建立触摸屏设备目录 <BR>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) ; / / 注册设备 <BR>if ( ( ret =
request_irq( IRQ_ GPIO_ADS7843 , ads7843_t
s_inter-rupt , <BR> SA_SHIRQ| SA_INTERRUPT ,
TS_NAME , dev_ id) ) ) / / 申请中断 <BR>{ print k
("ads7843_t s_init : failed to register IRQ\ n" ) ;
<BR> f ree_irq( IRQ_GPIO_ADS7843 , dev_id) ; return
ret ;} <BR>if ( ( ret = ads7843_init () ) ! = 0) /
/ 初始化触摸屏 <BR>{f ree_irq( IRQ_GPIO_ADS7843 , dev_id) ;
return ret ;} <BR>GPDR0 & = ~GPIO_bit
(ADS7843_BUSY) ; <BR>GPDR0 & = ~GPIO_bit
(ADS7843_DOU T) ; <BR>Ads7843_Enable_IRQ() ;/ / 开启中断
<BR>print k ("ads7843 touch screen driver initialized\
n" ) ; <BR>return 0 ;} <BR><BR>2) 系统卸载ADS7843 驱动程序功能函数
<BR>void __exit ads7843_t s_cleanup (void) / /
卸载驱动程序函数 <BR>{ if (in_timehandle) <BR> del_timer (
&timer) ; <BR>f ree_irq( IRQ_GPIO_ADS7843 ,
dev_id) ; / / 释放中断 <BR>devf s_unregister_chrdev(
TS_MAJOR , TS_NAME) ;/ / 从系统中删除设备驱动程序 <BR>print k ("
ads7843 touch screen driver removed\ n" ) ;}
<BR><BR>3) 在驱动程序最后用于模块初始化和删除驱动的功能函数 <BR>module_init
(ads7843_t s_init) ;/ / 初始化驱动模块函数 <BR>module_exit
(ads7843_t s_cleanup) ;/ / 删除驱动模块函数 <BR><BR>4) ADS7843
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -