第7章 触摸屏驱动移植 Linux系统移植(第2版) 教学课件

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

7.4.3 输入链路的创建过程
输入链路的创建过程主要包括硬件设备注 册和input handler两部分。
updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_
ADCDAT0_UPDOWN));
/* TODO we should never get an interrupt with updown set while * the timer is running, but maybe we ought to verify that the * timer isn't running anyways. */ if (updown)
7.1.1 触摸屏工作原理
触摸屏简单地说就是一种特殊的输入设备。 为了操作方便,人们用触摸屏取代鼠标或 者键盘。触摸屏由触摸检测部件和触摸屏 控制器组成;触摸检测部件安装在显示器 屏幕前面,用来检测用户触摸的位置,接 受后送触摸屏控制器;而触摸屏控制器的 主要作用是从触摸点检测装置上接收触摸 信息,并将它转换成为触点坐标,再送给 CPU处理,它同时能接收CPU发来的命令 并加以执行。
断函数stylus_updown里被调用,此时缓存区没 有数据,ts.count的值为0,所以只是简单地设置 A/D转换的模式,然后开启A/D转换。 当ADC中断函数stylus_action()把缓冲区填满时, 作为中断后半段函数稍后被调用,此时ts.count 等于shift,算出其平均值后,交给事件处理层 (Event Handler)处理,主要是填写缓冲然后 唤醒等待输入数据的进程。 stylus抬起,等到缓冲区填满后(可能会包含一 些无用的数据)被调用,这时判断出stylus up, 报告stylus up事件,重新等待stylus down。
2.ID和name字段
在注册输入设备前,驱动程序应该设置 dev->name。ID字段包含了总线ID(PCI、 USB,...),供应商ID和设备的设备ID。 总线ID在input.h文件中定义。供应商和设 备ID在pci_ids.h、usb_ids.h和相似的头文 件中被定义。这些字段应该在注册输入设 备前被驱动程序设置。ID和name字段可 以通过evdev接口传递给用户空间使用。
4.evbit、keybit、relbit、absbit 字段
这几个字段是用于设置输入设备的事件类 型,EV_KEY是最简单的事件类型,用作 按键的事件类型。这个事件通过下面函数 报告给输入系统:
input_report_key(struct input_dev *dev, int code, int value)
//用于保存ADCDAT1的值
int updown;
//用于保存触笔动作
data0 = readl(base_addr+S3C2410_ADCDAT0);
//读ADCDAT0的值
data1 = readl(base_addr+S3C2410_ADCDAT1);
//读ADCDAT1的值
/这*再里次有判廷断时触去笔抖是动否的真作的用按*/下,本来进入这个中断服务程序就说明触笔是已经按下了,
//关闭时钟
//clk_unuse(adc_clock);
clk_put(adc_clock);
adc_clock = NULL;
}
input_unregister_device(&ts.dev);
//注销输入设备
iounmap(base_addr);
return 0;
}
7.4 Linux内核输入子系统介绍
3.stylus_updown分析
static irqreturn_t stylus_updown(int irq, void *dev_id, struct pt_regs *regs) {
unsigned long data0;
//用于保存ADCDAT0的值
unsigned long data1;
4.表面声波触摸屏
表面声波是一种沿着介质表面传播的机械 波。这种触摸屏由触摸屏、声波发生器、 反射器和声波接收器组成,其中,声波发 生器能发送一种高频声波跨越屏幕的表面, 当手指触到屏幕时,触点上的声波就被阻 止,由此确定触点坐标的位置。
7.2 S3C2440 ADC接口使用
7.2.1 S3C2440触摸屏接口概述 7.2.2 S3C2440触摸屏接口操作
7.4.1 Input子系统概述 7.4.2 输入设备结构体 7.4.3 输入链路的创建过程 7.4.4 使用Input子系统 7.4.5 编写输入设备驱动需要完成的工作
7.4.1 Input子系统概述
Linux 系统提供了Input子系统,输入子系统 由输入子系统核心层(input core)、驱动层 和事件处理层(event handler)3部分组成。 输入事件(如鼠标移动、键盘按键按下、 joystick的移动等)通过driver ->inputcore -> eventhandler -> userspace 的顺序到达用户空 间传给应用程序。按键、触摸屏、键盘、鼠 标等输入都可以利用Input接口函数来实现设 备驱动。在Linux内核中,Input设备用 input_dev 结构体描述。
第7章 触摸屏驱动移植
7.1 触摸屏概述 7.2 S3C2440 ADC接口使用 7.3 2.6内核触摸屏驱动源码分析
(s3c2410_ts.c源码分析) 7.4 Linux内核输入子系统介绍 7.5 触摸屏驱动移植和内核编译
7.1 触摸屏概述
7.1.1 触摸屏工作原理 7.1.2 触摸屏的主要类型
7.2.1 S3C2440触摸屏接口概述
S3C2440具有8通道模拟输入的10位 CMOS模数转换器(ADC),它将输入的 模拟信号转换为10位的二进制数字码。在 2.5MHz的A/D转换器时钟下,最大转化 速率可以达到500KSPS。A/D器支持片上 采样和保持功能,并支持掉电模式。
7.2.2 S3C2440触摸屏接口操作
writel(readl(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_ START, base_addr+S3C2410_ADCCON); //开始A/D转换
} else {
mod_timer(&touch_timer, jiffies+1);
//读Y坐标的值 //X坐标的值累加 //Y坐标的值累加
ts.count++;
//计数器递增
if (ts.count < (1<<ts.shift)) {
//判断是否完成采样次数
writel(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C24 10_ADCTSC); //设置为自动模式
1.s3c2410ts_probe分析
s3c2410ts_probe是一个探测函数,在这个 函数中完成了硬件资源获取、GPIO口的 初始化、中断申请和注册驱动程序等操作。
2.touch_timer_fire分析
touch_timer_fire()函数主要实现以下功能: stylus down的时候,touch_timer_fire()函数在中
7.3 2.6内核触摸屏驱动源码分析 (s3c2410_ts.c源码分析)
Linux 2.6.33的内核源码中已经包含了触 摸屏的相驱动了,对应的源代码在 drivers/input/touchscreen/s3c2410_ts.c中。
1.s3c2410ts_probe分析 2.touch_timer_fire分析 3.stylus_updown分析 4.stylus_action分析 5.3c2410ts_remove分析
touch_timer_fire(0); /*判断出stylus down,调用touch_timer_fire函数,从而进入中断的底半部*/ return IRQ_HANDLED;
}
4.stylus_action分析
static irqreturn_t stylus_action(int irq, void *dev_id, struct pt_regs *regs)
7.4.2 输入设备结构体
要了解输入设备子系统,就得先了解内核 中输入设备的定义,这里先给出内核中 input_dev的定义,然后再对其中重要的成 员进行描述。
1.private字段
在Input结构中,这个字段可以被用来指 向在输入设备驱动程序中的任何私有数据 结构,例如在驱动处理多个设备时。在 open()和close()函数中,需要此字段。
1.S3C2440触摸屏控制器工作模式 2.S3C2440触摸屏接口专用寄存器
1.S3C2440触摸屏控制器工作 模式
S3C2440的触摸屏控制器是和A/D转换控制 器结合在一起的,触笔的位置通过模拟信号 传递给A/D转换器,A/D转换完成后,把结 果保存在相应的寄存器。根据转换方式的不 同,触摸屏控制器有以下4种工作模式。
{
unsigned long data0;
//用于保存X坐标的值
unsigned long data1;
//用于保存Y坐标的值
data0 = readl(base_addr+S3C2410_ADCDAT0);
//读X坐标的值
data1 = readl(base_addr+S3C2410_ADCDAT1); ts.xp += data0 & S3C2410_ADCDAT0_XPDATA_MASK; ts.yp += data1 & S3C2410_ADCDAT1_YPDATA_MASK;
(1)等待中断模式 (2)分离x/y轴坐标模式 (3)自动x/y轴坐标转换模式 (4)普通转换模式
2.S3C2440触摸屏接口专用寄 存器
S3C2440触摸屏接口涉及的专用寄存器比 较少,主要有ADCCON、ADCTSC、 ADCDAT0和ADCDAT1。下面分别对它 们进行介绍。
(1)ADCCON控制寄存器。 (2)ADC触摸屏控制寄存器ADCTSC。 (3)ADCDAT0和ADCDAT1寄存器 (4)ADC起始廷迟寄存器(ADCDLY)
{
disable_irq(IRQ_ADC);
//禁止A/D中断
disable_irq(IRQ_TC);
//禁止触摸屏中断
free_irq(IRQ_TC,&ts.dev);
//释放触摸屏中断号
free_irq(IRQ_ADC,&ts.dev);
//释放A/D中断号
if (adc_clock) {
clk_disable(adc_clock);
3.keycode、keycodemax、 keycodesize字段
这3个字段可以用于所有输入设备,被用 来报告将产生的数据作为扫描码。如果不 是所有的扫描码可以被自动识别所辨别, 它们可能需要通过用户空间应用程序设置。 这样keycode数组被用来映射扫描码到输 入系统的键码。keycodemax包含了数组 的大小。keycodesize表示数组中数据的大 小(单位为bytes)。
2.电容式触摸屏
电容式触摸屏的构造主要是在玻璃屏幕上 镀一层透明的薄膜层,再在导体层外加上 了一块保护玻璃,双玻璃设计能够很好地 保护导体层及感应器。
3.红外线式触摸屏
这种触摸屏由装在触摸屏外框上的红外线 发射与接收感测元件构成,在屏幕表面上 形成红外线探测网,任何触摸物体都可以 改变触点上的红外线而实现触摸操作。红 外触摸屏不受电流、电压和静电干扰,适 宜某些恶劣的环境条件。
//采样完成,调用touch_timer_fire报告坐标值
writel(WAIT4INT(1), base_addr+S3C2410_ADCTSC);
}
return IRQ_HANDLED;Leabharlann Baidu
}
5.3c2410ts_remove分析
static int s3c2410ts_remove(struct device *dev)
相关文档
最新文档