Natalie2-uo Touch Screen驱动说明及Bug修改记录

简介:

Natalie2的Touch在DVT2及后续阶段采用的是Jtouch的模组,而Jtouch又用的新思(Synaptics)的IC.而在EVT及DVT1部分机器用的是Atmel的电容屏。但是在软件上是做的自动侦测,发现是哪块电容屏就加载哪个电容屏的驱动,而且采样率都差不多是80HZ/S,这是相同点。不同点是Synaptics的屏没有噪声干扰,在IC内部的Firmware里都做了处理,而Atmel的屏没有Debug噪声问题,因为当时只有一小部分机器用的Atmel屏。没有时间去维护一个项目两块屏。

从硬件角度上来看,主控区(Main Part Region)和四个按键区(SoftKey Region)就是一个整屏,大小为1750(横向)*3052(纵向)。在软件上把这块屏划分为两个驱动,主控区占据1750*(3052*(800/854))这么大小,这个800/854的系数是LCD整屏像素分辨率是854而主控区占据了其中的800个像素点计算出来的。纵向从3052*(800/854)à 3052这块大小是按键区,横向的1750四等分以后的每个部分就是每个SoftKey的横向边界区分点。

从软件角度上看有两个设备。这两个设备是不一样的,主控区直接由输出子系统打开,并且支持多点上报。而按键区则不支持多点上报,一方面是Spec没有要求我们没有必要画蛇添足,另一方面多点触控处理起来非常麻烦,并且这个设备不能由输入子系统打开,而是只能由中间的一个incservice守护进程来打开和取数据。按键区设备是一个虚拟的设备。

原理:

主控区驱动原理:

在IIC设备列表中增加新思电容屏设备,位于board-msm7x27.c中static struct i2c_board_info i2c_devices[]数组。包括设备名ts_synaptics,中断Pin, IIC Slave设备的从地址0x22等。在对应的驱动中驱动名也叫ts_synaptics,代码位于synaptics_ts.c中static struct i2c_driver ts_synaptics_driver变量里。当系统启动以后驱动名字和设备名字相匹配以后Probe就会调用到这个驱动的Probe,在Probe里完成电容屏的上电,初始化以及跟输入子系统注册对应的Input设备。后续的动作就是设置参数位包括长半轴长和短半轴长,单点多点属性等等,这些都是标准的东西,可以参考同目录下其它电容屏驱动,网上也有很多介绍的,比如说http://blog.csdn.net/pottichu/archive/2010/06/23/5689479.aspx。这个介绍的比较详细,这里不需要赘述。需要特别说明的是,当中断到达时,依据Linux内核中断处理方法分为顶半部和底半部的做法,需要把具体的取IC数据和上报动作放到一个工作对队里去,这个工作对队就是所谓的底半部。如果不这样做的话中断处理时间过长,CPU进程切换的话一定会引起当机。同样的道理,在进休眠时需要设置Sleep寄存器,也需要把做这件事推入一个工作队列里去,否则也是当机。主控区有许多标准驱动参照,这里不做过多说明,主要是SoftKey区我们扩展的软件判断按键的处理复杂一些。

按键区驱动原理:

因为这本身就是一个虚拟的设备,所以只要在static void __init msm7x2x_init(void)中注册一个platform_device就行,设备变量是struct platform_device

tpsynaptics_sub_device,设备名是ts_synaptics_sub。同样在ts_synaptics_probe里注册它的驱动platform_driver_register(&ts_synaptics_sub_driver);所有的输入设备的注册都在input.c的int input_register_device(struct input_dev *dev)中,在这个函数里当有设备名为ts_atmel_sub_dev或ts_synaptics_sub_dev来注册时就改成Input30,之所以改成input30是考虑未来功能扩展的需要,一般输入设备号从0开始自动增加,设备号30一般用不到,没有那么多的输入设备。有了input30设备以后还需要把它对应的事件名设置为envent30,这个修改是在drivers/input/evdev.c中static int evdev_connect(struct input_handler *handler, struct input_dev *dev,const struct input_device_id *id)修改的。在向上层看,framework层会遍历打开/dev/input下的设备。所以要想这个input30只能由中间守护进程incservice打开和使用,就得挡掉对它的打开操作。修改文件/framework/base/libs/ui/eventhub.cpp中的int EventHub::open_device(const char *deviceName)。当打开input30时需要返回失败,不让它打开,这个设备就给incservice打开,因为在守护进程里还有计数或转换的处理。

