Guest User

wacom_i4_parse_pen_report

a guest
Jan 19th, 2012
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.18 KB | None | 0 0
  1. static void wacom_i4_parse_pen_report(struct wacom_data *wdata,
  2.                         struct input_dev *input, unsigned char *data)
  3. {
  4.         __u16 x, y, pressure;
  5.  
  6.         /*printk(KERN_INFO "data[1,2,3,4,5]: %x, %x, %x, %x, %x\n", data[1], data[2], data[3], data[4], data[5]);      
  7.         */
  8.         switch (data[1]) {
  9.         case 0x80: /* Out of proximity report */
  10.                 //wdata->tool = 0;
  11.                 input_report_key(input, BTN_TOUCH, 0);
  12.                 input_report_key(input, BTN_STYLUS, 0);
  13.                 input_report_key(input, BTN_STYLUS2, 0);
  14.                 input_report_abs(input, ABS_PRESSURE, 0);
  15.                 input_report_key(input, wdata->tool, 0);
  16.                 input_report_abs(input, ABS_MISC, 0);
  17.                 input_event(input, EV_MSC, MSC_SERIAL, wdata->serial);
  18.                 input_sync(input);
  19.                 wdata->tool = 0;
  20.                 printk(KERN_INFO "out prox serial:%X, ", wdata->serial);
  21.                 printk(KERN_INFO "tool:%X, ", wdata->tool);
  22.                 printk(KERN_INFO "id:%X\n", wdata->id);
  23.                 break;
  24.         case 0xC2: /* Tool report */
  25.                 /* tool number */
  26. /*to be verified*/
  27.                 wdata->id = ((data[2] << 4) | (data[3] >> 4) |
  28.                         ((data[7] & 0x0f) << 20) |
  29.                         ((data[8] & 0xf0) << 12));
  30. /*copy z usb - to be verified*/
  31.                 wdata->serial = ((data[3] & 0x0f) << 28) +
  32.                         (data[4] << 20) + (data[5] << 12) +
  33.                         (data[6] << 4) + (data[7] >> 4);
  34.  
  35.                 switch (wdata->id & 0xfffff) {
  36.                 case 0x802:
  37.                         wdata->tool = BTN_TOOL_PEN;
  38.                         break;
  39.                 case 0x80A:
  40.                         wdata->tool = BTN_TOOL_RUBBER;
  41.                         break;
  42.                 }
  43.                 printk(KERN_INFO "inprox serial:%X, ", wdata->serial);
  44.                 printk(KERN_INFO "tool:%X, ", wdata->tool);
  45.                 printk(KERN_INFO "id:%X\n", wdata->id);
  46.                 break;
  47.         default: /* Position/pressure report */
  48.                 x = data[2] << 9 | data[3] << 1 | ((data[9] & 0x02) >> 1);
  49.                 y = data[4] << 9 | data[5] << 1 | (data[9] & 0x01);
  50.                 pressure = (data[6] << 3) | ((data[7] & 0xC0) >> 5)
  51.                         | (data[1] & 0x01);
  52.  
  53.                 input_report_key(input, BTN_TOUCH, pressure > 1);
  54.                 input_report_key(input, BTN_STYLUS, data[1] & 0x02);
  55.                 input_report_key(input, BTN_STYLUS2, data[1] & 0x04);
  56.                 input_report_abs(input, ABS_X, x);
  57.                 input_report_abs(input, ABS_Y, y);
  58.                 input_report_abs(input, ABS_PRESSURE, pressure);
  59.                 input_report_abs(input, ABS_MISC, wdata->id);
  60.                 input_event(input, EV_MSC, MSC_SERIAL, wdata->serial);
  61.                 input_report_key(input, wdata->tool, 1);
  62.                 input_sync(input);
  63.                 printk(KERN_INFO "repo pos serial:%X, ", wdata->serial);
  64.                 printk(KERN_INFO "tool:%X, ", wdata->tool);
  65.                 printk(KERN_INFO "id:%X\n", wdata->id);
  66.                 break;
  67.         }
Advertisement
Add Comment
Please, Sign In to add comment