基于I2C的嵌入式触摸屏驱动设计_第1页
基于I2C的嵌入式触摸屏驱动设计_第2页
基于I2C的嵌入式触摸屏驱动设计_第3页
基于I2C的嵌入式触摸屏驱动设计_第4页
基于I2C的嵌入式触摸屏驱动设计_第5页
已阅读5页,还剩9页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux/Android 多点触摸支持2011-10-10 13:28在 内核 2.6.30 开始,添加了对多点触摸的支持。在ENACh( ttp:/lii-enac.fr/en/architecture/linux-input/) 中给出来多点触摸的例子,支持 Ubuntu10.10 、Fedora14、 Android 。而且还直接支持 win7 的 HID 多点协议,加载相关驱动后,只需 VID/PID对应上,那么支持 WIN7多点的,在 LINUX中也可实现多点触摸了。整个处理过程就是: touch screen->drivers->inputsubsystem->

2、evdev->user space。由于 touchscreen 的不同,要使 Linux 支持 多点触摸, 还是要搭配或开发驱动。 在驱动层中主要是把数据接收下来, 然后根 据多点触摸协议,上传到 input 子系统。下面是多点触摸协议:for (i=0; i<pointNumber;i+)input_event(input, EV_ABS, ABS_MT_TOUCH_MAJOR, pointi.valid); /如果当前点有效,则 pointi.valid 大于 0 的数即可input_event(input, EV_ABS, ABS_MT_POSITION_X, pointi

3、.x);input_event(input, EV_ABS, ABS_MT_POSITION_Y, pointi.y);input_mt_sync(input);/ 一帧数据发送完成,发送一个同步信号input_sync(input);Linux 多点触摸接口2011-10-10 13:39输入子系统 硬件设备驱动按键、触摸屏、键盘、鼠标等输入都可以利用 input 接口函数来实现设备驱动, 驱动层负责和底层硬件打交道,向系统报告按键、触摸屏、键盘、鼠标等输入事 件,驱动报告的事件经过 InputCore 和 Eventhandler 最终到达用户空间。通过 input 子系统,具体的输入设备

4、驱动只需要完成如下工作:1. 在模块加载函数中注册输入设备,注册输入设备的函数为int input_register_device(struct input_dev *dev);2. 在模块加载函数中告知 input 子系统它可以报告的事件。设备驱动通过 set_bit() 告诉 input 子系统它支持哪些事件: set_bit(EV_KEY, button_dev.evbit);3. 在键被按下 /抬起、触摸屏被触摸 /抬起/移动、鼠标被移动 /单击/抬起时通过 input_ report_xxx() 报告发生的事件及对应的键值 / 坐标等状态。 主要的事件类 型:function :vo

5、id input_report_key(struct input_dev *dev, unsigned int code, int value);void input_report_rel(struct input_dev *dev, unsigned int code, int value);void input_report_abs(struct input_dev *dev, unsigned int code, int value);input_sync() 用于事件同步, 它告知事件的接收者驱动已经发出了一个完整的报 告。告。比如: 在触摸屏设备驱动中,一次坐标及按下状态的整个报告过

6、程如下: input_report_abs(input_dev, ABS_X, x); /X坐标input_report_abs(input_dev, ABS_Y, y); /Y坐标input_report_abs(input_dev, ABS_PRESSURE, pres); / 压力 input_sync(input_dev); / 同步4. 在模块卸载函数中注销输入设备void input_unregister_device(struct input_dev *dev);一个设备可以支持一个或多个事件类型。 每个事件类型下面还需要设置具体的触 发事件,比如EV_KEY事件,支持哪些按键等

7、。多点触摸接口译自: linux-4Documentationinputmulti-touch-protocol.txt简介为了使用功能强大的多点触控设备, 就需要一种方案去上报用户层所需的详 细的手指触摸数据。 这个文档所描述的多点触控协议可以让内核驱动程序向用户 层上报任意多指的数据信息。使用说明单点触摸信息是以ABS承载并按一定顺序发送,如BTN_TOUCABS_XABS_Y SYNC而多点触摸信息则是以ABS_M承载并按一定顺序发送,如 ABS_MT_POSITION、ABS_MT_POSITION然后通过调用 input_mt_sync()产生 一个SYN_MT_RE