摸拟按键优点:将按键做在触摸屏有效区域并用主控软件自己区分按键的方式来实现的,这样做的主要好处是客户可以不同的Lens上按键ICON不同设计,自己随意定义按键面积大小和具体位置,以及按键个数。而且主控处理这些也比较容易和方便。

摸拟按键缺点:case复杂,处理起来容量出错。不如硬按键直接读方便。

软件摸拟4个按键会遇到很多问题,比如说:

Question_1. 两个手指同时按主控区域和4个按键之一, 按多点上报的话会即有主控区的坐标上报又有按键区按键上报,假设主控区坐标是响应打开某一网页,按键是BACK,则LCD显示就会紊乱.

Question_2. 手指从主控区按下,然后滑动到4个按键之一.

Question_3. 手指从4个按键之一按下,然后滑动到另一个按键.

Question_4. 从按键区滑动到主控区.

Question_5. 按键区和按键区,以及按键区和主控区交界的地方都不好处理,因为坐标落点有可能一会儿在主控区一会在按键区.

针对这四个问题有以下方案:

Answer_1. 这个问题需要主控先进行判断,当按键区域和LCD AA两个区域都有坐标上报的时候,只响应其中一个就行。如果这部分由触摸屏自己判断,其实也是这么处理的,要么根据手指触摸的先后顺序决定只上报一个手指坐标,或者根据手指接触面积大小决定以那个坐标为主决定后一个数据上报。

Answer _2. 原理和做法和上述第一点类似,主要看UI部分的设计需求。

Answer _3. 当手指滑动并离开前一个按键区域到另一个按键中间有一段空隙(不属于任何按键区域),主控可以利用这段区域的坐标情况判断手指是从某个按键滑动到另一个按键,还是直接按到按键上的坐标响应。

Answer _4. 原理和做法类似上述内容.

Answer _5. 原理和做法类似上述内容.

处理流程及策略说明一下:

正常按键:

X方向:第一波点的第一个点落到四个SoftKey区域之中,陈秋兰的Service 程序开始计算按下值,每五个Press则认为有效按键,否则弃之不理。如果其中有落入X方向的隔离区press时不计入有效按键,直到driver层送上来release为止。

Y方向:第一波点的第一个点落到四个SoftKey区域之中,如果有y值小于2964,那么我会补发一个Release上去,视为本次按键结束。

滑动按键:

如下图所示

(1):连续由SoftKey1 滑动至SoftKey4释放,这时driver 上报的状态为(x,y,press),(x,y,press)..... (release). 其中越过X方向隔离区时,需要陈秋兰的Serive 补发上一个SoftKey区域的UP和下一个SoftKey区域的Down.

(2):   由Softkey区域移动到Main touch区域,这时由driver层在越过Y方向隔离区时补发一个release上去,视为SoftKey区域按键结束。

(4):  由Main Touch区滑向Sub Touch区域,这时处于隔离区中的点不上报。这些忽略的点宽度设计为每一波点的最大长度,现在寄存器设置为0xf,也就是15。这样就行造成大约有4个像素点的地方没有响应,       15                   x

------      =    ------

3052                      854

按这个比例计算出来,x = 4.197. 这个区域属于Sub Touch 区。虽然忽略了这几个像素点的Touch响应,但是Softkey的误判可以解决。另外,这样处理对SoftKey区域的响应没有实质上的影响。

(3):   这种情况是先(4)后(2)的组合,处理方法也是两者的组成。

对于旧的Atmel Touch和新的Synaptics Touch,驱动已经调整两者的扫描频率基本相同。对上层而言已经屏蔽硬件差别。

主要Bug修改记录:

CN1163QS0BCA004 版本更新及工廠工具-鎖屏後,機器自動動作

EVT及以前用的是ATMEL的电容屏,有RF噪声干扰,在合盖的时候会更明显,不断的有中断上来,报告新的坐标点。后续方案改为Synaptics,没有继续修改这类问题

CN1163QS0BDJ010 日文輸入-信息內容輸入中按softkey back 鍵返回的同時打開menu介面

SoftKey区域上报改为单点,流程和架构都重新设计,参考 touchPanel软按键处理.msg。

CN1163QS0BBA019 通話記錄-在通話記錄介面進行觸摸操作觸屏失效

