0
回答
linux中关于usb hid touchscreen的几个问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

        最近做一个Android R-box的东西,然后外接了一个usb touchscreen,有提供驱动源码,发现与/kernel/drivers/input/touchscreen/usbtouchscreen.c 驱动框架一样,不同的是读取数据的函数 xxx_read_data(struct usbtouch_usb *dev, unsigned char *pkt)。不同的硬件,读取pkt方式不同。

        下面是厂商提供的驱动中的数据读取函数:

static int astri_read_data(struct astri_tp_usb *dev, unsigned char *pkt){
      
      //printk(KERN_NOTICE "enter into astri_read_data function\n");
      dev->x1 = ((pkt[4] & 0xFF) << 8) | (pkt[3] & 0xFF);
      dev->y1 = ((pkt[6] & 0xFF) << 8) | (pkt[5] & 0xFF);

      dev->x2 = ((pkt[10] & 0xFF) << 8) | (pkt[9] & 0xFF);
      dev->y2 = ((pkt[12] & 0xFF) << 8) | (pkt[11] & 0xFF);

      if (pkt[13]==2)
      {
          dev->touch1=1;
          dev->touch2=1;
      }
      else if (pkt[13]==1)
      {
          dev->touch1=1;
          dev->touch2=0;
      } 
      else 
      {
          dev->touch1=0;
          dev->touch2=0;
      }   

      return 1;
}

       

        问题就在这,pkt[13]读取的值一直是0,也就是说,等于没有触发触摸事件。下面是数据上报函数:


static void usbtouch_process_pkt(struct astri_tp_usb *psmt,
                                 unsigned char *pkt, int len)
{
    //printk(KERN_NOTICE "enter into usbtouch_process_pkt function\n");
    struct psmt_device_info *type = psmt->type;
	  
    if (!type->read_data(psmt, pkt))
		return;
    // printk(KERN_NOTICE "phase3 Get %d point(s) psmt->x1:%d psmt->y1:%d psmt->x2:%d psmt->y2:%d\n",psmt->touch1+psmt->touch2,psmt->x1,psmt->y1,psmt->x2,psmt->y2);
    if((psmt->x1 > TOUCHSCREEN_MAXX) || (psmt->y1 > TOUCHSCREEN_MAXY)) return;
    if((psmt->x2 > TOUCHSCREEN_MAXX) || (psmt->y2 > TOUCHSCREEN_MAXY)) return;
    printk(KERN_NOTICE "Get %d point(s) x1:%d y1:%d || x2:%d y2:%d\n",psmt->touch1+psmt->touch2,psmt->x1,psmt->y1,psmt->x2,psmt->y2);
    
    input_report_key(psmt->input_dev, BTN_TOUCH, psmt->touch1);    

    if (psmt->touch2)
    { 
	input_report_abs(psmt->input_dev, ABS_X, psmt->x1);
	input_report_abs(psmt->input_dev, ABS_Y, psmt->y1);
	input_report_abs(psmt->input_dev, ABS_MT_POSITION_X, psmt->x1);
	input_report_abs(psmt->input_dev, ABS_MT_POSITION_Y, psmt->y1);
	input_mt_sync(psmt->input_dev);
	input_report_abs(psmt->input_dev, ABS_MT_POSITION_X, psmt->x2);
	input_report_abs(psmt->input_dev, ABS_MT_POSITION_Y, psmt->y2);
	input_mt_sync(psmt->input_dev);
	input_sync(psmt->input_dev);
    }
    else if (psmt->touch1)
    { 
	input_report_abs(psmt->input_dev, ABS_X, psmt->x1);
	input_report_abs(psmt->input_dev, ABS_Y, psmt->y1);
	input_report_abs(psmt->input_dev, ABS_MT_POSITION_X, psmt->x1);
	input_report_abs(psmt->input_dev, ABS_MT_POSITION_Y, psmt->y1);
	input_mt_sync(psmt->input_dev);
	input_sync(psmt->input_dev);
    }
    else
    { 
	input_mt_sync(psmt->input_dev);
	input_sync(psmt->input_dev);
    }
    //printk(KERN_NOTICE "exit usbtouch_process_pkt function\n");
}

        astri_read_data()中,因为读取ptk[13]一直为0,所以usbtouch_process_pkt()函数中psmt->touch1和psmt->touch2一直为0,但是在触摸范围内移动的话,x、y轴能读取到数据的。不管怎么移动,ptk[13]都是0。

        想知道ptk中的值是否是由硬件传过来的?


举报
xunbcc
发帖于4年前 0回/1K+阅
顶部