1、第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 10.1 S3C2440 A/D接口驱动分析接口驱动分析10.2 触摸屏设备驱动触摸屏设备驱动 第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 10.1.1 S3C2440 A/D接口接口A/D转换器是模拟信号源和CPU之间联系的接口,它的任务是将连续变化的模拟信号转换为数字信号,以便计算机和数字系统进行处理、存储、控制和显示。在工业控制和数据采集等领域中,A/D转换是不可缺少的。10.1 S3C2440 A/D接口驱动分析接口驱动分析 第第1
2、0章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 1.常用常用A/D转换器类型转换器类型A/D转换器有以下类型:逐位比较型、积分型、计数型、并行比较型、电压-频率型,应根据使用场合的具体要求,按照转换速度、精度、价格、功能以及接口条件等因素来决定选择何种类型。常用的A/D转换器有以下两种。1)双积分型的A/D转换器2)逐次逼近型A/D转换器逐次逼近型(也称逐位比较型)A/D转换器比积分型的应用更为广泛,其原理框图如图10-2所示,主要由逐次逼近寄存器SAR、D/A转换器、比较器以及时序和控制逻辑等部分组成。第第10章章 S3C2440 A/D接口和触
3、摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 图10-1 双积分型A/D转换器第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 图10-2 逐次逼近型A/D转换器(a)原理图;(b)过程图第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 2.A/D转换的几个重要指标转换的几个重要指标1)分辨率分辨率分辨率反映A/D转换器对输入微小变化响应的能力,通常用数字输出最低位(LSB)所对应的模拟输入的电平值表示。2)精度精度精度有绝对精度(Absolute Accuracy)和相对精度(Rel
4、ative Accuracy)两种表示方法。第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 3)转换时间转换时间转换时间是指完成一次A/D转换所需的时间,即由发出启动转换命令信号到转换结束信号开始有效的时间间隔。4)电源灵敏度电源灵敏度电源灵敏度是指A/D转换芯片的供电电源的电压发生变化时产生的转换误差。5)量程量程量程是指所能转换的模拟输入电压范围,分单极性、双极性两种类型。第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 6)输出逻辑电平输出逻辑电平多数A/D转换器的输出逻辑电平与TTL电
5、平兼容。7)工作温度范围工作温度范围由于温度会对比较器、运算放大器、电阻网络等产生影响,故只在一定的温度范围内才能保证额定精度指标。第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 3.ARM S3C2440自带的自带的10位位A/D转换器转换器ARM S3C2440芯片自带一个路10位A/D转换器,并且支持触摸屏功能。ARM2410开发板A/D转换器最大转换率为500 kHz,非线性度为正负1.5位,其转换时间可以通过下式计算:如果系统时钟为50MHz,比例值为49,则A/D转换器频率=50 MHz/(49+1)=1 MHz转换时间=es M
6、Hz/5cycl11kHz2001(相当于5s)第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 10.1.2 S3C2440 A/D寄存器介绍寄存器介绍1.ADC(模数转换器模数转换器)控制寄存器控制寄存器ADC控制寄存器的各位定义如表10-1和表10-2所示。第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 表表10-1 ADC控制寄存器控制寄存器 寄存器 地址 读/写 描 述 默认值 ADCCON 0 x58000000 R ADC 控制寄存器 0 x3FC4 第第10章章 S3C2440
7、 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 表表10-2 ADC控制寄存器位定义控制寄存器位定义NFECC 位 描 述 初始状态 ECFLG 16 结束转换标志 0=A/D 在转换中,1=A/D 转换结束 0 PRSECEN 14 0 PRSCVL 13:6 0Xff SEL_MUX 5:3 模拟信号输入选择 000=AIN0,001=AIN1,010=AIN2,011=AIN3,100=AIN4,101=AIN5,110=AIN6,111=AIN7 0 STDBM 2 模式选择 0=普通,1=标准模式 1 READ_START 1 0 ENABLE_START 0
8、 0 第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 2.ADC触摸屏控制寄存器触摸屏控制寄存器ADC触摸屏控制寄存器的各位定义如表10-3和表10-4所示。3.ADC延时寄存器延时寄存器ADC延时寄存器的各位定义如表10-5和表10-6所示。第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 表表10-3 ADC触摸屏控制寄存器触摸屏控制寄存器 寄存器 地址 读/写 描 述 默认值 ADCTSC 0 x58000004 R/W ADC 控制寄存器 0 x058 第第10章章 S3C2440 A
9、/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 表表10-4 ADC触摸屏控制寄存器位定义触摸屏控制寄存器位定义ADCTSC 位 描 述 初始状态 保留 8 这个位一直是 0 0 YM_SEN 7 选择输出 YMON 值 0=YMON 输出 0(YM=Hi-Z)1=YMON 输出 1(YM=GND)0 YP_SEN 6 选择输出 nYPON 值 0=YMON 输出 0(YP=Hi-Z)1=YMON 输出 1(YP=GND)1 XM_SEN 5 选择输出 nXMON 值 0=nXMON 输出 0(XM=Hi-Z)1=nXMON 输出 1(XM=GND)0 XP_SEN 4 选
10、择输出 nXPON 值 0=nXPON 输出 0(XP=Hi-Z)1=nXPON 输出 1(XP=GND)1 PULL_UP 3 下拉交换使能 0=禁止,1=使能 1 AUTO_PST 2 自动转换 X 和 Y 位置 0=Normal ADC Conversion 0 XY_PST 1:0 00=没有操作模式 01=X 第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 表表10-5 ADC延时寄存器延时寄存器寄存器 地 址 读/写 描 述 默认值 ADCDLY 0 x58000008 R/W ADC 控制寄存器 0 x00FF 第第10章章 S
11、3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 表表10-6 ADC延时寄存器位定义延时寄存器位定义ADCTSC 位 描 述 初始状态 DELAY 15:0 该位一直是 0 0 第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 4.ADC转换数据寄存器转换数据寄存器0ADC转换数据寄存器0的各位定义如表10-7和表10-8所示。第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 表表10-7 ADC转换数据寄存器转换数据寄存器0寄存器 地 址 读/写 描 述 默
12、认值 ADCDATA0 0 x5800000C R/W ADC 转换数据寄存器 第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 表表10-8 ADC转换数据寄存器转换数据寄存器0位定义位定义ADCDATA0 位 描 述 初始状态 UPDOWN 15 AUTO_PST 14 XY_PST 13:12 保留 11:10 保留 XPDATA 9:0 X 位置数据(一般模式下 ADC 数据值)数据值:03FF 第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 5.ADC转换数据寄存器转换数据寄存器1A
13、DC转换数据寄存器1的各位定义如表10-9和表10-10所示。第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 表表10-9 ADC转换数据寄存器转换数据寄存器1寄存器 地 址 读/写 描 述 默认值 ADCDATA1 0 x58000010 R/W ADC 转换数据寄存器 第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 表表10-10 ADC转换数据寄存器转换数据寄存器1位定义位定义ADCDATA1 位 描 述 初始状态 UPDOWN 15 AUTO_PST 14 XY_PST 13:12
14、保留 11:10 保留 YPDATA 9:0 Y 位置数据(一般模式下 ADC 数据值)数据值:03FF 第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 10.1.3 S3C2440 A/D驱动程序分析驱动程序分析1寄存器地址和功能定义寄存器地址和功能定义S3C2440 ADC控制器相关寄存器地址及初始值定义如下:#define S3C2440_ADCREG(x)(x)#define S3C2440_ADCCONS3C2440_ADCREG(0 x00)#define S3C2440_ADCTSC S3C2440_ADCREG(0 x04)#
15、define S3C2440_ADCDLY S3C2440_ADCREG(0 x08)#define S3C2440_ADCDAT0 S3C2440_ADCREG(0 x0C)#define S3C2440_ADCDAT1 S3C2440_ADCREG(0 x10)第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例#define ADC_IN0 0#define ADC_IN1 1#define ADC_IN2 2#define ADC_IN3 3#define ADC_IN4 4#define ADC_IN5 5#define ADC_IN6
16、6#define ADC_IN7 7第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例#define ADC_BUSY1#define ADC_READY0#define NOP_MODE0#define X_AXIS_MODE1#define Y_AXIS_MODE2#define WAIT_INT_MODE3第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例/*.*/#define ADCCON_ECFLG(1 15)#define PRESCALE_ENDIS(1 14)#define PRE
17、SCALE_DIS(PRESCALE_ENDIS*0)#define PRESCALE_EN(PRESCALE_ENDIS*1)#define PRSCVL(x)(x 6)#define ADC_INPUT(x)(x 3)第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例#define ADCCON_STDBM(1 2)/*1:standby mode,0:normal mode*/#define ADC_NORMAL_MODE(ADCCON_STDBM*0)#define ADC_STANDBY_MODE(ADCCON_STDBM*1)#def
18、ine ADCCON_READ_START(1 1)#define ADC_START_BY_RD_DIS(ADCCON_READ_START*0)#define ADC_START_BY_RD_EN(ADCCON_READ_START*1)#define ADC_START(1 0)第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例#define UD_SEN(1 8)#define DOWN_INT(UD_SEN*0)#define UP_INT(UD_SEN*1)#define YM_SEN(1 7)#define YM_HIZ(YM_SE
19、N*0)#define YM_GND(YM_SEN*1)#define YP_SEN(1 6)#define YP_EXTVLT(YP_SEN*0)#define YP_AIN(YP_SEN*1)第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例#define XM_SEN(1 5)#define XM_HIZ(XM_SEN*0)#define XM_GND(XM_SEN*1)#define XP_SEN(1 4)#define XP_EXTVLT(XP_SEN*0)#define XP_AIN(XP_SEN*1)#define XP_PULL_
20、UP(1 3)第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例#define XP_PULL_UP_EN(XP_PULL_UP*0)#define XP_PULL_UP_DIS(XP_PULL_UP*1)#define AUTO_PST(1 2)#define CONVERT_MAN(AUTO_PST*0)#define CONVERT_AUTO(AUTO_PST*1)#define XP_PST(x)(x 0)第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 2主要数据结构和变量描述主要数据结
21、构和变量描述ADC字符设备结构体ADC_DEV的代码描述如下:typedef struct struct semaphore lock;wait_queue_head_t wait;int channel;int prescale;第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 ADC_DEVfile_operations结构体变量s3c2440_adc_fopsstatic struct file_operations s3c2440_adc_fops=.owner=THIS_MODULE,.read=s3c2440_adc_read,.w
22、rite=s3c2440_adc_write,.open=s3c2440_adc_open,.release=s3c2440_adc_release,.ioctl=s3c2440_adc_ioctl,;第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 3主要函数描述A/D驱动函数结构图如图10-3所示。第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 图10-3 A/D驱动函数结构图第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 1)A/D模块
23、加载初始化函数模块加载初始化函数s3c2440_adc_init()s3c2440_adc_init()函数主要完成A/D字符设备的注册和设备节点的创建,代码描述如下:static int_init s3c2440_adc_init(void)int err=0;if(register_chrdev(ADC_MAJOR,DEVICE_NAME,&s3c2440_adc_fops)第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 printk(DEVICE_NAME“driver:Unable to register drivern”);retu
24、rn-ENODEV;err=devfs_mk_cdev(MKDEV(ADC_MAJOR,0),S_IFCHR|S_IRUGO|S_IWUSR,DEVICE_NAME);if(err)return err;第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 2)A/D模块卸载函数模块卸载函数s3c2440_adc_exit()s3c2440_adc_exit()函数主要完成A/D字符设备的卸载和设备节点的移除,代码描述如下:static void_exit s3c2440_adc_exit(void)unregister_chrdev(ADC_MA
25、JOR,DEVICE_NAME);devfs_remove(DEVICE_NAME);printk(DEVICE_NAME driver removedn);第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 3)系统调用打开函数系统调用打开函数s3c2440_adc_open()s3c2440_adc_open()函数对应于系统调用的open函数,代码描述如下:static int s3c2440_adc_open(struct inode*inode,struct file*filp)printk(“Added by weiang,enter
26、 s3c2410_adc_open functionn”);init_MUTEX(&adcdev.lock);init_waitqueue_head(&(adcdev.wait);第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 adcdev.channel=0;adcdev.prescale=0 xff;printk(“adc openedn”);return 0;第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 4)系统调用读函数系统调用读函数s3c2440_adc_read()s3c244
27、0_adc_read()函数对应于系统调用的read函数,代码描述如下:static ssize_t s3c2440_adc_read(struct file*filp,char*buffer,size_t count,loff_t*ppos)unsigned int ret=0;if(down_interruptible(&adcdev.lock)return-ERESTARTSYS;printk(“Before START_ADC_AIN:n”);START_ADC_AIN(adcdev.channel,adcdev.prescale);第第10章章 S3C2440 A/D接口和触摸屏接口
28、和触摸屏Linux驱动及应用实例驱动及应用实例 while(ADCCON&0 x1);while(!(ADCCON&0 x8000);/check if EC(End of ret=readl(ADCDAT0);printk(“the value of ret is 0 x%xn”,ret);ret&=0 x3ff;copy_to_user(buffer,(char*)&ret,sizeof(ret);up(&adcdev.lock);return sizeof(ret);第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 5)系统调用读函数系统
29、调用读函数s3c2440_adc_write()s3c2440_adc_write()函数对应于系统调用的write函数,代码描述如下:static ssize_t s3c2440_adc_write(struct file*file,const char*buffer,size_t count,loff_t*ppos)int data;printk(Added by zxh,enter s3c2410_adc_writer functionn);if(count!=sizeof(data)/error input data size 第第10章章 S3C2440 A/D接口和触摸屏接口和触摸
30、屏Linux驱动及应用实例驱动及应用实例 printk(“the size of input data must be%dn”,sizeof(data);return 0;printk(before copy_from_user function:n);copy_from_user(&data,buffer,count);第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 adcdev.channel=ADC_WRITE_GETCH(data);adcdev.prescale=ADC_WRITE_GETPRE(data);printk(“set
31、adc channel=%d,prescale=0 x%xn”,adcdev.channel,adcdev.prescale);return count;第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 6)系统调用系统调用IOCTL函数函数s3c2440_adc_ioctl()s3c2440_adc_ioctl()函数对应于系统调用的ioctl函数,代码描述如下:static int s3c2440_adc_ioctl(struct inode*inode,struct file*file,unsigned int cmd,unsigned
32、long arg)if(cmd 7)printk(“out range of adc!n”);return-EINVAL;第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 if(cmd=5)|(cmd=7)printk(“touch green use this channel!n”);return-EINVAL;adcdev.channel=cmd;return 0;第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 10.1.4 S3C2440 A/D应用设计例程应用设计例程参考程序源代码:#
33、include#include#include#include#include#include 第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例#define ADC_DEV“/dev/s3c2410_adc”#define ADC_WRITE(ch,prescale)(ch)16)&0 x7)/得到通道号#define ADC_WRITE_GETPRE(data)(data)&0 xff)/得到转换的比例因子/*static int get(int channel)第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应
34、用实例驱动及应用实例 int PRESCALE=0 xFF;int data=ADC_WRITE(channel,PRESCALE);write(adc_fd,&data,sizeof(data);read(adc_fd,&data,sizeof(data);return data;*/int main(void)第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 int i;int fd;/float d;unsigned long tmp;void*retval;fd=open(ADC_DEV,O_RDWR);if(fd 0)printf(“
35、Error opening%s adc devicen”,ADC_DEV);return-1;第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 else printf(“device id is%dn”,fd);sleep(1);while(1)printf(“Before read:n”);ioctl(fd,4,NULL);read(fd,&tmp,sizeof(unsigned long);printf(The 4 adc is 0 x%xn,tmp);第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动
36、及应用实例 sleep(1);/tmp=671;/write(fd,&tmp,4);/printf(write 67 to the file of description fd:n);ioctl(fd,0,NULL);read(fd,&tmp,sizeof(unsigned long);printf(The 4 adc is 0 x%xn,tmp);getchar();第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 /*for(i=0;i=7;i+)d=(float)get(i)*3.3)/1024.0;printf(“a%d=%8.4fn”
37、,i,d);*/close(fd);return 0;第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 10.2.1 触摸屏的硬件原理触摸屏的硬件原理按照触摸屏的工作原理和传输信息的介质不同,触摸屏可以分为4种:电阻式、电容感应式、红外线式以及表面声波式。10.2 触摸屏设备驱动触摸屏设备驱动 第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 电阻式触摸屏利用压力感应进行控制,包含上下叠合的两个透明层,通常还要用一种弹性材料来将两层隔开。在触摸某点时,两层会在此点接通。四线和八线触摸屏由两层具有
38、相同表面电阻的透明阻性材料组成,五线和七线触摸屏由一个阻性层和一个导电层组成。所有的电阻式触摸屏都采用分压器原理来产生代表X坐标和Y坐标的电压。如图10-4所示,分压器是通过将两个电阻进行串联来实现的。第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 图10-4 电阻触摸屏分压器第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 四线触摸屏包含两个阻性层。其中一层在屏幕的左右边缘各有一条垂直总线,另一层在屏幕的底部和顶部各有一条水平总线,如图10-5所示。为了能在X轴方向进行测量,将左侧总线偏置为
39、0V,右侧总线偏置为UREF;将顶部或底部总线连接到ADC,当顶层和底层相接触时即可做一次测量。为了能在Y轴方向进行测量,将顶部总线偏置为UREF,底部总线偏置为0V;将ADC输入端接左侧总线或右侧总线,当顶层与底层相接触时即可对电压进行测量。第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 图10-5 四线电阻式触摸屏第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 S3C2440接四线电阻式触摸屏的电路原理图如图10-6所示。S3C2440提供了nYMON、YMON、nXPON和XMON直接
40、作为触摸屏的控制信号,它通过连接FDC5321场效应管触摸屏驱动器控制触摸屏。输入信号在经过阻容式低通滤器滤除坐标信号噪声后被接入S3C2440内集成的ADC的模拟信号输入通道AIN5、AIN7。第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 图10-6 S3C2440连接四线电阻式触摸屏的电路原理图第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 S3C2440的ADC和触摸屏接口可工作于5种模式。1)普通转换模式(Normal Conversion Mode)2)独立X/Y位置转换模式(S
41、eparate X/Y Position Conversion Mode)3)自动(连续)X/Y位置转换模式(Auto X/Y Position Conversion Mode)4)等待中断模式(Wait for Interrupt Mode)5)待机模式(Standby Mode)第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 10.2.2 触摸屏设备驱动分析触摸屏设备驱动分析触摸屏驱动结构如图10-7所示。第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 图10-7 触摸屏驱动函数结构图第
42、第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 1主要数据结构和变量描述主要数据结构和变量描述1)触摸屏设备结构体触摸屏设备结构体TS_DEV触摸屏设备结构体TS_DEV包含一个缓冲区,同时包括自旋锁、等待队列和fasync_struct指针,代码描述如下:typedef struct第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 unsigned int penStatus;/*PEN_UP,PEN_DOWN,PEN_SAMPLE*/TS_RET bufMAX_TS_BUF;/*缓冲区*/u
43、nsigned int head,tail;/*缓冲区头和尾*/wait_queue_head_t wq;/*等待队列*/spinlock_t lock;#ifdef USE_ASYNC struct fasync_struct*aq;#endif struct cdev cdev;TS_DEV;第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 2)TS_RET结构体结构体TS_RET结构体包含X、Y轴坐标和状态(PEN_DOWN、PEN_UP)等信息,这个信息会在用户读取触摸信息时复制到用户空间,代码描述如下:typedef struct 第
44、第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 unsigned short pressure;/PEN_DOWN、PEN_UP unsigned short x;/x坐标 unsigned short y;/y坐标 unsigned short pad;TS_RET;第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 3)触摸屏驱动文件操作结构体变量触摸屏驱动文件操作结构体变量s3c2410_fops在触摸屏设备驱动中,将实现open()、release()、read()、fasync()和po
45、ll()函数,代码描述如下:static struct file_operations s3c2410_fops=owner:THIS_MODULE,open:s3c2410_ts_open,/打开 read:s3c2410_ts_read,/读坐标 release:s3c2410_ts_release,第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例#ifdef USE_ASYNC fasync:s3c2410_ts_fasync,/fasync()函数#endif poll:s3c2410_ts_poll,/轮询;第第10章章 S3C244
46、0 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 2主要函数描述主要函数描述1)触摸屏驱动模块加载函数触摸屏驱动模块加载函数s3c24x0ts_init()触摸屏加载函数可以注册一个s3c2410ts_driver()类型的字符型输入设备,代码描述如下:int_init s3c24x0ts_init(void)return driver_register(&s3c24x0ts_driver);第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 2)触摸屏卸载函数触摸屏卸载函数s3c2410ts_exit()触摸屏卸载函数主
47、要完成驱动卸载,代码描述如下:void_exit s3c2410ts_exit(void)driver_unregister(&s3c2410ts_driver);第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 3)触摸屏探测函数触摸屏探测函数s3c2410ts_probe()触摸屏探测函数主要完成申请设备号、添加cdev、申请中断、设置触摸屏相关寄存器等功能,代码描述如下:static int_init s3c2410ts_probe(struct device*dev);/*注册字符设备*/ret=register_chrdev(0,DE
48、VICE_NAME,&s3c2410_fops);if(ret f_flags&O_NONBLOCK)第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 return-EAGAIN;interruptible_sleep_on(&(tsdev.wq);if(signal_pending(current)return-ERESTARTSYS;goto retry;return sizeof(TS_RET);第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 12)触摸屏设备驱动的轮询函数触摸屏设备驱动
49、的轮询函数s3c2410_ts_poll()在触摸屏设备驱动中,通过s3c2410_ts_poll()函数实现了轮询接口,这个函数的实现非常简单。它将等待队列添加到poll_table中,当缓冲区有数据时,返回资源可读取标志,否则返回0,代码描述如下:static unsigned int s3c2410_ts_poll(struct file*filp,struct poll_table_struct*wait)poll_wait(filp,&(tsdev.wq),wait);/添加等待队列到poll_table return(tsdev.head=tsdev.tail)?0:(POLLIN|POLLRDNORM);第第10章章 S3C2440 A/D接口和触摸屏接口和触摸屏Linux驱动及应用实例驱动及应用实例 13)触摸屏设备驱动的异步通知函数触摸屏设备驱动的异步通知函数s3c2410_tx_fasync()该函数实现触摸屏设备驱动对应用程序的异步通知,代码描述如下:#ifdef USE_ASYNCstatic int s3c2410_ts_fasync(int fd,struct file*filp,int mode)return fasync_helper(fd,filp,mode,&(tsdev.aq);#endif
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。