中国触摸屏网
首页
触摸屏
一体机
触摸显示器
供求商机
产品展示
厂商资料
资讯中心
触摸软件
触摸论坛
触摸屏资讯 | 触控一体机 | 触摸屏屏幕 | 触摸屏机柜 | 触摸显示器 | 触摸控制器 | 自助终端 | 呼叫系统 | 触摸屏软件| 全国经销商
触摸屏外设 | 考勤排队机 | 触摸屏新品 | 解决之方案 | 选购与维护 | 驱动与软件 | 数字城市 | POS 系统 |LED电子大屏| 触摸屏论坛
导航: 首页 >> 选购与维护 >> 触摸屏技术 >> 正文 全国触摸屏销售热线:(点击查看)
全国触摸屏经销商 全国触摸屏经销商
·广东广州 ·广东深圳
·福建福州 ·福建厦门
·福建泉州 ·湖南长沙
·江西南昌 ·上 海 市
·江苏南京 ·江苏苏州
·北 京 市 ·山西太原
·山东济南 ·四川成都
·重 庆 市 ·云南昆明
·>>> 经销商加入指南
·>>> 经销商加入指南
s3c2410触摸屏在linux下的驱动分析二  
s3c2410触摸屏在linux下的驱动分析二
副标题:s3c2410触摸屏在linux下的驱动分析二
日期:2008-3-20 22:39:11     来源:雪竹的BLOG   编辑:51Touch 
最后用ARM 汇编指令实现了对IRQ 的使能和禁止。
spin_lock_irq(&(tsdev.lock));
    这样调用spin_lock_irq 宏函数,实际上只是做了local_irq_disable();一步,就是禁止IRQ 中断。

if (tsdev.penStatus == PEN_UP)
   s3c2410_get_XY();
    然后根据变量tsdev.penStatus 所处的状态,若为笔抬起则调用s3c2410_get_XY 函数来取得A/D转换得到的坐标值,该函数会在后面说明。
#ifdef HOOK_FOR_DRAG
else
   s3c2410_get_XY();
#endif
    这里表示如果定义了笔拖曳,且在笔没有抬起的情况下,继续调用s3c2410_get_XY 函数来得到最新的坐标值。
spin_unlock_irq(&(tsdev.lock));
    最后调用spin_unlock_irq 宏函数,相当于只做了local_irq_enable();一步,来重新使能IRQ 中断。最后退出这个中断服务子程序。


    继续来看一下另一个中断处理函数,即触摸屏触摸中断处理函数:
static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg)
    该函数的参数和上面A/D转换中断处理函数的定义一样,不再累赘。
spin_lock_irq(&(tsdev.lock));

    也同上面的意思一样,首先禁止IRQ 中断。
if (tsdev.penStatus == PEN_UP) {
   start_ts_adc();
}
    接着根据变量tsdev.penStatus 的状态值判断是否进行A/D转换。若笔抬起,则调用函数start_ts_adc 来进行A/D转换,该函数会在后面说明。
else {
   tsdev.penStatus = PEN_UP;
   DPRINTK("PEN UP: x: d, y: d\n", x, y);
   wait_down_int();
   tsEvent();
}
    如果变量tsdev.penStatus 的状态值不是笔抬起,则先将该变量状态设为笔抬起,然后调用宏函数wait_down_int()。该宏函数已在前面说明,用来设置触摸屏为等待中断模式。最后调用tsEvent 函数指针所指的函数,在模块初始化函数s3c2410_ts_init 中,tsEvent 指向的是一个空函数tsEvent_dummy,而在打开设备函数s3c2410_ts_open 中,tsEvent 会指向tsEvent_raw 函数,该函数负责填充触摸屏缓冲区,并唤醒等待的进程。该函数也会在后面加以说明。
spin_unlock_irq(&(tsdev.lock));
    中断处理函数的最后一步都一样,重新使能IRQ 中断。退出中断服务子程序。

    下面先来看启动A/D转换的函数:
static inline void start_ts_adc(void)
adc_state = 0;
mode_x_axis();
start_adc_x();
    简简单单的3步。
    第一步,对A/D转换的状态变量清零。
    第二步,调用mode_x_axis 宏函数,具体定义如下:
#define mode_x_axis() { ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ | \
    XP_PULL_UP_DIS | XP_PST(X_AXIS_MODE); }


    该宏函数用来设置ADC触摸屏控制寄存器为测量X坐标模式,参考S3C2410 芯datasheet 中关于触摸屏的章节,具体设置参数如下:
