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

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

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

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


触摸屏驱动程序的加载函数中主要实现的功能有设备号的申请、cdev的注册、中
断的申请以及定时器的初始化等〔23]。
而在卸载函数则完成相反的工作,如释放存储空间,注销设备、释放中断和删除
定时器等。
模块加载函数具体代码如下:
  inttsinit(void)
 intret=O
    1nittouchScreen(&53C2440ts);//触摸屏硬件连接初始化函数
s3e244o_ts。Mydev.name=s3e244o_ts.name:
/*注册设备号*/
s3c244o_ts。mydev。evbit[O〕=BIT(EV一BS)
input_set_abs一arams(&s3e244o_ts。mydev,
input_set_abs_params(&s3e244o_ts。mydev,
input_set_abs_params(&s3e244o_ts。mydev,

input_register_deviee(&s3e244o_ts.mydev);
ret=request_irq(IRQ--ADC,
  SASAMPLERANDOM,
if(ret<O){
 SA_SAMPLE_RANDOM,s3e244ots。name,&s3e2440_ts);//申请中断
printk(”  requestirqfailed.\n,,);
return一EBUSY:
ret=request_irq(IRQ_TC,irq_handle,
SA_SAMpLE_RANDOM,s3e244o_ts.name,&s3C2440_ts);//申请中断
if(ret(O){
printk(”  requestirqfailed.\n“);
return一EBUSY;
  inittimer(&s3e244ots.tm);//初始化定时器
 s3e244ots。tm。 data=&s3e244ots
 s3e244ots。tm。 funetion=timerhandle
s3e244o_ts。enable(&53e2440_ts);
 retllrnret:
模块卸载函数:
 voidts_exit(void)
{
free_irq(IRQ丛DC,&s3e244o_ts.mydev);
free_irq(IRQ_TC,&s3e244o_ts.mydev);
input_unregister_deviee(&s3e244o_ts.mydev);
destroy_toueh_sereen(&s3e244o_ts);
(3)中断处理与定时器的启动管理
由3.3.1小节对触摸屏和ADC模式的分析,可知触摸屏驱动中会生成两类中断,一
类是触点中断,一类是X/Y位置转换中断。在前一类中断发生后,如果之前处于抬起状
态,则应该启动横纵坐标的位置转换。
因为触摸屏的触摸是触发中断然后经过中断处理程序进行相应的坐标记录、坐标
转换与存储等功能,而且触摸屏的应用还涉及到划屏,和按键的按下与抬起有一定差
别,所以其中会用到定时器的应用,实时的跟踪触点位置坐标。
如图4一1,详尽的展现了本触摸屏驱动中断与定时器的处理函数流程。
图4一l中断与定时器处理流程
irqreturn_tir屯 handle(intirq, struettoueh_sereen*ts)
if(irq==IRQ_TC){
if(ioread32(ts一)adeupdn)&1){
iowrite32(ioread32(ts一>adeupdn)&一l,ts一>adCupdn);
input_event(&ts一>mydev,EV一BS,ABS_PRESSURE,1);
 timer_handle(ts);
 }elseif(ioread32(ts一)adeupdn)&(1<(1)){
iowrite32(ioread32(ts一>adcupdn)&一(1<<l),ts一)adcupdn);
input_event(&ts一>mydev,EV一BS,ABS_PRESSURE,O);
input_event(&ts一)mydev,EV_SYN,O,O);
del_timer(&ts一)tm);
ts一>wait4down(ts);
}
 }elseif(irq==IRQesADC){
intx,y:
x=ts一)get_x(ts);
y=ts一>get_y(ts);
input_event(&ts一)mydev,EV_ABS,ABS_X,x);
input_event(&ts一)。ydev,EV_ABS,ABS_Y,y);
ts一 >wait4up(ts);
}
因为涉及到对拖动轨迹支持的情况,定时器会被启用,一般设定周期为IOmS,在
每次定时器处理函数被引发时,调用位置转换函数:
    voidtimerhandle(Struettouehsereen*ts)
{
ts一>auto_pst(ts);
ts一)tm。exPires=jiffies+ts一)interval;
 add_timer(&ts一)tm);
}
到此整个触摸屏驱动的设计基本完成。
4.3.3触摸屏校正
在开始实现触摸屏功能之前,还需要解决一个问题,那就是触摸屏的校正。触摸
屏和LCD是两种不同的物理器件。对于一个分辨率为  320x240的LCD,它的宽度为
320个像素,高度为240个像素。而触摸屏处理的数据是点的物理坐标,该坐标是通过
触摸屏控制器采集得到的。要想实现触摸屏上的物理坐标与LCD上的像素点坐标一一
对应上,两者之间就需要一定的转换,即校正。而且电阻式触摸屏由于自身的原因参
数会发生变化,因此需要经常性的校正〔川。比较常见的校正方法是三点校正法,它的
原理是:设LcD上每个点PD的坐标为[XD,Y司,触摸屏上每个点PT的坐标为[XT,
YT]。要实现触摸屏上的坐标转换为LCD上的坐标,需要下列公式进行转换:
XD=AXXT+BXY丁+C

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

百度搜索更多

谷歌搜索更多

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

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


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

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