linux-3.0中的触摸屏驱动讲解

这篇博客详细讲解了Linux内核中针对S3C2440处理器的触摸屏驱动工作原理,涵盖了ADC接口、触摸屏中断处理、事件传递到输入子系统的过程。通过分析驱动结构、中断处理函数和输入子系统,展示了如何从触摸屏按下到坐标读取的完整流程,强调了驱动的分层结构和事件处理机制。
摘要由CSDN通过智能技术生成

一.ADC及触摸屏接口图

S3C2440有8路的ADC通道其中触摸屏控制器接口XP,XM,YP,YM与四路ADC通道复用四个IO引脚。从原理图看出8路ADC只有一个A/D转换器,通过一个8选1开关MUX来选通哪一路A/D通道进行转换。触摸屏控制会产生两个中断,一个触摸屏中断INT_TC,一个ADC_转换完成中断INT_ADC。ADC需要时钟才能工作,因为它需要设置采样率。

触摸屏工作流程:

1、选择模式

2、设置触摸屏接口到等待接口状态

3、如果中断发生,激活转换模式

4、获取坐标后,返回等待中断状态

(INT_TC中断用于按下或弹起触摸屏)

(INT_ADC用于坐标转换完成)

二.AD转换时间

当全局时钟频率为50MHz和预分频值为49时,总共10位转换时间如下:

AD转换器频率=50MHz/(49+10=1MHz

转换时间=1/(1MHz/5cycles)=1/200KHz=5us

三.ADC及触摸屏接口特殊寄存器

(1)控制寄存器(ADCCON)

(2)触摸屏控制寄存器(ADCTSC)

(3)开始延时寄存器(ADCDLY)

(4)转换数据寄存器0(ADCDAT0)

(5)转换数据寄存器1(ADCDATA1)

(6)触摸屏指针上下中断检测寄存器(ADCUPDN)

四.触摸屏接口模式:

(1)正常转换模式:通过设置ADCCON来初始化对ADCDATA0的读写操作。

(2)分离XY坐标转换模式:X坐标模式写X坐标转换数据到ADCDAT0,触摸屏接口产生中断源到中断控制器.Y坐标模式写Y坐标转换数据到ADCDAT1,触摸屏接口产生中断源到中断控制器

(3)自动XY坐标转换模式:触摸屏控制器连续转换触摸X坐标和Y坐标.在触摸控制器写X测量数据到ADCDAT0且写Y测量数据到ADCDAT1后,触摸屏接口产生中断源到自动转换模式下的中断控制器.

(4)等待中断模式:当光标按下产生中断信号(INT_TC)。触摸屏控制器的等待中断模式必须设定为触摸屏接口中触点的状态(XP,XM,YP,YM)

 

触摸屏可以看成是输入设备,工作原理是底层在触摸动作发送时产生一个中断,然后CPU通过外部存储器总线读取坐标,放入一个缓冲区,字符设备驱动管理该缓冲区,而驱动的read()接口让用户可以读取坐标.

  Input子系统处理输入事务,任何输入设备的驱动程序都可以通过Input输入子系统提供的接口注册到内核,利用子系统提供的功能来与用户空间交互。输入设备一般包括键盘,鼠标,触摸屏等,在内核中都是以输入设备出现的。下面分析input输入子系统的结构,以及功能实现。
一. Input子系统结构与功能实现


  1. Input子系统是分层结构的,总共分为三层: 硬件驱动层,子系统核心层,事件处理层。 
    (1)其中硬件驱动层负责操作具体的硬件设备,这层的代码是针对具体的驱动程序的,需要驱动程序的作者来编写。
    (2)子系统核心层是链接其他两个层之间的纽带与桥梁,向下提供驱动层的接口,向上提供事件处理层的接口。
    (3)事件处理层负责与用户程序打交道,将硬件驱动层传来的事件报告给用户程序。
  2. 各层之间通信的基本单位就是事件,任何一个输入设备的动作都可以抽象成一种事件,如键盘的按下,触摸屏的按下,鼠标的移动等。事件有三种属性:类型(type),编码(code),值(value),Input子系统支持的所有事件都定义在input.h中,包括所有支持的类型,所属类型支持的编码等。事件传送的方向是 硬件驱动层-->子系统核心-->事件处理层-->用户空间

3.输入子系统设备驱动层实现原理:

   在Linux中,Input设备用input_dev结构体描述,定义在input.h中。设备的驱动只需按照如下步骤就可实现了。
①、在驱动模块加载函数中设置Input设备支持input子系统的哪些事件;
②、将Input设备注册到input子系统中;
③、在Input设备发生输入操作时(如:键盘被按下/抬起、触摸屏被触摸/抬起/移动、鼠标被移动/单击/抬起时等),提交所发生的事件及对应的键值/坐标等状态。

Linux中输入设备的事件类型有(这里只列出了常用的一些,更多请看linux/input.h中):

  1. EV_SYN 0x00 同步事件
  2. EV_KEY 0x01 按键事件
  3. EV_REL 0x02 相对坐标(如:鼠标移动,报告的是相对最后一次位置的偏移)
  4. EV_ABS 0x03 绝对坐标(如:触摸屏和操作杆,报告的是绝对的坐标位置)
  5. EV_MSC 0x04 其它
  6. EV_LED 0x11 LED
  7. EV_SND 0x12 声音
  8. EV_REP 0x14 Repeat
  9. EV_FF 0x15 力反馈

 

4. 以触摸屏为例说明输入子系统的工作流程:
     注:s3c2440的触摸屏驱动所用驱动层对应的模块文件为:s3c2410_ts.c,事件处理层对应的模块文件为 evdev.c
    (1)s3c2410_ts模块初始化函数中将触摸屏注册到了输入子系统中,于此同时,注册函数在事件处理层链表中寻找事件处理器,这里找到的是evdev,并且将驱动与事件处理器挂载。并且在/dev/input中生成设备文件event0,以后我们访问这个文件就会找的我们的触摸屏驱动程序。
    (2)应用程序打开设备文件/dev/input/event0,读取设备文件,调用evdev模块中read,如果没有事件进程就会睡眠。  
    (3)当触摸屏按下,驱动层通过子系统核心将事件(就是X,Y坐标),传给事件处理层也就是evdev,evdev唤醒睡眠的进程,将事件传给进程处理。

 

触摸屏代码分析

在arch/arm/plat-s3c24xx/devs.c定义了触摸屏的资源和platform_device结构体

static struct resource s3c_ts_resource[] = {
    [0] = {
        .start 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值