XP_EXTVLT = 1<<4 * 0  选择nXPON 引脚输出值,设为0 表示nXPON 引脚输出0,则XP 引脚为接外部电压
XM_GND = 1<<5 * 1  选择XMON 引脚输出值,设为1 表示XMON 引脚输出1,则XM 引脚为接地
YP_AIN = 1<<6 * 1  选择nYPON 引脚输出值,设为1 表示nYPON 引脚输出1,则YP 引脚连接AIN[5] 引脚
YM_HIZ = 1<<7 * 0  选择YMON 引脚输出值,设为0 表示YMON 引脚输出0,则YM 引脚为高阻态
XP_PULL_UP_DIS = 1<<3 * 1  上拉开关使能,设为1 表示XP 引脚上拉禁止
XP_PST(X_AXIS_MODE); = 1  X坐标Y坐标手动测量设置,设为1 表示X坐标测量模式
    第三步,调用start_adc_x 宏函数,具体定义如下:
#define start_adc_x() { ADCCON = PRESCALE_EN | PRSCVL(49) | \
    ADC_INPUT(ADC_IN5) | ADC_START_BY_RD_EN | \
    ADC_NORMAL_MODE; \
     ADCDAT0; }
    该宏函数用来设置ADC控制寄存器启动X坐标的A/D转换,参考S3C2410 芯片datasheet 中关于触摸屏的章节,具体设置参数如下:
PRESCALE_EN = 1<<14 * 1  A/D转换器使能,设为1 表示使能A/D转换器
PRSCVL(49) = 49<<6  A/D转换器值,设为49
ADC_INPUT(ADC_IN5) = 5<<3  选择模拟输入通道,设为5 表示AIN[5] 引脚作为模拟输入通道
ADC_START_BY_RD_EN = 1<<1 * 1  A/D转换通过读启动,设为1 表示通过读操作启动A/D转换使能
ADC_NORMAL_MODE; = 1<<2 * 0  选择待命模式,设为0 表示正常操作模式
ADCDAT0;  读取X坐标的ADC转换数据寄存器
    由于设置了A/D转换通过读启动,则该ADCCON 寄存器的最低位ENABLE_START 启动A/D转换位就无效了。在最后一步读取ADCDAT0 寄存器这一操作时就启动了A/D转换。


static inline void s3c2410_get_XY(void)
    这就是获取A/D转换所得到的坐标值的函数。
if (adc_state == 0)
{
  adc_state = 1;
  disable_ts_adc();
  y = (ADCDAT0 & 0x3ff);
  mode_y_axis();
  start_adc_y();
}
    这里首先查看A/D转换的状态变量,若为0 表示进行过X坐标的A/D转换,将该变量设为1。然后调用宏函数disable_ts_adc,该宏函数定义如下:
#define disable_ts_adc() { ADCCON &= ~(ADCCON_READ_START); }
    这个宏函数主要工作就是禁止通过读操作启动A/D转换,参考S3C2410 芯片datasheet 中关于触摸屏的章节,具体设置参数如下:
ADCCON_READ_START = 1<<1  A/D转换通过读启动,设为0 表示通过读操作启动A/D转换禁止
    然后y = (ADCDAT0 & 0x3ff); 这一步将X坐标的ADC转换数据寄存器的D9~D0 这10为读出到变量y(这里由于是竖屏,参考原理图后知道,硬件连线有过改动,将XP,XM 和YP,YM 进行了对换,这样ADCDAT0 里读出的是YP,YM 方向电阻导通的值,也就是y轴坐标值)。这个mode_y_axis 宏函数定义如下:
#define mode_y_axis() { ADCTSC = XP_AIN | XM_HIZ | YP_EXTVLT | YM_GND | \
    XP_PULL_UP_DIS | XP_PST(Y_AXIS_MODE); }
    该宏函数用来设置ADC触摸屏控制寄存器为测量Y坐标模式,参考S3C2410 芯片datasheet 中关于触摸屏的章节,具体设置参数如下:
