Looks good to me. One final hint, in case you haven't tried it yet. Linux source ships with scripts/checkpatch.pl. You run it simple as checkpatch.pl 000*" and it will report any possible style issue.
I didn't see any issue but sometimes they hid from ya. Chris On Wed, Nov 2, 2011 at 4:20 PM, Przemo Firszt <[email protected]> wrote: > This is very basic driver for Wacom Intuos4 Wireless tablet. It supports only > position, pressure and pen buttons. More features will be added in future. > > Signed-off-by: Przemo Firszt <[email protected]> > --- > drivers/hid/hid-core.c | 1 + > drivers/hid/hid-ids.h | 1 + > drivers/hid/hid-wacom.c | 142 ++++++++++++++++++++++++++++++++++++++++++++-- > 3 files changed, 137 insertions(+), 7 deletions(-) > > diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c > index 91adcc5..ede9711 100644 > --- a/drivers/hid/hid-core.c > +++ b/drivers/hid/hid-core.c > @@ -1540,6 +1540,7 @@ static const struct hid_device_id > hid_have_special_driver[] = { > { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, > USB_DEVICE_ID_SUPER_DUAL_BOX_PRO) }, > { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, > USB_DEVICE_ID_SUPER_JOY_BOX_5_PRO) }, > { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, > USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH) }, > + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, > USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH) }, > { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, > USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH) }, > { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, > USB_DEVICE_ID_WALTOP_SLIM_TABLET_12_1_INCH) }, > { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, > USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH) }, > diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h > index 1680e99..1726d67 100644 > --- a/drivers/hid/hid-ids.h > +++ b/drivers/hid/hid-ids.h > @@ -675,6 +675,7 @@ > > #define USB_VENDOR_ID_WACOM 0x056a > #define USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH 0x81 > +#define USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH 0x00BD > > #define USB_VENDOR_ID_WALTOP 0x172f > #define USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH 0x0032 > diff --git a/drivers/hid/hid-wacom.c b/drivers/hid/hid-wacom.c > index db23223..f218348 100644 > --- a/drivers/hid/hid-wacom.c > +++ b/drivers/hid/hid-wacom.c > @@ -9,6 +9,7 @@ > * Copyright (c) 2008 Jiri Slaby <[email protected]> > * Copyright (c) 2006 Andrew Zabolotny <[email protected]> > * Copyright (c) 2009 Bastien Nocera <[email protected]> > + * Copyright (c) 2011 Przemysław Firszt <[email protected]> > */ > > /* > @@ -33,6 +34,7 @@ > struct wacom_data { > __u16 tool; > unsigned char butstate; > + __u8 features; > unsigned char high_speed; > #ifdef CONFIG_HID_WACOM_POWER_SUPPLY > int battery_capacity; > @@ -107,6 +109,19 @@ static int wacom_ac_get_property(struct power_supply > *psy, > } > #endif > > +static void wacom_set_features(struct hid_device *hdev) > +{ > + int ret; > + __u8 rep_data[2]; > + > + /*set high speed, tablet mode*/ > + rep_data[0] = 0x03; > + rep_data[1] = 0x20; > + ret = hdev->hid_output_raw_report(hdev, rep_data, 2, > + HID_FEATURE_REPORT); > + return; > +} > + > static void wacom_poke(struct hid_device *hdev, u8 speed) > { > struct wacom_data *wdata = hid_get_drvdata(hdev); > @@ -290,6 +305,77 @@ static int wacom_gr_parse_report(struct hid_device *hdev, > #endif > return 1; > } > + > +static void wacom_i4_parse_pen_report(struct wacom_data *wdata, > + struct input_dev *input, unsigned char *data) > +{ > + __u16 x, y, pressure; > + __u32 id; > + > + switch (data[1]) { > + case 0x80: /* Out of proximity report */ > + wdata->tool = 0; > + input_report_key(input, BTN_TOUCH, 0); > + input_report_abs(input, ABS_PRESSURE, 0); > + input_report_key(input, wdata->tool, 0); > + input_sync(input); > + break; > + case 0xC2: /* Tool report */ > + id = ((data[2] << 4) | (data[3] >> 4) | > + ((data[7] & 0x0f) << 20) | > + ((data[8] & 0xf0) << 12)) & 0xfffff; > + > + switch (id) { > + case 0x802: > + wdata->tool = BTN_TOOL_PEN; > + break; > + case 0x80A: > + wdata->tool = BTN_TOOL_RUBBER; > + break; > + } > + break; > + default: /* Position/pressure report */ > + x = data[2] << 9 | data[3] << 1 | ((data[9] & 0x02) >> 1); > + y = data[4] << 9 | data[5] << 1 | (data[9] & 0x01); > + pressure = (data[6] << 3) | ((data[7] & 0xC0) >> 5) > + | (data[1] & 0x01); > + > + input_report_key(input, BTN_TOUCH, pressure > 1); > + > + input_report_key(input, BTN_STYLUS, data[1] & 0x02); > + input_report_key(input, BTN_STYLUS2, data[1] & 0x04); > + input_report_key(input, wdata->tool, 1); > + input_report_abs(input, ABS_X, x); > + input_report_abs(input, ABS_Y, y); > + input_report_abs(input, ABS_PRESSURE, pressure); > + input_sync(input); > + break; > + } > + > + return; > +} > + > +static void wacom_i4_parse_report(struct hid_device *hdev, > + struct wacom_data *wdata, > + struct input_dev *input, unsigned char *data) > +{ > + switch (data[0]) { > + case 0x00: /* Empty report */ > + break; > + case 0x02: /* Pen report */ > + wacom_i4_parse_pen_report(wdata, input, data); > + break; > + case 0x03: /* Features Report */ > + wdata->features = data[2]; > + break; > + case 0x0C: /* Button report */ > + break; > + default: > + hid_err(hdev, "Unknown report: %d,%d\n", data[0], data[1]); > + break; > + } > +} > + > static int wacom_raw_event(struct hid_device *hdev, struct hid_report > *report, > u8 *raw_data, int size) > { > @@ -297,6 +383,7 @@ static int wacom_raw_event(struct hid_device *hdev, > struct hid_report *report, > struct hid_input *hidinput; > struct input_dev *input; > unsigned char *data = (unsigned char *) raw_data; > + int i; > > if (!(hdev->claimed & HID_CLAIMED_INPUT)) > return 0; > @@ -308,7 +395,30 @@ static int wacom_raw_event(struct hid_device *hdev, > struct hid_report *report, > if (data[0] != 0x03) > return 0; > > - return wacom_gr_parse_report(hdev, wdata, input, data); > + switch (hdev->product) { > + case USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH: > + return wacom_gr_parse_report(hdev, wdata, input, data); > + break; > + case USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH: > + i = 1; > + > + switch (data[0]) { > + case 0x04: > + wacom_i4_parse_report(hdev, wdata, input, data + i); > + i += 10; > + /* fall through */ > + case 0x03: > + wacom_i4_parse_report(hdev, wdata, input, data + i); > + i += 10; > + wacom_i4_parse_report(hdev, wdata, input, data + i); > + break; > + default: > + hid_err(hdev, "Unknown report: %d,%d size:%d\n", > + data[0], data[1], size); > + return 0; > + } > + } > + return 1; > } > > static int wacom_input_mapped(struct hid_device *hdev, struct hid_input *hi, > @@ -345,10 +455,19 @@ static int wacom_input_mapped(struct hid_device *hdev, > struct hid_input *hi, > __set_bit(BTN_TOOL_RUBBER, input->keybit); > __set_bit(BTN_TOOL_MOUSE, input->keybit); > > - input_set_abs_params(input, ABS_X, 0, 16704, 4, 0); > - input_set_abs_params(input, ABS_Y, 0, 12064, 4, 0); > - input_set_abs_params(input, ABS_PRESSURE, 0, 511, 0, 0); > - input_set_abs_params(input, ABS_DISTANCE, 0, 32, 0, 0); > + switch (hdev->product) { > + case USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH: > + input_set_abs_params(input, ABS_X, 0, 16704, 4, 0); > + input_set_abs_params(input, ABS_Y, 0, 12064, 4, 0); > + input_set_abs_params(input, ABS_PRESSURE, 0, 511, 0, 0); > + input_set_abs_params(input, ABS_DISTANCE, 0, 32, 0, 0); > + break; > + case USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH: > + input_set_abs_params(input, ABS_X, 0, 40640, 4, 0); > + input_set_abs_params(input, ABS_Y, 0, 25400, 4, 0); > + input_set_abs_params(input, ABS_PRESSURE, 0, 2047, 0, 0); > + break; > + } > > return 0; > } > @@ -385,8 +504,16 @@ static int wacom_probe(struct hid_device *hdev, > hid_warn(hdev, > "can't create sysfs speed attribute err: %d\n", ret); > > - /* Set Wacom mode 2 with high reporting speed */ > - wacom_poke(hdev, 1); > + switch (hdev->product) { > + case USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH: > + /* Set Wacom mode 2 with high reporting speed */ > + wacom_poke(hdev, 1); > + break; > + case USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH: > + wdata->features = 0; > + wacom_set_features(hdev); > + break; > + } > > #ifdef CONFIG_HID_WACOM_POWER_SUPPLY > wdata->battery.properties = wacom_battery_props; > @@ -448,6 +575,7 @@ static void wacom_remove(struct hid_device *hdev) > > static const struct hid_device_id wacom_devices[] = { > { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, > USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH) }, > + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, > USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH) }, > > { } > }; > -- > 1.7.6.4 > > ------------------------------------------------------------------------------ RSA(R) Conference 2012 Save $700 by Nov 18 Register now http://p.sf.net/sfu/rsa-sfdev2dev1 _______________________________________________ Linuxwacom-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel
