better handling for gp0504

This commit is contained in:
ond 2015-06-01 12:10:15 +02:00
parent 7638afd9f1
commit fc3d4db1ca

View File

@ -104,6 +104,42 @@ static inline void handle_default(struct hanvon *hanvon)
} }
} }
static inline void handle_gp0504(struct hanvon *hanvon)
{
unsigned char *data = hanvon->data;
struct input_dev *dev = hanvon->dev;
#define AM_MAX_ABS_X 0x27de
#define AM_MAX_ABS_Y 0x1cfe
switch(data[0]) {
case 0x01: /* button press */
if(data[1]==0x55) /* left side */
report_buttons(hanvon, lbuttons,data[2]);
if(data[3]==0xaa) /* right side (am1107, am1209) */
report_buttons(hanvon, rbuttons,data[4]);
break;
case 0x02: /* position change */
/*printk(KERN_INFO "Hanvon Test : 1x%04x 2x%04x 4x%04x 6x%04x 7x%04x 8x%04x\n\t\tClicked : %s %i/%04x\n", data[1], data[2], data[4], data[6], data[7], data[8], data[6] > 63 ? "true" : "false", data[6], get_unaligned_be16(&data[6]));*/
if((data[1] & 0xf0) != 0) {
input_report_abs(dev, ABS_X, get_unaligned_be16(&data[2]) * 0xffff / AM_MAX_ABS_X);
input_report_abs(dev, ABS_Y, get_unaligned_be16(&data[4]) * 0xffff / AM_MAX_ABS_Y);
input_report_abs(dev, ABS_TILT_X, data[7] & 0x3f);
input_report_abs(dev, ABS_TILT_Y, data[8]);
input_report_abs(dev, ABS_PRESSURE, get_unaligned_be16(&data[6])>>6);
}
/*printk(KERN_INFO "Hanvon Test : %i\n", data[6]);*/
input_report_key(dev, BTN_LEFT, data[6] > 68); /* pen touches the surface */
input_report_key(dev, BTN_RIGHT, data[1] & 0x02); /* stylus button pressed (right click) */
input_report_key(dev, lbuttons[0], data[1] & 0x20); /* 'eraser' button */
break;
}
}
static inline void handle_gp0906(struct hanvon *hanvon) static inline void handle_gp0906(struct hanvon *hanvon)
{ {
unsigned char *data = hanvon->data; unsigned char *data = hanvon->data;
@ -201,6 +237,9 @@ static void hanvon_irq(struct urb *urb)
case USB_PRODUCT_ID_APPIV0906: case USB_PRODUCT_ID_APPIV0906:
handle_appiv0906(hanvon); handle_appiv0906(hanvon);
break; break;
case USB_PRODUCT_ID_GP0504:
handle_gp0504(hanvon);
break;
default: default:
handle_default(hanvon); handle_default(hanvon);
break; break;
@ -214,10 +253,9 @@ static void hanvon_irq(struct urb *urb)
return; return;
default: default:
printk("%s - nonzero urb status received: %d", __func__, urb->status); printk("%s - nonzero urb status received: %d", __func__, urb->status);
break; break;
} }
input_sync(hanvon->dev); input_sync(hanvon->dev);
retval = usb_submit_urb (urb, GFP_ATOMIC); retval = usb_submit_urb (urb, GFP_ATOMIC);