 |
s3c2410触摸屏在linux下的驱动分析二 |
|
 |
|
s3c2410触摸屏在linux下的驱动分析二 |
|
副标题:s3c2410触摸屏在linux下的驱动分析二 |
| 日期:2008-3-20 22:39:11 来源:雪竹的BLOG 编辑:51Touch |
|
else if (adc_state == 1) { adc_state = 0; disable_ts_adc(); x = (ADCDAT1 & 0x3ff); tsdev.penStatus = PEN_DOWN; DPRINTK("PEN DOWN: x: d, y: d\n", x, y); wait_up_int(); tsEvent(); } 若查看A/D转换的状态变量,若为1 表示进行过Y坐标的A/D转换,将该变量设为0。然后调用宏函数disable_ts_adc 来禁止通过读操作启动A/D转换。 接着将x = (ADCDAT1 & 0x3ff); 这一步将Y坐标的ADC转换数据寄存器的D9~D0 这10为读出到变量x(这里由于是竖屏,参考原理图后知道,硬件连线有过改动,将XP,XM 和YP,YM 进行了对换,这样ADCDAT1 里读出的是XP,XM 方向电阻导通的值,也就是x轴坐标值)。 随后将变量tsdev.penStatus 的状态值改为笔按下,并调用wait_up_int 宏函数来设置触摸屏为等待中断模式【笔抬起产生中断】,具体定义如下: #define wait_up_int() { ADCTSC = UP_INT | XP_PULL_UP_EN | XP_AIN | XM_HIZ | \ YP_AIN | YM_GND | XP_PST(WAIT_INT_MODE); } 用该宏函数来设置ADC 触摸屏控制寄存器,参考S3C2410 芯片datasheet 中关于触摸屏的章节,具体设置参数如下: UP_INT = 1<<8 * 1 该位保留且应该设为0,这里设为1 不知道为什么 【笔按下或笔抬起中断信号控制位,设为1 表示笔抬起产生中断信号】 XP_PULL_UP_EN = 1<<3 * 0 上拉开关使能,设为0 表示XP 引脚上拉使能 XP_AIN = 1<<4 * 1 选择nXPON 引脚输出值,设为1 表示nXPON 引脚输出1,则XP 引脚连接AIN[7] 引脚 XM_HIZ = 1<<5 * 0 选择XMON 引脚输出值,设为0 表示XMON 引脚输出0,则XM 引脚为高阻态 YP_AIN = 1<<6 * 1 选择nYPON 引脚输出值,设为1 表示nYPON 引脚输出1,则YP 引脚连接AIN[5] 引脚 YM_GND = 1<<7 * 1 选择YMON 引脚输出值,设为1 表示YMON 引脚输出1,则YM 引脚为接地 XP_PST(WAIT_INT_MODE); = 3 X坐标Y坐标手动测量设置,设为3 表示等待中断模式 最后调用函数指针tsEvent 所指向的函数。在s3c2410_get_XY 函数里面,应该表示这个驱动的设备文件已经打开,在打开设备文件函数中,tsEvent 函数指针就指向了tsEvent_raw 这个函数,也就是说,下面执行的是tsEvent_raw 函数。tsEvent_raw 函数负责填充触摸屏缓冲区,并唤醒等待的进程,该函数会在后面说明。
------------------------------------------------------------------------ static void tsEvent_raw(void) 来看一下tsEvent_raw 这个函数。 if (tsdev.penStatus == PEN_DOWN) { BUF_HEAD.x = x; BUF_HEAD.y = y; BUF_HEAD.pressure = PEN_DOWN; 一上来就根据变量tsdev.penStatus 的状态值进行判断,若为笔按下,将从A/D转换器中采集的x轴y轴坐标以及笔按下的状态存入变量tsdev 中的buf 成员中的相应变量中。
#ifdef HOOK_FOR_DRAG ts_timer.expires = jiffies + TS_TIMER_DELAY; add_timer(&ts_timer); #endif 如果定义了笔拖曳,先将定时器的定时溢出值更新,然后调用add_timer 函数重新增加定时器计时,变量ts_timer 为struct timer_list 数据结构。 } else { #ifdef HOOK_FOR_DRAG del_timer(&ts_timer); #endif
如果定义了笔拖曳,调用del_timer 函数来删除定时器,变量ts_timer 为struct timer_list 数据结构。
BUF_HEAD.x = 0; BUF_HEAD.y = 0; BUF_HEAD.pressure = PEN_UP; } 若变量tsdev.penStatus 的状态值不是笔按下,则x轴y轴坐标写为0和笔抬起的状态一起存入变量tsdev 中的buf 成员中的相应变量中。 tsdev.head = INCBUF(tsdev.head, MAX_TS_BUF); 其中INCBUF 宏函数定义如下: #define INCBUF(x,mod) ((++(x)) & ((mod) - 1)) 由于这里MAX_TS_BUF=16,这样(mod) - 1)就为15(0x0F),所以这个宏函数相当于就是将变量tsdev.head 这个表示buf 头位置的值加1,然后取模16,即指向下一个buf ,形成一个在环形缓冲区上绕环的头指针。
|
|
|
| 对这篇文章您有更多的想法?
请去论坛发表意见吧
|
 |
“s3c2410触摸屏在linux下的驱动分析二” 的相关新闻 |
 |
|
|
|
|
|
 |
站内搜索 |
 |
|