Natalie2的Touch中断Pin没有接上拉电阻,而W380的Touch却接上了。没有上拉电阻会造成进休眠以后中断Pin  GPIO在出休眠时状态不对,因为主控代码这边只认由高到底的电平变化为中断到达,就会去取数据。如果出休眠以后直接就是低电平,就有可能SynapticsIC 也不去拉高,造成状态出错。修改的办法是出休眠时配置GPIO的状态为输入上拉,在去读GPIO口的状态如果为低,则Push一个中断到工作队列里把数据读出来,因为如果配置为上拉还不为高的话就证明的确有数据在IC里,新思的IC在有数据,并且主控这边不去读的话它就一直为低不置高,也会产生问题。代码在static void ts_synaptics_slpwkp(struct work_struct *work)函数里。

CN1163QS0CBO015  GPS導航-進入GPS界面Zoom in(Zoom out)手勢

多点上报的支持问题。可能是有些第三方软件对多点上报坐标点的数据间距的设置不当,可能是导致无法进行缩放操作的原因。当时这个问题在google默认的图库里是支持多点上报的,而在高德导航里却不支持,最后也是由他们改好的。

W280 Touch Screen驱动说明

 

W280的Touch还是采用新思的方案TM1897. 寄存器绝大多数与TM1669一致。SYNAPTICS_RESET_REG这个Register不一样,TM1669它的地址是0x61, TM1897它是0x68.其它的代码架构也基本一致。这里不在多说。

ESD问题。W280的TouchScreen在ESD方面表现不如Natalie2好,一方面是IIC Bus不太稳定,目前跟韩涛负责的Near Sensor IC有关。另一方面是ESD测试10枪左右Touch工作异常,一直有(0.0)点的中断上报上来。厂商给过几周的解决,现在给出的初步方案是主控制端发现状态码不对需要做一个Reset的动作。它们有文档说明,文档名是TM1897 ESD analysis and resolution.pdf。早期也发过一个TM1897 Host driver adding feature.pptx的文档,后来证明是没有效果。修改的地方位于static void ts_synaptics_work(struct work_struct *work)有注释//added by juhuaiwei for Touch ESD Issue May.10,2011的这段,就是数据异常时下电在上电。

杂项:

进出休眠处理。一开始Synaptics和Atmel进休眠时都是做下电处理,当时会造成约1mA的耗电,我把每个金手指挨个粘上透明胶带去试,后来终于发现是由IIC 的CLK脚上在进休眠时会从上拉电阻灌到IC里的。导致1mA的漏电原因是进休眠时下电使得IC的管脚电平状态不对,内部处于未知状态。而进休眠时不断电,只是去设置Sleep寄存器的话就会在进休眠前将IC设定在固定的一个状态,漏电达到最小,约100uA。进休眠和出休眠时也要另起一个工作队列去读写IC的Sleep寄存器static void ts_synaptics_slpwkp(struct work_struct *work),否则的话也会引起当机。这一点上跟中断的处理项半部和底半部道理一样。如果在static int ts_synaptics_pm_suspend(struct i2c_client *client)时直接读写寄存器因为调用时间太长,没等返回CPU就要进行进程切换,引起当机。还有电容屏是不需要驱动校准的,IC内部的Firmware都能完成这个工作。比如说在常温下机器进休眠,而放到冰箱零下四十度里一会儿在唤醒,这时电容屏的各个参数是不一样的,会发生温度漂移。如果不自校准的话报点会有问题。这一点上。W380 Atmel的做法是出休眠时恢复Sleep寄存器,并且下达ReCalibration的指令。而Natale2的TM1669 Module就仅仅是恢复Sleep寄存器,不过我想它Firmware肯定有这样的动作。

IIC数据读写出错处理。

IIC总线上挂载的设备比较多,很可能某一时刻总线异常造成数据读写出错,这是正常的。当读写遇到这种情况时要等待一会儿在去读,还要加入超时控制,比如说10次读写都出错的话那就退出,否则占用CPU资源。static void ts_synaptics_work(struct work_struct *work)工作队列里做了10次读写出错的超时控制。

交接人:鞠怀伟

日期:   May.24, 2011