XP_AIN = 1<<4 * 1  选择nXPON 引脚输出值,设为1 表示nXPON 引脚输出1,则XP 引脚连接AIN[7] 引脚
XM_HIZ = 1<<5 * 0  选择XMON 引脚输出值,设为0 表示XMON 引脚输出0,则XM 引脚为高阻态
YP_EXTVLT = 1<<6 * 0  选择nYPON 引脚输出值,设为0 表示nYPON 引脚输出0,则YP 引脚为接外部电压
YM_GND = 1<<7 * 1  选择YMON 引脚输出值,设为1 表示YMON 引脚输出1,则YM 引脚为接地
XP_PULL_UP_DIS = 1<<3 * 1  上拉开关使能,设为1 表示XP 引脚上拉禁止
XP_PST(Y_AXIS_MODE); = 2  X坐标Y坐标手动测量设置,设为2 表示Y坐标测量模式
    最后调用start_adc_y 宏函数,具体定义如下:
#define start_adc_y() { ADCCON = PRESCALE_EN | PRSCVL(49) | \
    ADC_INPUT(ADC_IN7) | ADC_START_BY_RD_EN | \
    ADC_NORMAL_MODE; \
     ADCDAT1; }
   该宏函数用来设置ADC控制寄存器启动Y坐标的A/D转换,参考S3C2410 芯片datasheet 中关于触摸屏的章节,具体设置参数如下:
PRESCALE_EN = 1<<14 * 1  A/D转换器使能,设为1 表示使能A/D转换器
PRSCVL(49) = 49<<6  A/D转换器值,设为49
ADC_INPUT(ADC_IN7) = 7<<3  选择模拟输入通道,设为7 表示AIN[7] 引脚作为模拟输入通道
ADC_START_BY_RD_EN = 1<<1 * 1  A/D转换通过读启动,设为1 表示通过读操作启动A/D转换使能
ADC_NORMAL_MODE; = 1<<2 * 0  选择待命模式,设为0 表示正常操作模式
ADCDAT1;  读取Y坐标的ADC转换数据寄存器

本新闻共4页,当前在第2页  1  2  3  4  

对这篇文章您有更多的想法? 请去论坛发表意见吧   
“s3c2410触摸屏在linux下的驱动分析二” 的相关新闻
Linux系统下触摸屏的简单使用和配置方法 s3c2410触摸屏在linux下的驱动分析 三 
s3c2410触摸屏在linux下的驱动分析一助力触摸屏 奇趣引领移动Linux
天绘电子白板在LINUX系统下的应用为标准触摸屏接口硬件编写驱动程序
触摸屏及相关厂家
广东洪毅触摸设备
台湾嵩达光电科技
广东深越光电技术
台湾理义科技股份
北京联控兴业科技
台湾宇宙光电股份
3M中国触控系统部
南京华睿川电子科技
>> 触摸屏相关厂商加入
站内搜索 站内搜索
软件开发 软件开发
Toucher2.2在线演示
时代广场软件首页
荣威触摸屏查询软件首页
眉山经济贸易委员会软件首页
推荐新闻 推荐新闻
友达、华映将推新品,电
触摸屏浏览器Toucher V4
触控屏技术能否开启手机
专门为零售商开发的触摸
触摸屏浏览器Toucher触摸
在便携设备中应用电容式
KTV市场触摸屏 又掀娱乐
加入收藏网站地图友情链接联系我们  |  广告联系全国销售网络
    网站广告、经销商加盟、触摸屏软件销售:028-87439508 13183843395 028-66219290 联系人:张小姐 传真:028-87439508 全国各地经销商如下:
   广 州   020-87599875 深 圳   0755-21949677 福 州   0591-87818596 厦 门   0592-5615268 泉 州   0595-88150378
   湖 南   15863470449 江 西   0791-6283683 上 海   13916222245 南 京   025-83610010 苏 州   0512-65581867
   北 京   010-62631382 山 西   0351-8390152 济 南   13396407999 四 川   028-81934978 重 庆   023-68609756
   云 南   0871-5109466 其 他… 028-87439508   >>> 经销商加入指南    
电子邮件: 51touch(A)126.com 请将地址中的"(A)"改成"@",避免垃圾邮件出此下策,望谅
版权所有 Copyright© 2003-2008 中国触摸屏网 地址:成都市晋吉南路146号 电话:028-87439508  13183843395  028-66219290

在线咨询QQ: 

触摸屏、触摸屏软件、触控一体机咨询 43361182 触摸屏、触摸屏软件、触控一体机咨询 893008608 MSN 帐号:touch8(A)gmail.com 将"(A)"改成"@"即可