免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > linux > linux字符设备驱动的程序设计(3)

linux字符设备驱动的程序设计(3)

时间:2012-06-12 21:24来源:未知 整理:寂涯网络 点击:


 .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)驱动模块加载与卸载函数

本页地址 http://www.jybase.net/linux/20120612950.html

百度搜索更多

谷歌搜索更多

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com