8、PORT eve来标记一个点的结束,告诉接收方接收当前手指的 信息并准备接收其它手指的触控信息。最后调用 input_sync() 函数上报触摸信 息开始动作并告诉接收方开始接收下一系列多点触摸信息。协议定义了一系列ABS_M事件,这些事件被分为几大类,充许只应用其中的 一部份,多点触摸最小的事件集中应包括 ABS_MT_TOUCH_MA、JOR ABS_MT_POSITION_X ABS_MT_POSITION_YW此来实现多点触摸。如果设备支 持ABS_MT_WIDTH_MA这个事件,那么此事件可以提供手指触摸接触面积大小。 触摸方向等信息可以由 ABS_MT_TOUCH_MINOR, A

9、BS_MT_WIDTH_MINOR and ABS_MT_ORIENTATI提供。ABS_MT_TOOL_TY提供触摸设备的类别,如手或是 笔或是其它。最后有些设备可能会支持 ABS_MT_TRACKING_I用来支持硬件跟 踪多点信息,即该点属于哪一条线等。下面是两点触摸支持的最小事件集序列:ABS_MT_TOUCH_MAJORABS_MT_POSITION_X ABS_MT_POSITION_Y SYN_MT_REPORT / 上报第一个点 ABS_MT_TOUCH_MAJORABS_MT_POSITION_XABS_MT_POSITION_YSYN_MT_REPORT / 上报第二个点S

10、YN_REPORT / 开始动作Event 原语“接触”一词用来描述一个物体直接碰到另一个物体的表面 面的分辨率为X*Y,则ABS_MT_TOUCH_MAJ的最大值为sqrt(XA2+YA2)ABS_MT_TOUCH_MAJO述了主接触面的长轴,它和X, Y同一个单位,如果一个ABS_MT_TOUCH_MlNffiR 了接触面的短轴,如果接触面是圆形,它可以不用。ABS_MT_WIDTH_MA描述了接触工具的长轴ABS_MT_WIDTH_MINO述了接触工具的短轴 ABS_MT_TOUCH_MAJOR := max(X, Y)ABS_MT_TOUCH_MINOR := min(X, Y) AB

11、S_MT_ORIENTATION := bool(X > Y)以上四个参数可以用来生成额外的触摸信息,如ABS_MT_TOUCH_MAJOR/ABS_MT_WIDTH 的比率OR以用来描述压力。ABS_MT_ORIENTATIONABS_MT_POSITION接触面的中心点X坐标ABS_MT_POSITION接触面的中心点Y坐标ABS_MT_TOOL_TY描述接触工具类型,很多内核驱动无法区分此参数如手指及笔,如果是这样,该参数可以不用,协议目前支持MT_TOOL_FINGERMT_TOOL_PEN 两种类型。ABS_MT_BLOBJD状集ID,集合几个点以描述一个形状,很多驱动没有形状

12、属 性,此参数可以不用。ABS_MT_TRACKING_B3i 了从接触开始到释放的整个过程的集合,如果设备不 支持,此参数可是不用。触摸轨迹仅有少数设备可以明触的标识真实的 trackingID ,多数情况下 trackingID 只能来标识一次触摸动作的过程。手势多点触摸指定的应用是创建手势动作,TOUCH和WIDTH参数经常用来区别手指的压力和手指间的距离,另外 MINOF类的参数可以用来区别设备的接触面 的大小(点接触还是面接触),ORIENTATION可以产生旋转事件。参考代码:(1) 注册多点触摸设备ts->input_dev = input_allocate_device(

13、);if (ts->input_dev = NULL) ret = -ENOMEM;printk(KERN_ERR "Failed to allocate input devicen"); goto err_input_dev_alloc_failed; ts->input_dev->name = "MT-touchscreen" set_bit(EV_SYN, ts->input_dev->evbit); set_bit(EV_KEY, ts->input_dev->evbit); set_bit(EV_ABS

14、, ts->input_dev->evbit); set_bit(BTN_TOUCH, ts->input_dev->keybit);max_x=0x77b;max_y=0xb38; input_set_abs_params(ts->input_dev, ABS_X, 0, max_x, 0, 0); input_set_abs_params(ts->input_dev, ABS_Y, 0, max_y, 0, 0); input_set_abs_params(ts->input_dev, ABS_PRESSURE, 0, 255, 0,0); inp

