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

Reply via email to