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

上传人:可**** 文档编号:87345550 上传时间:2023-04-16 格式:PPT 页数:51 大小:1.44MB
返回 下载 相关 举报
第7章--触摸屏驱动移植-Linux系统移植(第2版)-教学课件.ppt_第1页
第1页 / 共51页
第7章--触摸屏驱动移植-Linux系统移植(第2版)-教学课件.ppt_第2页
第2页 / 共51页
点击查看更多>>
资源描述

《第7章--触摸屏驱动移植-Linux系统移植(第2版)-教学课件.ppt》由会员分享,可在线阅读,更多相关《第7章--触摸屏驱动移植-Linux系统移植(第2版)-教学课件.ppt(51页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第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.1.1 触摸屏工作原理触摸屏简单地说就是一种特殊的输入设备。为了操作方便,人们用触摸屏取代鼠标或者键盘。触摸屏由触摸检测部件和触摸屏控制器组成;触摸检测部件安装在显示器屏幕前面,用来检测用户触摸的位置,接受后送触摸屏控制器;而触摸屏控制器的主要作用是从触摸点检测装置上接收触摸信息,并将它转换成为触点坐标,

2、再送给CPU处理,它同时能接收CPU发来的命令并加以执行。7.1.2 触摸屏的主要类型按技术原理来区别触摸屏,可分为以下5个基本种类:矢量压力传感式触摸屏;电阻式触摸屏;电容式触摸屏;红外线式触摸屏;表面声波式触摸屏。2电容式触摸屏电容式触摸屏的构造主要是在玻璃屏幕上镀一层透明的薄膜层,再在导体层外加上了一块保护玻璃,双玻璃设计能够很好地保护导体层及感应器。3红外线式触摸屏 这种触摸屏由装在触摸屏外框上的红外线发射与接收感测元件构成,在屏幕表面上形成红外线探测网,任何触摸物体都可以改变触点上的红外线而实现触摸操作。红外触摸屏不受电流、电压和静电干扰,适宜某些恶劣的环境条件。4表面声波触摸屏表面

3、声波是一种沿着介质表面传播的机械波。这种触摸屏由触摸屏、声波发生器、反射器和声波接收器组成,其中,声波发生器能发送一种高频声波跨越屏幕的表面,当手指触到屏幕时,触点上的声波就被阻止,由此确定触点坐标的位置。7.2.1 S3C2440触摸屏接口概述S3C2440具有8通道模拟输入的10位CMOS模数转换器(ADC),它将输入的模拟信号转换为10位的二进制数字码。在2.5MHz的A/D转换器时钟下,最大转化速率可以达到500KSPS。A/D器支持片上采样和保持功能,并支持掉电模式。7.2.2 S3C2440触摸屏接口操作1S3C2440触摸屏控制器工作模式2S3C2440触摸屏接口专用寄存器2S3

4、C2440触摸屏接口专用寄存器S3C2440触摸屏接口涉及的专用寄存器比较少,主要有ADCCON、ADCTSC、ADCDAT0和ADCDAT1。下面分别对它们进行介绍。(1)ADCCON控制寄存器。(2)ADC触摸屏控制寄存器ADCTSC。(3)ADCDAT0和ADCDAT1寄存器(4)ADC起始廷迟寄存器(ADCDLY)1s3c2410ts_probe分析s3c2410ts_probe是一个探测函数,在这个函数中完成了硬件资源获取、GPIO口的初始化、中断申请和注册驱动程序等操作。2touch_timer_fire分析touch_timer_fire()函数主要实现以下功能:stylus d

5、own的时候,touch_timer_fire()函数在中断函数stylus_updown里被调用,此时缓存区没有数据,ts.count的值为0,所以只是简单地设置A/D转换的模式,然后开启A/D转换。当ADC中断函数stylus_action()把缓冲区填满时,作为中断后半段函数稍后被调用,此时ts.count等于shift,算出其平均值后,交给事件处理层(Event Handler)处理,主要是填写缓冲然后唤醒等待输入数据的进程。stylus抬起,等到缓冲区填满后(可能会包含一些无用的数据)被调用,这时判断出stylus up,报告stylus up事件,重新等待stylus down。4

6、stylus_action分析static irqreturn_t stylus_action(int irq,void*dev_id,struct pt_regs*regs)unsigned long data0;/用于保存X坐标的值unsigned long data1;/用于保存Y坐标的值data0=readl(base_addr+S3C2410_ADCDAT0);/读X坐标的值data1=readl(base_addr+S3C2410_ADCDAT1);/读Y坐标的值ts.xp+=data0&S3C2410_ADCDAT0_XPDATA_MASK;/X坐标的值累加ts.yp+=data

7、1&S3C2410_ADCDAT1_YPDATA_MASK;/Y坐标的值累加ts.count+;/计数器递增 if(ts.count (1inputcore-eventhandler-userspace 的顺序到达用户空间传给应用程序。按键、触摸屏、键盘、鼠标等输入都可以利用Input接口函数来实现设备驱动。在Linux内核中,Input设备用input_dev 结构体描述。7.4.2 输入设备结构体要了解输入设备子系统,就得先了解内核中输入设备的定义,这里先给出内核中input_dev的定义,然后再对其中重要的成员进行描述。2ID和name字段在注册输入设备前,驱动程序应该设置dev-nam

8、e。ID字段包含了总线ID(PCI、USB,.),供应商ID和设备的设备ID。总线ID在input.h文件中定义。供应商和设备ID在pci_ids.h、usb_ids.h和相似的头文件中被定义。这些字段应该在注册输入设备前被驱动程序设置。ID和name字段可以通过evdev接口传递给用户空间使用。3keycode、keycodemax、keycodesize字段这3个字段可以用于所有输入设备,被用来报告将产生的数据作为扫描码。如果不是所有的扫描码可以被自动识别所辨别,它们可能需要通过用户空间应用程序设置。这样keycode数组被用来映射扫描码到输入系统的键码。keycodemax包含了数组的大

9、小。keycodesize表示数组中数据的大小(单位为bytes)。4evbit、keybit、relbit、absbit字段这几个字段是用于设置输入设备的事件类型,EV_KEY是最简单的事件类型,用作按键的事件类型。这个事件通过下面函数报告给输入系统:input_report_key(struct input_dev*dev,int code,int value)1硬件设备的注册init_input_dev(&ts.dev);ts.dev.evbit0=ts.dev.evbit0=BIT(EV_SYN)|BIT(EV_KEY)|BIT(EV_ABS);ts.dev.keybitLONG(BT

10、N_TOUCH)=BIT(BTN_TOUCH);input_set_abs_params(&ts.dev,ABS_X,0,0 x3FF,0,0);input_set_abs_params(&ts.dev,ABS_Y,0,0 x3E8,0,0);input_set_abs_params(&ts.dev,ABS_PRESSURE,0,1,0,0);sprintf(ts.phys,ts0);/填写设备名称/*以上是输入设备的名称和ID,这些信息是输入设备的身份信息了*/ts.dev.private=&ts;ts.dev.name=s3c2410ts_name;ts.dev.phys=ts.phys;

11、ts.dev.id.bustype=BUS_RS232;ts.dev.id.vendor=0 xDEAD;ts.dev.id.product=0 xBEEF;ts.dev.id.version=S3C2410TSVERSION;2注册input handlerstatic struct input_handler evdev_handler=.event=evdev_event,.connect=evdev_connect,.disconnect=evdev_disconnect,.fops=&evdev_fops,.minor=EVDEV_MINOR_BASE,.name=evdev,.id

12、_table=evdev_ids,;static int _init evdev_init(void)return input_register_handler(&evdev_handler);7.4.5 编写输入设备驱动需要完成的工作从上面这个例子可以看出,通过Input子系统,具体的输入设备驱动只需要完成如下工作:1在模块加载函数中告知Input子系统它可以报告的事件设备驱动通过set_bit()告诉Input子系统它支持哪些事件,如下所示。set_bit(EV_KEY,button_dev.evbit);set_bit(BTN_0,button_dev.keybit);2在模块加载函数中

13、注册输入设备设备驱动可以通过input_register_device()注册一个输入设备,函数原型如下:input_register_device(&button_dev);3在键被按下/抬起、触摸屏被触摸/抬起/移动、鼠标被移动/单击/抬起时,通过input_report_xxx()函数报告发生的事件及对应的键值/坐标等状态主要的事件类型包括EV_KEY(按键事件)、EV_REL(相对值,如光标移动,报告的是相对最后一次位置的偏移)和EV_ABS(绝对值,如触摸屏、操纵杆,它们工作在绝对坐标系统)。4在模块卸载函数中注销输入设备注销输入设备的函数如下:void input_unregist

14、er_device(struct input_dev*dev);是前一节内核源码的3c2410ts_remove函数中用下面函数注销触摸屏输入设备。input_unregister_device(&ts.dev);/注销输入设备7.5 触摸屏驱动移植和内核编译7.5.1 修改初始化源码7.5.2 修改硬件驱动源码s3c2440_ts.c 7.5.3 修改Kconfig和Makefile7.5.4 配置编译内核7.5.5 触摸屏测试程序设计7.5.1 修改初始化源码本节主要是几个关键文件,这些文件完成一些硬件初始化工作。读者看这里的时候可以对照内核原代码来看。1修改arch/arm/mach-s

15、3c2440/mach-smdk2440.c2修改arch/arm/plat-s3c24xx/devs.c3添加头文件1修改arch/arm/mach-s3c2440/mach-smdk2440.c这个文件夹的上部分写的都是各个硬件设备的初始化数据。比如串口的初始化数据定义如下:static struct s3c2410_uartcfg smdk2440_uartcfgs _initdata=0=.hwport =0,.flags =0,.ucon =0 x3c5,.ulcon =0 x03,.ufcon =0 x51,1=.hwport =1,.flags =0,.ucon =0 x3c5,

16、.ulcon =0 x03,.ufcon =0 x51,/*IR port*/2=.hwport =2,.flags =0,.ucon =0 x3c5,.ulcon =0 x43,.ufcon =0 x51,;2修改arch/arm/plat-s3c24xx/devs.c这个文件里面全是设备信息。这里常出现的就是resource类型的数据结构。代表各类资源,在这里加入下面代码,注意,要在文件尾,至少要在s3c_adc_resource定义之后,因为我们要用到它。/*touch screen*/struct platform_device s3c_device_ts=.name=s3c2410-

17、ts,.id=-1,.num_resources=ARRAY_SIZE(s3c_adc_resource),.resource=s3c_adc_resource,;EXPORT_SYMBOL(s3c_device_ts)3添加头文件如果使用的内核版本里面没有reg-adc.h,则需要从其他版本复制reg-adc.h,文件位置在include/asm-arm/arch-s3c2410/regs-adc.h,Linux 2.6.25.8版本是有这个文件的,只要在该文件内添加如下内容,这些内容是用来设置触摸屏的工作模式的。#define S3C2410_ADCTSC_XY_PST_N (0 x00)

18、/无操作模式#define S3C2410_ADCTSC_XY_PST_X (0 x10)/对X坐标进行转换#define S3C2410_ADCTSC_XY_PST_Y (0 x20)/对Y坐标进行转换#define S3C2410_ADCTSC_XY_PST_W (0 x3evbit0=ts.dev-evbit0=BIT(EV_SYN)|BIT(EV_KEY)|BIT(EV_ABS);/*同步事件、按键事件、绝对坐标事件*/ts.dev-keybitLONG(BTN_TOUCH)=BIT(BTN_TOUCH);/一个按键 input_set_abs_params(ts.dev,ABS_X,

19、0,0 x3FF,0,0);/绝对坐标的X方向 input_set_abs_params(ts.dev,ABS_Y,0,0 x3FF,0,0);/绝对坐标的Y方向 input_set_abs_params(ts.dev,ABS_PRESSURE,0,1,0,0);/按下还是抬起 sprintf(ts.phys,ts0);/dev文件夹中该触摸屏的名字 ts.dev-private=&ts;ts.dev-name=s3c2440ts_name;/输入系统的名字 ts.dev-phys=ts.phys;ts.dev-id.bustype=BUS_RS232;ts.dev-id.vendor=0 x

20、DEAD;/生产商代号 ts.dev-id.product=0 xBEEF;ts.dev-id.version=S3C2440TSVERSION;ts.shift=info-oversampling_shift;.printk(KERN_INFO%s successfully loadedn,s3c2440ts_name);/*All went ok,so register to the input system*/input_register_device(ts.dev);/注册S3C2440ts输入设备3注册S3C2440ts触摸屏驱动static struct device_driver

21、 s3c2440ts_driver=.name =s3c2440-ts,.bus =&platform_bus_type,.probe =s3c2440ts_probe,.remove =s3c2440ts_remove,;int _init s3c2440ts_init(void)return driver_register(&s3c2440ts_driver);void _exit s3c2440ts_exit(void)driver_unregister(&s3c2440ts_driver);7.5.3 修改Kconfig和Makefile要使驱动程序可以在内核的配置界面中显示并进行配置

22、和编译,需要修改drivers/input/touchscreen/Kconfig和drivers/input/touchscreen/Makefile。1修改drivers/input/touchscreen/Kconfig2修改drivers/input/touchscreen/Makefile1修改drivers/input/touchscreen/Kconfigconfig TOUCHSCREEN_S3C2440 tristate Samsung S3C2440 touchscreen input driver depends on ARCH_S3C2440&INPUT&INPUT_T

23、OUCHSCREEN select SERIO help Say Y here if you have the s3c2440 touchscreen.If unsure,say N.To compile this driver as a module,choose M here:the module will be called s3c2440_ts.config TOUCHSCREEN_S3C2440_DEBUG boolean Samsung S3C2440 touchscreen debug messages depends on TOUCHSCREEN_S3C2440 help Se

24、lect this if you want debug messages2修改drivers/input/touchscreen/Makefile#Make the touchscreen drivers.#Each configuration option enables a list of files.obj-$(CONFIG_TOUCHSCREEN_ADS7846)+=ads7846.oobj-$(CONFIG_TOUCHSCREEN_BITSY)+=h3600_ts_input.oobj-$(CONFIG_TOUCHSCREEN_CORGI)+=corgi_ts.oobj-$(CONF

25、IG_TOUCHSCREEN_GUNZE)+=gunze.oobj-$(CONFIG_TOUCHSCREEN_ELO)+=elo.oobj-$(CONFIG_TOUCHSCREEN_FUJITSU)+=fujitsu_ts.oobj-$(CONFIG_TOUCHSCREEN_MTOUCH)+=mtouch.oobj-$(CONFIG_TOUCHSCREEN_MK712)+=mk712.oobj-$(CONFIG_TOUCHSCREEN_HP600)+=hp680_ts_input.oobj-$(CONFIG_TOUCHSCREEN_HP7XX)+=jornada720_ts.oobj-$(CO

26、NFIG_TOUCHSCREEN_USB_COMPOSITE)+=usbtouchscreen.oobj-$(CONFIG_TOUCHSCREEN_PENMOUNT)+=penmount.oobj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT)+=touchright.oobj-$(CONFIG_TOUCHSCREEN_TOUCHWIN)+=touchwin.oobj-$(CONFIG_TOUCHSCREEN_UCB1400)+=ucb1400_ts.oobj-$(CONFIG_S3C2410_TOUCHSCREEN)+=s3c2440_ts.o7.5.4 配置编译内核接下来就可以进入内核配置界面把驱动编译入内核中了。1把触摸屏驱动编译进内核2选择Event debugging进行内核调试1把触摸屏驱动编译进内核2选择Event debugging进行内核调试7.5.5 触摸屏测试程序设计对于输入事件接口的触摸屏设备,它使用的是输入设备的标准接口。这种接口传递的数据结构是struct input_enent,它的定义在include/linux/imput.h中。struct input_event struct timeval time;unsigned short type;unsigned short code;unsigned int value;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