15、ut_set_abs_params(ts->input_dev, ABS_TOOL_WIDTH, 0, 15, 0,0); input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, max_x, 0, 0);input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, max_y, 0, 0);input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);input_set_abs_

16、params(ts->input_dev,ABS_MT_WIDTH_MAJO0,R,15,0, 0);ret = input_register_device(ts->input_dev);if (ret) printk(KERN_ERR"Unable to register %sinput devicen",ts->input_dev->name);goto err_input_register_device_failed;(2) 报点for(i=0;i<finger;i+)input_report_abs(ts->input_dev,

17、ABS_MT_TOUCH_MAJOR, 1); input_report_abs(ts->input_dev, ABS_MT_POSITION_X, ts->xi); input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, ts->yi); input_mt_sync(ts->input_dev);ts->upsend=0;if(finger)input_sync(ts->input_dev);elseif(!ts->upsend)input_report_abs(ts->input_dev,

18、ABS_MT_TOUCH_MAJOR, 0); input_mt_sync(ts->input_dev);input_sync(ts->input_dev);ts->upsend=1;基于 I2C 的嵌入式多点触摸屏幕驱动设计 (1) 更新于 2011-03-21 16:09:33 文章出处 : OFweek关键字: I2C 嵌入式 多点触摸屏幕 驱动引言随着嵌入式设备的开发和推广,触摸屏作为新式输入设备已经随处可见,手机、PDA、MID 以及 ATM机等设备都已经用到了触摸屏。而科技在不断发展,触摸屏也由一开始的4 线式单点电阻触摸屏发展到今天的各种多点式电容触摸屏。 本文

19、通过对以 cypress 7958 为代表的 I2C 总线接口 电容式多点触摸屏的研究, 设计了针对 Linux 操作系统的多点触摸的屏幕 驱动 ,以及不运行操作系统前提下的单片机对触摸屏的驱动, 取得了良好的效果。1 研究平台介绍1.1 ARM 11 处理器 S3C6410XS3C6410X是基于ARM1176JZFS核的用于手持、 移动等终端设备的通用处理器。S3C6410X是一款低功率、高性价比、高性能的用于移动电话和通用处理RSIC处理器。为2.5G和3G通信服务提供了优化的硬件性能,采用 64/32位的内部总线架构,融合了 AXI、AHB、APB总线。还有很多强大的硬件加速器, 包括

20、运动视频处理、音频处理、2D加速、显示处理和缩放。1.2电容式多点触摸屏电容式触摸屏 在触摸屏4边均镀上狭长的电极, 在导电体内形成一个低电压交流电场。在触摸屏幕时,由于人体电场,手指与导体层间会形成一个耦合电容,4边电极发岀的电流会流向触点,而电流强度与手指到电极的距离成正比,位于触摸屏幕后的控制器会计算电流的比例及强弱,准确算岀触摸点的位置。电容触摸屏的双玻璃不但能保护导体及感应器,更有效地防止外在环境因素对触摸屏造成影响,就算屏幕沾 有污秽、尘埃或油渍,电容式触摸屏依然能准确算岀触摸位置。与电阻触摸屏相对比,电容式触摸屏就是 支持多点触摸的人机交互方式,普通电阻式触摸屏只能进行单一点的触

21、控。1.3 ARM 工具链本文针对ARM核的单片机使用了 arm交叉编译链,实现对 ARM支持的二进制文件编译,用以成功编译ARMLinux 2.6.28内核。1.4移植条件对于本文所述内容,所有支持Linux操作系统运行的处理器(包括嵌入式处理器)都可以运行,而所有支持I2C总线协议的单片机也可以在不使用操作系统的前提下将触摸屏作为一种普通输入设备进行使 用。2研究过程图1显示了本文中针对嵌入式 Linux平台下的驱动软硬件结构体系。内核蒲务:mux Ktrnd 2 和 2Knuch-smdkMlD cTouch 7985 rouich7485 iiJkConfig.Makcflk用户部分:

