.write=xxxxwrite, .ioetl=xxxxioetl, statieintinitxxxxinit(void) register_ehrdev(xxxx_dev_no,DEV_NAME,&fops); } statievoid_exitxxXx_exit(void) { unregister_Chrdev(xxXx_dev_no,DEV_NAME); } moduleinit(xxxxinit); moduleexit(xxxxexit); 4.3触摸屏驱动程序设计 触摸屏也属于字符设备的一种,它的操作方式也是以文件形式进行的〔2‘〕,在本文 中将触摸屏驱动化作几个功能模块来介绍,包括初始化硬件、驱动的加载与卸载、中 断与定时器处理以及坐标处理等。 4.3.1触摸屏的硬件介绍 53C2440的A/D转换输入总共有八路,其中有一半是与触摸屏复用,如果xP、XM、 YP、YM不用作触摸屏输入时可以作为A/D转换使用。 s3c2440的触摸屏端口可以有以下几种工作模式〔绷: 1)正常工作模式:这个模式下跟普通的的A/D转换一样。具体实现方式是在 ADC控制寄存器中设置,而读写操作是在ADC数据寄存器O中实现。 2)横纵坐标自动转换:这个模式下,控制器依次转换触摸点的横坐标和纵坐 标,横坐标和纵坐标都转换完成之后,控制器会产生INT_ADC中断。 3)横纵坐标单独转换:触摸屏控制器顺序分别转换横坐标与纵坐标,横坐标 写入ADCDATO的XPDAT中然后产生中断,纵坐标写入ADCDATI的YPDAT中然后产生中 断。 4)等待中断模式:在这个模式下,当触点信号到来时,控制器产生工NT_TC 中断信号,然后横坐标位置和纵坐标位置能被相应的转换模式读取到。 4.3.2触摸屏驱动程序实现 (1)构造结构体与硬件控制 首先要封装一个触摸屏设备结构体,在这里为了简便,可以让这个结构体包含触 摸屏设备的所有信息: Struettoueh_Sereen{ ehar*name; struetinPut_devmydev: struetelk*ade_elk; unsignedlongPhys_base,virt_base; intmaP_size; unsignedlongadetse,adeeon,adedly, adeuPdn,adedato,adedatl; struettimer_listtm; intinterval; void(*enable)(struettouehsereen*); void(*disable)(struettouehsereen*); void(*wait4down)(struettouehsereen*); void(*wait4up)(structtouch_Screen*); void(*auto夕 st)(Struettoueh_sereen*); int(*get_X)(struettoueh_sereen*); int(*get_y)(Structt。ueh_screen*); int(*down)(struettouehsereen*); }s3e244o_ts; 触摸屏设备结构体封装完毕后,还有一个触摸屏驱动文件操作结构体需要初始化, 在触摸屏设备驱动中,还要依次完成oPen、release、read等功能函数,因此其文件 操作结构体定义如下: statiestrueturefile_operationss3e244o_fops={ .owner=THISMODULE, .OPen=ts_oPen, .read=tsread, .release=tsrelease, }; 接下来要做的是实现触摸屏驱动中的硬件控制,在本次设计中采用的工作模式是 自动 void { X/Y位置转换模式,具体的硬件控制代码如下: s3e2440tsenable(struettouehsereen*ts) ts一 >ade_eIk=eIk_get(NULL,”ade“); elkuse(ts一 )adeelk); elkenable(ts一 >adeelk); ts一)wait4down(ts); } void53C2440_ts_disable(struettoueh_sereen*ts){ elk_disable(ts一)ade_elk); eIkunuse(ts一 )adeelk); eIk夕 ut(ts一)ade_elk); } voids3C2440_ts一 ait4down(struettoueh_sereen*ts){ iowrite32(3}(l<<4)1(1(<6)l(l<<7)j(O<<8)ts一>adetse) void53e2440_ts一 ait4up(struettoueh_sereen*ts){ iowrite32(31(l<<4)(1((6)(l<<7)(1<(8)ts一>adetse) void53e2440_ts_auto夕 St(Struettoueh_sereen*ts){ iowrite32((1(<2),ts一)adetse); iowrite32(11(30(<6)l(l(<14),ts一>adeeon); ints3e244otsdown(struettouehsereen*ts){ 1fltTet if(ioread32(ts一>adeupdn)&l){ ret=1 else ret=O } iowrite32(O,ts一>adeupdn) retUrflYet; 〕 ints3e244o_ts_get_x(struettouehSCreefl*ts){ returnioread32(ts一)adedato)&Ox3ff; ints3e244o_ts_get_y(struettoueh_sereen*ts){ returnioread32(ts一>adedatl)&Ox3ff; voiddestroy_toueh_sereen(struettoueh_sereen*ts){ iounmap(ts一>virt_base); release_me几region(ts一)phys_base,ts一>map_size); (2)驱动模块加载与卸载函数 |