【工作交接】 Touch Screen 模拟按键实现相关推荐

  1. android touch screen keyboard input移植记录

    android touch screen keyboard input移植记录  仅仅是作为记录: Andorid 的 touchscreen 事件必须要有  BTN_TOUCH 才可以. 所以初始化 ...

  2. adb模拟按键home_adb 命令模拟按键事件 模拟 点击 事件

    有时我们需要程序模拟按钮或点击,而手机本身又没有,哪么可以采取adb 模拟实现,最后再去实际设备去测试(前期一般都拿不到设备): 如模拟上一首,下一首,暂停等,手机上是没有的,但有些设备上是有的: / ...

  3. adb 模拟按键,调试按键,android测试可以用

    我们在用adb 调试app时,如果需要模拟按键怎样做呢 (http://blog.csdn.net/sergeycao),可以使用如下的方法 adb shell input keyevent 4 #这 ...

  4. windows 模拟按键与鼠标

    windows 模拟按键与鼠标 函数功能:模拟按键或鼠标.一次完整的按键由KEYEVENTF_KEYDOWN和KEYEVENTF_KEYUP两个子事件组成. 函数原型: VOID keybd_even ...

  5. android4 触摸屏驱动,android中如何设计触摸屏驱动touch screen driver

    以下内容是来自android官方的文档,详细说明了android上层关心的event事件,如果要做一个好的TP驱动,这些信息是必须清楚的,另外现在的android2.3已经完全支持了virtualke ...

  6. 模拟鼠标键盘html,模拟按键操作神器(鼠标键盘模拟操作助手)V2.0.2.1 正式版

    模拟按键操作神器(鼠标键盘模拟操作助手)是一款很优秀好用的由网友自制的模拟按键操作的辅助工具.如果你需要一款好用的键盘模拟软件,小编带来的这款模拟按键操作神器是很不错的选择,功能强大全面,使用后可以帮 ...

  7. adb 输入回车命令_adb命令模拟按键输入keycode

    例子: //这条命令相当于按了设备的Backkey键 adb shell input keyevent 4 //可以解锁屏幕 adb shell input keyevent 82 //在屏幕上做划屏 ...

  8. linux模拟手柄输入,linux下如何模拟按键输入和模拟鼠标

    查看/dev/input/eventX是什么类型的事件, cat /proc/bus/input/devices 设备有着自己特殊的按键键码,我需要将一些标准的按键,比如0-9,X-Z等模拟成标准按键 ...

  9. 模拟linux设备按键工具,linux下如何模拟按键输入和模拟鼠标

    linux下如何模拟按键输入和模拟鼠标 发布时间:2008-08-19 21:11:54来源:红联作者:anopup 查看/dev/input/eventX是什么类型的事件, cat /proc/bu ...

最新文章

  1. “干掉” Date,Java8 LocalDate 真香!
  2. 中移动正进行智能网关互通测试:下半年规模集采
  3. poj 3417 树形dp+LCA
  4. 安卓软件错误log_关于android程序的log错误信息的问题,请明白人看下吧,我是初学者,新建的android项目,一个代码都没改过...
  5. 重构-改善既有代码的设计 (该书写于1999)培训之一
  6. 一文搞定C语言指针问题
  7. hibernate框架搭建与使用
  8. Ajax控件和类库简析
  9. Atitit 2017年的技术趋势与未来的大技术趋势 1. 2017年的技术趋势 2 1.1. Web not native 2 1.2. 更加移动优先 ,,more spa 3 1.3. Ar
  10. cad连筋字体怎么安装_CAD图纸乱码怎么办?送你2800款字体,解决烦人的乱码问题...
  11. 计算机硬盘扇区修复,如何修复Windows中的“硬盘坏扇区”
  12. c语言运行太短怎么毡筒,C语言程序设计 最简单的C程序设计.ppt
  13. SCAU高级语言程序设计--实验9 函数的应用(1)
  14. 左神算法基础class6—题目3拓扑排序
  15. Leetcode 905. Sort Array By Parity
  16. 计算机、通信方向学习考证经验分享
  17. 萝卜怎么吃最治病:白菜萝卜汤养胃暖身
  18. 【LeetCode】复数乘法
  19. oracle存储过程初学实例
  20. 数据存储备份的策略技术

热门文章

  1. Netty 实现一对一客户端聊天(由服务器转发)
  2. 带你轻松玩转神奇Micro:bit开发板的Max:Bot机器人!
  3. vba移动文件_VBA学习笔记8:工作表操作
  4. python c++情侣网名含义_python的对象与名字绑定(转贴,此文甚好)
  5. 百度云主机使用WordPress建站ideashare.club过程总结与那些坑
  6. 开源的微信商城,含小程序端,后台管理系统,服务器后端,附完整源码
  7. POS--权益证明机制
  8. 月球轨道周期变化将造成2030年代地球沿海出现涨潮洪水
  9. 记录一下Vue中的created函数所踩到的坑(回调函数不立即生效)
  10. MUMU模拟器启动时提示MuMu App Player已停止工作