22、Android.Qtopm 口 门二辿图1驱动软硬件结构体系2.1 I2C设备在平台部分声明CYPRESS 7958多点触摸屏的I2C地址为0x20,在使用前需要在平台设备处进行I2C设备声明,这样才可以使Linux驱动找到其对应的I2C地址进行操作。首先要声明该I2C设备结构体,代码如下:static struct i2c_board_info i2c_devs1 口 _initdata=I2C_BOARD_INFO ( “cypess, 0x20 ), /*cypress;然后在 static void _init smdk6410_ mac hine_init ( void )函数中声明

23、该 I2C 设备:i2c_register_board_info (1, i2c_devs1 , ARRAY_SIZE(i2c_devs1 ) ;2.2 Cypress 7958 驱动部分设计2.2.1 注册和注销模块首先建立 I2C 驱动结构体, cypress_7958_driver ,代码如下:static struct i2c_driver cypress_7958_driver=.probe=cypress_7958_probe ,.remove=cypress_7958_remove ,.id_table=cypress_7958_id ,.driver=.name=CYPRESS

24、_7958_NAME ,;然后建立 _INIT 初始化函数与 _EXIT 注销设备函数: static int _devinit cypress_7958_ts_init(void ),static void _exit cypress_7958_exit (void ),通过 i2c_add_driver 与 i2c_del_driver 函数进行 I2C 设备的 注册与注销。2.2.2 触摸屏驱动入口函数的设计由上节中声明的 I2C 结构体得知,在设备被检查到的时候进入 static int synaptics _ts_probe ( struct i2c_client *client ,

25、 const struct i2c_device_id *id )函数,在该函数中需要进行触摸屏工作模式的初始化, 对作为输入设备的触摸屏驱动在 Linux 平台下的设备名注册, 同时初始化触摸事件触发时引起的中断操作。( 1 ) Cypress 7958 模式初始化作为多点触摸屏幕, Cypress 7958 有很多相关的配置寄存器,本文中不再赘述,初始化部分仅需对屏 幕是否工作在正常工作模式下进行检查, 通过读取 0x28 地址的寄存器,如果值为 0x07 ,则屏幕工作正常, 否则返回错误值。ret=i2c_smbus_read_byte_data (ts client , 0x28 );

26、if(ret !=0x07 )printk ( KERN_ERR, “Cypress Detect Errorn )”;return ret;(2) 输入设备名注册创建 struct input_dev 结构体,通过 input_allocate_device ()函数进行设备名的创建, 然后通过 set_bit 函数进行输入设备功能声明。因为是多点触摸屏,可以产生EV_SYN, EV_KEY, BTN_TOUCH, BTN_2 (多点触摸), EV_ABS 等功能,故对之进行声明:set_bit( EV_SYN,tsinput_dev evbit );set_bit(EV_KEY,tsinp

27、ut_dev evbit ) ;set_bit( BTN_T0UCH ,ts input_dev keybit )set_bit( BTN_2 ,tsinput_devkeybit ) ;set_bit( EV_ABS,ts input_devevbit ) ;然后完成对事件的具体配置:input_set_abs_params(ts input_dev ,ABS_X,0, max_y ,0,0);input_set_abs_params(ts input_dev ,ABS_Y,0, max_x ,0,0);input_set_abs_params(ts input_dev ,ABS_PRESS

28、URE, 0,255,0, 0) ;input_set_abs_params(ts input_dev ,ABS_T00L_WIDTH ,0, 15, 0, 0) ;input_set_abs_params(ts input_dev ,ABS_HAT0X, 0, max_y ,0, 0) ;input_set_abs_params(ts input_dev ,ABS_HAT0Y, 0, max_x ,0, 0) ;input_set_abs_params(ts input_dev ,ABS_MT_P0SITI0N_X, 0,max_y , 0, 0)input_set_abs_params(t

29、s input_dev ,ABS_MT_P0SITI0N_Y, 0,max_x , 0, 0 )input_set_abs_params(ts input_dev ,ABS_MT_T0UCH_MAJ0R ,0, 255, 0, 0 )input_set_abs_params(ts input_dev ,ABS_MT_WIDTH_MAJ0R ,0, 15, 0 , 0)最后通过 input_register_device ( ts input_dev )函数完成对该设备名的注册。(3) 驱动事件产生中断函数初始化Cypress 7958 触摸屏在触摸事件产生时会在 IRQ 引脚产生一个低电平信号

30、,将该引脚 连接到GPN(15)引脚上,同时创建 GPI0中断函数:s3c_gpio_cfgpin(S3C64XX_GPN(15),S3C_GPIO_SFN(2);client?>irq=gpio_to_irq(S3C64XX_GPN(15);irqflags=IRQF_TRIGGER_L0W;然 后 通 过 ret=request_irq(client?>irq, cypress_7958_irq_handler, irqflags, client?>name, ts) 进行中断函数申请。创建 cypress_7958_irq_handler 函数:static irqre

31、turn_t cypress_7958_irq_handler(int irq, void *dev_id)struct syn aptics_ts_data *ts=dev_id;int ret=gpio_get_value(S3C64XX_GPN(15);/printk("%s:ret=%dn",_func_,ret);disable_irq_ nosyn c(ts?>clie nt?>irq);queue_work(cypress_7958_wq, &ts?>work);return IRQ_HAND LED当驱动事件被触发之后通过queue

32、_work函数进入驱动工作区cypress_7958_wq,进行驱动层对应用层的信息上报。2.2.3触摸屏工作区函数设计触摸屏工作区函数需要完成事件信息获取以及驱动层对应用层的信息上报功能,通过INIT_WORK(&ts?>work, cypress_7958_work_fu nc)函数完成驱动工作区函数的初始化声明,在驱动事件中断产生之后进入工作区函数cypress_7958_work_fu nc 。(1)触摸屏事件信息获取Cypress 7958的事件触发信息存储在寄存器中,只需要通过 i2c_smbus_read_byte_data函数对其寄存器信息进行读取即可完成其事件信

33、息的获取,也可以通过i2c_transfer完成对其寄存器信息的批量读取:buf0=i2c_smbus_read_byte_data(ts?>client, 0x12);buf1=i2c_smbus_read_byte_data(ts?>client, 0x13);buf2=i2c_smbus_read_byte_data(ts?>client, 0x14);buf3=i2c_smbus_read_byte_data(ts?>client, 0x15);buf4=i2c_smbus_read_byte_data(ts?>client, 0x16);buf5=i2c

34、_smbus_read_byte_data(ts?>client, 0x17);buf6=i2c_smbus_read_byte_data(ts?>client, 0x18);buf7=i2c_smbus_read_byte_data(ts?>client, 0x19);buf8=i2c_smbus_read_byte_data(ts?>client, 0x1a);buf9=i2c_smbus_read_byte_data(ts?>client, 0x1b);buf10=i2c_smbus_read_byte_data(ts?>client, 0x1c);b

35、uf11=i2c_smbus_read_byte_data(ts?>client, 0x1d);buf12=i2c_smbus_read_byte_data(ts?>client, 0x1e);buf13=i2c_smbus_read_byte_data(ts?>client, 0x1f);(2) 触摸屏事件信息上报系列函数进通过对 buf 数组的分析,获取当前事件具体信息,然后通过 input_report 行事件信息的应用层上报:if(fingermark=2) input_report_key(ts?>input_dev,ABS_MT_TRACKING_ID,0)

36、;input_report_abs(ts?>input_dev, ABS_MT_TOUCH_MAJOR, f1z);input_report_abs(ts?>input_dev, ABS_MT_POSITION_X, f1x);input_report_abs(ts?>input_dev, ABS_MT_POSITION_Y, f1y);input_mt_sync(ts?>input_dev);input_report_key(ts?>input_dev,ABS_MT_TRACKING_ID,1);input_report_abs(ts?>input_dev

37、, ABS_MT_TOUCH_MAJOR, f2z);input_report_abs(ts?>input_dev, ABS_MT_POSITION_X, f2x);input_report_abs(ts?>input_dev, ABS_MT_POSITION_Y, f2y); input_mt_sync(ts?>input_dev)input_sync(ts?>input_dev);else if(fingermark=1)input_report_key(ts?>input_dev,ABS_MT_TRACKING_ID,0); input_report_abs(ts?>input_dev, ABS_MT_TOUCH_MAJOR, f1z); input_rep

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论