Android2.3触摸屏功能详解

jopen 14年前
     <p><span style="font-size:16px;">手机设备上常用触摸屏进行用户操作,非常方便快捷,而且正好有个项目上用到这个设备,所以就花时间研究了一下。好了,还是老规则:大体了解概念先,细节线索找代码:</span></p>    <p><span style="font-size:16px;">InputReader.cpp <span style="font-family:宋体;">中有针对单点触摸</span><span style="font-family:Times New Roman;">SingleTouchInputMapper</span><span style="font-family:宋体;">及多点触摸</span><span style="font-family:Times New Roman;">MultiTouchInputMapper</span><span style="font-family:宋体;">的处理代码,这两个类都继承自</span><span style="font-family:Times New Roman;">TouchInputMapper</span><span style="font-family:宋体;">,由</span><span style="font-family:Times New Roman;">syncTouch</span><span style="font-family:宋体;">处理最终的触摸屏动作的发送。</span></span></p>    <p><span style="font-size:16px;">1<span style="font-family:宋体;">、首先了解一下触摸屏中的几个参数概念:</span></span></p>    <p><span style="font-size:16px;">“接触”一词用来描述一个物体直接碰到另一个物体的表面。</span></p>    <p><span style="font-size:16px;">单点触摸的参数解析:</span></p>    <p><span style="font-size:16px;">ABS_X<span style="font-family:宋体;">,</span><span style="font-family:Times New Roman;">ABS_Y</span><span style="font-family:宋体;">分别对应触摸屏的</span><span style="font-family:Times New Roman;">x</span><span style="font-family:宋体;">,</span><span style="font-family:Times New Roman;">y</span><span style="font-family:宋体;">坐标</span></span></p>    <p><span style="font-size:16px;">ABS_PRESSURE<span style="font-family:宋体;">是压力值,一般触摸屏也只是分是否有按下去,按下去的话值会大于多少,没有按的话值小于多少</span></span></p>    <p><span style="font-size:16px;">ABS_TOOL_WIDTH <span style="font-family:宋体;">触摸工具的宽度</span></span></p>    <p><span style="font-size:16px;">多点触摸的参数解析:</span></p>    <p><span style="font-size:16px;">ABS_MT_POSITION_X 接触面的形心的X坐标值 </span></p>    <p><span style="font-size:16px;">ABS_MT_POSITION_Y 接触面的形心的Y坐标值 </span></p>    <p><span style="font-size:16px;"> ABS_MT_TOUCH_MAJOR<span style="font-family:宋体;">和</span><span style="font-family:Times New Roman;">ABS_MT_WIDTH_MAJOR </span><span style="font-family:宋体;">分别被用来提供手指的大小和触摸面积大小</span> </span></p>    <p><span style="font-size:16px;">TOUCH <span style="font-family:宋体;">和 </span><span style="font-family:Times New Roman;">WIDTH</span><span style="font-family:宋体;">参数给出了个,想想如果一个手指按在玻璃上,透过玻璃你将看到两个区域,一个是手指与玻璃接触的区域,用 </span><span style="font-family:Times New Roman;">ABS_MT_TOUCH_MAJOR</span><span style="font-family:宋体;">描述,一个是手指本身大小的区域,</span><span style="font-family:Times New Roman;">ABS_MT_WIDTH_MAJOR</span><span style="font-family:宋体;">描述, 手指与玻璃接触的面积要小于手指本身的大小,通过这两个参数,可以换算出手指的压力。也可通过 </span><span style="font-family:Times New Roman;">ABS_MT_PRESSURE</span><span style="font-family:宋体;">参数直接提供手指的压力。</span></span></p>    <p><span style="font-size:16px;"> 除了 <span style="font-family:Times New Roman;">MAJOR</span><span style="font-family:宋体;">这个参数,还可以提供一个 </span><span style="font-family:Times New Roman;">MINOR</span><span style="font-family:宋体;">参数,手指可以被认为是一个椭圆,</span><span style="font-family:Times New Roman;">MAJOR</span><span style="font-family:宋体;">和 </span><span style="font-family:Times New Roman;">MINOR</span><span style="font-family:宋体;">可以认为是这个椭圆的长轴和短轴,椭圆的中心可以被 </span><span style="font-family:Times New Roman;">ORIENTATION</span><span style="font-family:宋体;">这个参数描述。</span></span></p>    <p><span style="font-size:16px;">ABS_MT_PRESSURE</span></p>    <p><span style="font-size:16px;"> 接触工具对接触面的压力大小,可以用来代替上面的四个参数。</span></p>    <p><span style="font-size:16px;">ABS_MT_ORIENTATION</span></p>    <p><span style="font-size:16px;"> 描述随圆的转动趋势,这是一个抽相值,O值表示接触面在平行与触摸屏的Y轴,向左是负值,向右是正值,如果完全平行于X轴,则上向返回最大值。如果接触面是圆形,则可以忽略这个参数。如果内核不能获得这个参数有有效值,但可以区分接触面的长短轴,这个功能还是可以被部份支持,在一些设备中, <span style="font-family:Times New Roman;">ABS_MT_ORIENTATION </span><span style="font-family:宋体;">的值只能是 </span><span style="font-family:Times New Roman;">0</span><span style="font-family:宋体;">和1。</span></span></p>    <p><span style="font-size:16px;">ABS_MT_TOOL_TYPE<span style="font-family:宋体;">描述接触工具类型</span>(手指,触控笔等 ),很多内核驱动无法区分此参数如手指及笔,如果是这样,该参数可以不用,协议目前支持<span style="font-family:Times New Roman;">MT_TOOL_FINGER</span><span style="font-family:宋体;">和</span><span style="font-family:Times New Roman;">MT_TOOL_PEN</span><span style="font-family:宋体;">两种类型。</span><br /> ABS_MT_BLOB_ID<span style="font-family:宋体;">形状集</span><span style="font-family:Times New Roman;">ID</span><span style="font-family:宋体;">,集合几个点以描述一个形状,很多驱动没有形状属性,此参数可以不用。</span></span></p>    <p><span style="font-size:16px;">ABS_MT_TRACKING_ID<span style="font-family:宋体;">描述了从接触开始到释放的整个过程的集合,如果设备不支持,此参数可是不用。</span></span></p>    <p><span style="font-size:16px;">计算方法:</span></p>    <p><span style="font-size:16px;"> 一些设备将触摸面作为一个矩形上报,可以通过下面这些公式来计算出协议中所需要的信息。<br /> </span></p>    <p><span style="font-size:16px;">ABS_MT_TOUCH_MAJOR := max(X, Y)</span></p>    <p><span style="font-size:16px;">ABS_MT_TOUCH_MINOR := min(X, Y)</span></p>    <p><span style="font-size:16px;">ABS_MT_ORIENTATION  := bool(X > Y)</span></p>    <p><span style="font-size:16px;">ABS_MT_ORIENTATION<span style="font-family:宋体;">的取值范围为0至1,用来标识矩形接触面偏向X轴或Y轴的程度。</span></span></p>    <p><span style="font-size:16px;">触摸轨迹</span></p>    <p><span style="font-size:16px;">仅有少数设备可以明触的标识真实的 <span style="font-family:Times New Roman;">trackingID</span><span style="font-family:宋体;">,多数情况下 </span><span style="font-family:Times New Roman;">trackingID</span><span style="font-family:宋体;">只能来标识一次触摸动作的过程。</span></span></p>    <p><span style="font-size:16px;">手势</span></p>    <p><span style="font-size:16px;">多点触摸指定的应用是创建手势动作, <span style="font-family:Times New Roman;">TOUCH</span><span style="font-family:宋体;">和 </span><span style="font-family:Times New Roman;">WIDTH</span><span style="font-family:宋体;">参数经常用来区别手指的压力和手指间的距离,另外 </span><span style="font-family:Times New Roman;">MINOR</span><span style="font-family:宋体;">类的参数可以用来区别设备的接触面的大小(点接触还是面接触</span><span style="font-family:Times New Roman;">),ORIENTATION</span><span style="font-family:宋体;">可以产生旋转事件。</span></span></p>    <p><span style="font-size:16px;">以上的含义从<a href="/misc/goto?guid=4959517901464991212">http://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt</a> 翻译而来,可以自行下载</span></p>    <p><span style="font-size:16px;">2、代码入手</span></p>    <p><span style="font-size:16px;">第一部分:直接写<span style="font-family:Times New Roman;">/dev/input/eventX</span><span style="font-family:宋体;">接点实现</span></span></p>    <p><span style="font-size:16px;">单点触摸事件发送序列:</span></p>    <p><span style="font-size:16px;">EV_KEY (BTN_TOUCH) <span style="font-family:宋体;">发送是否在按下或弹出(</span><span style="font-family:Times New Roman;">0</span><span style="font-family:宋体;">或者</span><span style="font-family:Times New Roman;">1</span><span style="font-family:宋体;">)</span></span></p>    <p><span style="font-size:16px;">ABS_X </span></p>    <p><span style="font-size:16px;">ABS_Y</span></p>    <p><span style="font-size:16px;">ABS_PRESSURE</span></p>    <p><span style="font-size:16px;">ABS_TOOL_WIDTH</span></p>    <p><span style="font-size:16px;">代码演示:</span></p>    <p><span style="font-size:16px;">event.type  = EV_KEY;</span></p>    <p><span style="font-size:16px;">event.code  = BTN_TOUCH;</span></p>    <p><span style="font-size:16px;">mDown = (istEvent->pointers[0].abs_pressure > 0)?1:0 ;</span></p>    <p><span style="font-size:16px;">Event.value  = mDown;</span></p>    <p><span style="font-size:16px;">write(fd,&event,sizeof(event)) ;</span></p>    <p><span style="font-size:16px;">/* <span style="font-family:宋体;">触摸屏键按下坐标定位  </span><span style="font-family:Times New Roman;">*/</span></span></p>    <p><span style="font-size:16px;">event.type  = EV_ABS;</span></p>    <p><span style="font-size:16px;">    event.code  = ABS_X;</span></p>    <p><span style="font-size:16px;">    event.value = istEvent->pointers[0].abs_x;</span></p>    <p><span style="font-size:16px;">    write(fd,&event,sizeof(event)) ;</span></p>    <p><span style="font-size:16px;">event.type  = EV_ABS;</span></p>    <p><span style="font-size:16px;">    event.code  = ABS_Y;</span></p>    <p><span style="font-size:16px;">    event.value = istEvent->pointers[0].abs_y;</span></p>    <p><span style="font-size:16px;">    write(fd,&event,sizeof(event)) ; </span></p>    <p><span style="font-size:16px;">    /* <span style="font-family:宋体;">触摸屏接触面的压力大小 </span><span style="font-family:Times New Roman;">*/</span></span></p>    <p><span style="font-size:16px;">event.type  = EV_ABS;</span></p>    <p><span style="font-size:16px;">    event.code  = ABS_PRESSURE;</span></p>    <p><span style="font-size:16px;">    event.value = istEvent->pointers[0].abs_pressure;</span></p>    <p><span style="font-size:16px;">    write(fd,&event,sizeof(event)) ;</span></p>    <p><span style="font-size:16px;">event.type   = EV_ABS;</span></p>    <p><span style="font-size:16px;">event.code   = ABS_TOOL_WIDTH;</span></p>    <p><span style="font-size:16px;">event.value  = istEvent->pointers[0].abs_touch_major;</span></p>    <p><span style="font-size:16px;">/* <span style="font-family:宋体;">结束完整帧数据,发送同步信号 </span><span style="font-family:Times New Roman;">*/</span></span></p>    <p><span style="font-size:16px;">    event.type  = EV_SYN; </span></p>    <p><span style="font-size:16px;">    event.code  = SYN_REPORT;</span></p>    <p><span style="font-size:16px;">    event.value = 0;</span></p>    <p><span style="font-size:16px;">    write(fd, &event, sizeof(event));</span></p>    <p><span style="font-size:16px;">    </span></p>    <p><span style="font-size:16px;">    Ok,<span style="font-family:宋体;">非常简单,对比</span><span style="font-family:Times New Roman;">inputreader.cpp</span><span style="font-family:宋体;">中的代码,注意</span><span style="font-family:Times New Roman;">process</span><span style="font-family:宋体;">代码:</span></span></p>    <p><span style="font-size:16px;">void SingleTouchInputMapper::process(const RawEvent* rawEvent) {</span></p>    <p><span style="font-size:16px;">    switch (rawEvent->type) {</span></p>    <p><span style="font-size:16px;">    case EV_KEY:  //<span style="font-family:宋体;">一定要注意发送这个</span><span style="font-family:Times New Roman;">event,</span><span style="font-family:宋体;">否则触摸事件不会发送出去,直接丢弃</span></span></p>    <p><span style="font-size:16px;">        switch (rawEvent->scanCode) {</span></p>    <p><span style="font-size:16px;">        case BTN_TOUCH:</span></p>    <p><span style="font-size:16px;">            mAccumulator.fields |= Accumulator::FIELD_BTN_TOUCH;</span></p>    <p><span style="font-size:16px;">            mAccumulator.btnTouch = rawEvent->value != 0;</span></p>    <p><span style="font-size:16px;">            // Don't sync immediately.  Wait until the next SYN_REPORT since we might</span></p>    <p><span style="font-size:16px;">            // not have received valid position information yet.  This logic assumes that</span></p>    <p><span style="font-size:16px;">            // BTN_TOUCH is always followed by SYN_REPORT as part of a complete </span></p>    <p><span style="font-size:16px;">            // packet.</span></p>    <p><span style="font-size:16px;">            break;</span></p>    <p><span style="font-size:16px;">        }</span></p>    <p><span style="font-size:16px;">        break;</span></p>    <p><span style="font-size:16px;">...</span></p>    <p><span style="font-size:16px;">}</span></p>    <p><span style="font-size:16px;">void SingleTouchInputMapper::sync(nsecs_t when) {</span></p>    <p><span style="font-size:16px;">...</span></p>    <p><span style="font-size:16px;">    if (mDown) {  // <span style="font-family:宋体;">这就是上面为何要发送的原因</span></span></p>    <p><span style="font-size:16px;">        mCurrentTouch.pointerCount = 1;</span></p>    <p><span style="font-size:16px;">        mCurrentTouch.pointers[0].id = 0;</span></p>    <p><span style="font-size:16px;">        mCurrentTouch.pointers[0].x = mX;</span></p>    <p><span style="font-size:16px;">        mCurrentTouch.pointers[0].y = mY;</span></p>    <p><span style="font-size:16px;">        mCurrentTouch.pointers[0].pressure = mPressure;</span></p>    <p><span style="font-size:16px;">        mCurrentTouch.pointers[0].touchMajor = 0;</span></p>    <p><span style="font-size:16px;">        mCurrentTouch.pointers[0].touchMinor = 0;</span></p>    <p><span style="font-size:16px;">        mCurrentTouch.pointers[0].toolMajor = mToolWidth;</span></p>    <p><span style="font-size:16px;">        mCurrentTouch.pointers[0].toolMinor = mToolWidth;</span></p>    <p><span style="font-size:16px;">        mCurrentTouch.pointers[0].orientation = 0;</span></p>    <p><span style="font-size:16px;">        mCurrentTouch.idToIndex[0] = 0;</span></p>    <p><span style="font-size:16px;">        mCurrentTouch.idBits.markBit(0);</span></p>    <p><span style="font-size:16px;">}</span></p>    <p><span style="font-size:16px;">...</span></p>    <p><span style="font-size:16px;">}</span></p>    <p><span style="font-size:16px;">多点触摸事件发送序列:</span></p>    <p><span style="font-size:16px;">ABS_MT_TOUCH_MAJOR</span></p>    <p><span style="font-size:16px;">ABS_MT_PRESSURE</span></p>    <p><span style="font-size:16px;">ABS_MT_POSITION_X</span></p>    <p><span style="font-size:16px;">ABS_MT_POSITION_Y</span></p>    <p><span style="font-size:16px;">SYN_MT_REPORT      //<span style="font-family:宋体;">上报第一个点</span></span></p>    <p><span style="font-size:16px;">ABS_MT_TOUCH_MAJOR</span></p>    <p><span style="font-size:16px;">ABS_MT_PRESSURE</span></p>    <p><span style="font-size:16px;">ABS_MT_POSITION_X</span></p>    <p><span style="font-size:16px;">ABS_MT_POSITION_Y</span></p>    <p><span style="font-size:16px;">SYN_MT_REPORT      //<span style="font-family:宋体;">上报第二个点</span></span></p>    <p><span style="font-size:16px;">... //<span style="font-family:宋体;">以上顺序组织多点</span><span style="font-family:Times New Roman;">touch event</span><span style="font-family:宋体;">即可</span></span></p>    <p><span style="font-size:16px;">SYN_REPORT         //<span style="font-family:宋体;">最后发送的完整包动作</span></span></p>    <p><span style="font-size:16px;">代码演示:</span></p>    <p><span style="font-size:16px;">for(pointIndex=0;pointIndex<imtEvent->pointnums;pointIndex++)</span></p>    <p><span style="font-size:16px;">{</span></p>    <p><span style="font-size:16px;">/* <span style="font-family:宋体;">触摸屏键按下坐标定位  </span><span style="font-family:Times New Roman;">*/</span></span></p>    <p><span style="font-size:16px;">event.type  = EV_ABS;</span></p>    <p><span style="font-size:16px;">event.code  = ABS_MT_POSITION_X;</span></p>    <p><span style="font-size:16px;">event.value = imtEvent->pointers[pointIndex].abs_x;</span></p>    <p><span style="font-size:16px;">write(fd,&event,sizeof(event)) ;</span></p>    <p><span style="font-size:16px;">event.type  = EV_ABS;</span></p>    <p><span style="font-size:16px;">event.code  = ABS_MT_POSITION_Y;</span></p>    <p><span style="font-size:16px;">event.value = imtEvent->pointers[pointIndex].abs_y;</span></p>    <p><span style="font-size:16px;">write(fd,&event,sizeof(event)) ;</span></p>    <p><span style="font-size:16px;">    /* <span style="font-family:宋体;">触摸屏接触面的压力大小 </span><span style="font-family:Times New Roman;">*/</span></span></p>    <p><span style="font-size:16px;">event.type  = EV_ABS;</span></p>    <p><span style="font-size:16px;">    event.code  = ABS_MT_PRESSURE;</span></p>    <p><span style="font-size:16px;">    event.value = imtEvent->pointers[pointIndex].abs_pressure;</span></p>    <p><span style="font-size:16px;">    write(fd,&event,sizeof(event)) ;</span></p>    <p><span style="font-size:16px;">/* <span style="font-family:宋体;">触摸屏接触面积大小 </span><span style="font-family:Times New Roman;">*/</span></span></p>    <p><span style="font-size:16px;">event.type   = EV_ABS;</span></p>    <p><span style="font-size:16px;">event.code   = ABS_MT_TOUCH_MAJOR;</span></p>    <p><span style="font-size:16px;">event.value  = imtEvent->pointers[pointIndex].abs_touch_major;</span></p>    <p><span style="font-size:16px;">event.type  = EV_SYN;</span></p>    <p><span style="font-size:16px;">event.code  = SYN_MT_REPORT;</span></p>    <p><span style="font-size:16px;">event.value = 0;</span></p>    <p><span style="font-size:16px;">write(fd,&event,sizeof(event)) ;</span></p>    <p><span style="font-size:16px;">} </span></p>    <p><span style="font-size:16px;">/* <span style="font-family:宋体;">结束完整帧数据,发送同步信号 </span><span style="font-family:Times New Roman;">*/</span></span></p>    <p><span style="font-size:16px;">event.type  = EV_SYN;</span></p>    <p><span style="font-size:16px;">event.code  = SYN_REPORT;</span></p>    <p><span style="font-size:16px;">event.value = 0;</span></p>    <p><span style="font-size:16px;">write(fd,&event,sizeof(event)) ;</span></p>    <p><span style="font-size:16px;">Ok,<span style="font-family:宋体;">只要深入研究下</span><span style="font-family:Times New Roman;">inputreader.cpp</span><span style="font-family:宋体;">的代码即可轻松解决这些问题,更扩展的功能扩大及缩小,以及旋转的功能都可以搞定。</span></span></p>    <p><span style="font-size:16px;">对于多点触摸的功能,首先在<span style="font-family:Times New Roman;">linux</span><span style="font-family:宋体;">内核的</span><span style="font-family:Times New Roman;">input</span><span style="font-family:宋体;">输入模型需要支持,这个在</span><span style="font-family:Times New Roman;">linux/input.h</span><span style="font-family:宋体;">可以见到,多点触摸功能依赖于以下几个主要的软件位:</span></span></p>    <p><span style="font-size:16px;">#define ABS_MT_TOUCH_MAJOR 0x30/* Major axis of touching ellipse */ </span></p>    <p><span style="font-size:16px;">#define ABS_MT_TOUCH_MINOR 0x31/* Minor axis (omit if circular) */ </span></p>    <p><span style="font-size:16px;">#define ABS_MT_WIDTH_MAJOR 0x32/* Major axis of approaching ellipse */ </span></p>    <p><span style="font-size:16px;">#define ABS_MT_WIDTH_MINOR 0x33/* Minor axis (omit if circular) */ </span></p>    <p><span style="font-size:16px;">#define ABS_MT_ORIENTATION 0x34/* Ellipse orientation */ </span></p>    <p><span style="font-size:16px;">#define ABS_MT_POSITION_X 0x35/* Center X ellipse position */ </span></p>    <p><span style="font-size:16px;">#define ABS_MT_POSITION_Y 0x36/* Center Y ellipse position */ </span></p>    <p><span style="font-size:16px;">#define ABS_MT_TOOL_TYPE 0x37/* Type of touching device */ </span></p>    <p><span style="font-size:16px;">#define ABS_MT_BLOB_ID 0x38/* Group a set of packets as a blob */</span></p>    <p><span style="font-size:16px;">第二部分:利用<span style="font-family:Times New Roman;">linux input</span><span style="font-family:宋体;">输入模型发送</span></span></p>    <p><span style="font-size:16px;">主要函数介绍:</span></p>    <p><span style="font-size:16px;">static inline void input_report_abs(struct input_dev *dev, unsigned int code, int value)</span></p>    <p><span style="font-size:16px;">{</span></p>    <p><span style="font-size:16px;">input_event(dev, EV_ABS, code, value);</span></p>    <p><span style="font-size:16px;">}</span></p>    <p><span style="font-size:16px;">static inline void input_mt_sync(struct input_dev *dev)</span></p>    <p><span style="font-size:16px;">{</span></p>    <p><span style="font-size:16px;">input_event(dev, EV_SYN, SYN_MT_REPORT, 0);</span></p>    <p><span style="font-size:16px;">}</span></p>    <p><span style="font-size:16px;">static inline void input_sync(struct input_dev *dev)</span></p>    <p><span style="font-size:16px;">{</span></p>    <p><span style="font-size:16px;">input_event(dev, EV_SYN, SYN_REPORT, 0);</span></p>    <p><span style="font-size:16px;">}</span></p>    <p><span style="font-size:16px;">代码示例:</span></p>    <p><span style="font-size:16px;">设定初始参数(支持单点触摸及多点触摸):</span></p>    <p><span style="font-size:16px;">    set_bit(EV_SYN, ts->input_dev->evbit);</span></p>    <p><span style="font-size:16px;">    set_bit(EV_KEY, ts->input_dev->evbit);</span></p>    <p><span style="font-size:16px;">    set_bit(EV_ABS, ts->input_dev->evbit);</span></p>    <p><span style="font-size:16px;">    set_bit(BTN_TOUCH,ts->input_dev->keybit);</span></p>    <p><span style="font-size:16px;">    </span></p>    <p><span style="font-size:16px;">    max_x = 1280;</span></p>    <p><span style="font-size:16px;">    max_y = 720;</span></p>    <p><span style="font-size:16px;">    </span></p>    <p><span style="font-size:16px;">    input_set_abs_params(ts->input_dev, ABS_X, 0, max_x, 0, 0);</span></p>    <p><span style="font-size:16px;">    input_set_abs_params(ts->input_dev, ABS_Y, 0, max_y, 0, 0);</span></p>    <p><span style="font-size:16px;">    input_set_abs_params(ts->input_dev, ABS_PRESSURE, 0, 255, 0, 0);</span></p>    <p><span style="font-size:16px;">    input_set_abs_params(ts->input_dev, ABS_TOOL_WIDTH, 0, 15, 0, 0);</span></p>    <p><span style="font-size:16px;">    input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, max_x, 0, 0);</span></p>    <p><span style="font-size:16px;">    input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, max_y, 0, 0);</span></p>    <p><span style="font-size:16px;">    input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);</span></p>    <p><span style="font-size:16px;">    input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 15, 0, 0);</span></p>    <p><span style="font-size:16px;">    input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); </span></p>    <p><span style="font-size:16px;">    input_register_device(ts->input_dev);    </span></p>    <p><span style="font-size:16px;">按下时:</span></p>    <p><span style="font-size:16px;">for(i=0;i<finger;i++){</span></p>    <p><span style="font-size:16px;">    input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 1);</span></p>    <p><span style="font-size:16px;">    input_report_abs(ts->input_dev, ABS_MT_PRESSURE, 100);</span></p>    <p><span style="font-size:16px;">    input_report_abs(ts->input_dev, ABS_MT_POSITION_X, ts->x[i]);</span></p>    <p><span style="font-size:16px;">    input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, ts->y[i]);</span></p>    <p><span style="font-size:16px;">    input_mt_sync(ts->input_dev);</span></p>    <p><span style="font-size:16px;">    ts->upsend=0;</span></p>    <p><span style="font-size:16px;">}</span></p>    <p><span style="font-size:16px;">input_sync(ts->input_dev);</span></p>    <p><span style="font-size:16px;">弹起时:</span></p>    <p><span style="font-size:16px;">    input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0);</span></p>    <p><span style="font-size:16px;">    input_report_abs(ts->input_dev, ABS_MT_PRESSURE, 0);</span></p>    <p><span style="font-size:16px;">    input_mt_sync(ts->input_dev);</span></p>    <p><span style="font-size:16px;">    input_sync(ts->input_dev);</span></p>