首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 开发>Linux 嵌入式>文章内容
嵌入式Linux系统的触摸屏驱动开发
来源:http://www.unix5.com 作者:riechelr_hl 发布时间:2007-07-06  

引言

触摸屏因方便灵活、节省空间、直观等特点,作为嵌入式系统的输入设备越来越受各种终端产品生厂商的青睐。而Linux操作系统因为有着源代码公开、便于裁减的优点,是当前嵌入式系统的一大热门选择。本文把在构造硬件的基础上,深入的讨论怎么样在Linux操作系统里编写一个触摸屏驱动。

SPI接口的简介

串行外围设备接口SPI总线技术是摩托罗拉公司推出的一种全双工、同步串行接口,它提供了功能强大的四线接口(接收线、传输线、时钟线和从片选线)。

SPI的从设备和主设备共用一个时钟线,而时钟始终是从主设备里发送出来的。当823e是主模式的时候,片选信号线就停用,如果是从模式的话,它的从片选线低电平使能。在本例中,823e是主设备,所以我们另外选用了一个823e的GPIO(通用输入输出口)作为从设备的片选信号。大多数同步串行式数据转换器都很容易与这种接口连接,其硬件功能很强,所以,与SPI有关的软件就相当简单,使CPU有更多的时间处理其他事务。

触摸屏的硬件

触摸屏输入系统由触摸屏、触摸屏控制芯片和数据处理器三部分组成。触摸屏按其技术原理可分为五类:矢量压力传感式、电阻式、电容式、红外线式和表面声波式,其中电阻式触摸屏在嵌入式系统中用的较多。

我们选用的触摸屏是AMD公司的电阻式触摸屏AMT 9502。触摸屏控制芯片是TI公司的模数转换芯片ADS7846。该芯片支持SPI通信协议,所以我们就用823e的SPI接口与ADS7846芯片通信,从触摸屏得到的模拟信号经过模数转换器后输入作为数据处理器的823e。

软件程序

823e通过SPI接口与触摸屏控制器通信,所以对触摸屏的控制就是对SPI接口的操作。完成SPI接口驱动的编写之后,就能够与触摸屏控制器建立通信。在Linux内核运行完毕之后,SPI接口要打开,并且已经分配了一部分内存供它使用。同时,SPI的中断程序已经加入等待队列,一旦SPI接口有中断,SPI的中断服务程序就被唤醒,开始运行。这部分的工作是在系统启动过程中运行的初始化函数来完成的。下面把结合源代码来讨论初始化函数的编写,其中,就两点进行重点讨论。

因为SCCx的网络参数空间和SPI的参数空间有冲突,如果要在使用SCCx作为网口的同时还使用SPI驱动的话,就要装载microcode,然后重新定位SPI的参数空间。而micropatch就是装载microcode的一个文件,这个文件里的microcode可以到motorola的官方网站上去下载。

CPM包括一部分双向RAM口,称为参数RAM,它包括USB、SCC、SMC、SPI、I2C和IDMA信道操作。其中,SPI和I2C参数区域可以被重新定位到另外的32位的参数区域。仔细阅读完下面的代码,就可以很好的理解这个过程是怎么样操作的了:

 

spi = (spi_t *)&cp->cp_dparam[PROFF_SPI]; 
printk(" the spi addr is %p\n",spi); 
if ((reloc = spi->spi_rpbase)) 
{ 
spi = (spi_t *)&cp->cp_dpmem[spi->spi_rpbase]; 
printk(" MICROCODE RELOCATION PATCH \n"); 
}

上面这一端代码的作用是:首先查询是否已经使用了microcode,然后取得重新定位后的指针(装载microcode和重新定位的操作在microcode.c里完成)。

RAM里的SPI描述符

有关SPI接口的描述符保存在缓冲区里,缓冲区的地址由双向RAM里SPI缓冲区描述符指定。要发送的数据在发送缓冲区里,接收的数据把被存到发送缓冲区里。缓冲区描述符环路组成一个环路,帮助逐步传输(接收)想要发送(接收)的数据。正是由于这些缓冲区描述符,通信处理模块才能够完成通信,并且说明并处理错误。

可以通过一段代码来看上面示意图的过程是怎么样在初始化函数里实现的:

 

spi->spi_rbase = r_rbase = dp_addr; 
spi->spi_tbase = r_tbase = dp_addr + sizeof(cbd_t); 
/*把RXBD RING的地址写入POINTER TO SPI RX RING 
把 TXBD RINT 的地址写入POINTER TO SPI TX RING*/ 
spi->spi_rbptr = spi->spi_rbase; 
spi->spi_tbptr = spi->spi_tbase; 
/*以上的两句代码必须得写,否则的话就会在读写氖焙蛩阑?/ 
tbdf = (cbd_t *)&cp->cp_dpmem[r_tbase]; 
rbdf = (cbd_t *)&cp->cp_dpmem[r_rbase]; 
/*从这句代码里可以看出,RXBDRING的地址是在双向RAM里*/ 
tbdf->cbd_sc &= ~BD_SC_READY; 
rbdf->cbd_sc &= ~BD_SC_EMPTY; 
/*设置RING的状态,发送的RING 设置成非准备发送状态, 
接受的RING设置成非准备接受状态*/ 
rxbuffer = m8xx_cpm_hostalloc(2); 
txbuffer = m8xx_cpm_hostalloc(2);/*得到两个空间 */ 
tbdf->cbd_bufaddr = __pa(txbuffer); 
rbdf->cbd_bufaddr = __pa(rxbuffer); 
/*内存映射;并把DATA POINTER 设置成RX DATA BUFFER 的地址*/

共2页: 上一页 1 [2] 下一页
 
如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·嵌入式Linux系统下图形库讲解及
·Qt/Embedded在嵌入式Linux中的应
·嵌入式Linux:uClinux操作系统移
·嵌入式系统 Boot Loader 技术内
·嵌入式 用户图形接口uC/GUI的简
·基于GTK+和X的GUI在嵌入式Linux
·嵌入式Linux系统下的MiniGUI研究
·Linux串口上网的简单实现 (图解)
·在Ubuntu上建立Arm Linux的开发
·嵌入式Linux操作系统启动信息完
·Linux 2.6 内核的嵌入式系统应用
·嵌入式Linux在Blackfin处理器上
  相关文章
·嵌入式Linux的DiskOnChip设备驱
·基于嵌入式Linux的PMP系统设计与
·用Linux构造嵌入式实时应用系统
·用Linux构造嵌入式实时应用系统
·三种嵌入式操作系统的深入分析与
·Sharp Zaurus 手持式系统是嵌入
·基于GTK+和X的GUI在嵌入式Linux
·嵌入式Linux操作系统名词资源讲
·嵌入式Linux系统下图形库讲解及
·Linux高手进阶 嵌入式系统设计开
·嵌入式Linux系统下的MiniGUI研究
·嵌入式Linux 中的应用中的GTK+

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!