Re: [PATCH] input: Add support for the Bamboo Touch trackpad

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Henrik,

Thank you for providing the MT support for Wacom's Bamboo touch only
device. Please see my comments inline.

Ping

On Sun, Aug 22, 2010 at 4:10 PM, Henrik Rydberg <rydberg@xxxxxxxxxxx> wrote:
> Add support for the Bamboo Touch trackpad, and make it work well with
> both the Synaptics X Driver and the Multitouch X Driver. The device
> uses MT slots internally, so the choice of protocol is a given.
>
> Signed-off-by: Henrik Rydberg <rydberg@xxxxxxxxxxx>
> ---
> Hi Dmitry, Ping,
>
> Here is a small patch which adds trackpad support for the Bamboo Touch. There are a couple if things to discuss:
>
> 1) It uses the MT slot protocol
> 2) It creates two input devices, but only one is useful

I would like to keep the same wacom_features and usb_device_id
wacom_ids structures for Bamboo as we did for all the other models,
i.e., we define one entry for Bamboo although there could be more than
one logical devices (touch and pen) associated with it.

This may not make a difference for your Bamboo (a touch only device).
It would make the code easy to maintain for the other Bamboos (Product
ID: 0xd1, 0xd2, 0xd3, and 0xd4).

If you are not sure what I am talking about, please let me know.

> 3) It works well with the synaptics and multitouch X drivers

I guess it depends on what the plan is for MT support in the userland.
If our goal is to make the MT X driver generic, there would be no need
to have a Wacom X drvier for MT (I'd love to go with this route). If
the MT X driver is only a way to test the kernel driver, we'll have to
discuss what to do next.

> 4) It does not work well with the wacom X driver (!)

This would not be an issue if we (as a team working in the community)
can answer item 3 above properly.

> In particular the last point may seem upsetting, but my reasoning is
> simply that the wacom X driver really supports tablets and not
> trackpads. I might be convinced otherwise. :-)

As I said earlier, I would love to see MT supported by a generic X driver.

>
> Cheers,
> Henrik
>
>  drivers/input/tablet/wacom_wac.c |   76 ++++++++++++++++++++++++++++++++++++++
>  drivers/input/tablet/wacom_wac.h |    6 +++
>  2 files changed, 82 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
> index 40d77ba..61dbd5d 100644
> --- a/drivers/input/tablet/wacom_wac.c
> +++ b/drivers/input/tablet/wacom_wac.c
> @@ -855,6 +855,52 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)
>        return retval;
>  }
>
> +static int wacom_bbt_irq(struct wacom_wac *wacom, size_t len)
> +{
> +       static int trkid;
> +       struct input_dev *input = wacom->input;
> +       unsigned char *data = wacom->data;
> +       int i, sp = 0, sx = 0, sy = 0, count = 0;
> +
> +       if (len != WACOM_PKGLEN_BBTOUCH)
> +               return 0;
> +
> +       for (i = 0; i < 2; i++) {
> +               int p = data[9 * i + 2];
> +               input_mt_slot(input, i);
> +               if (p) {
> +                       int x = get_unaligned_be16(&data[9 * i + 3]) & 0x7ff;
> +                       int y = get_unaligned_be16(&data[9 * i + 5]) & 0x7ff;
> +                       input_report_abs(input, ABS_MT_PRESSURE, p);
> +                       input_report_abs(input, ABS_MT_POSITION_X, x);
> +                       input_report_abs(input, ABS_MT_POSITION_Y, y);
> +                       if (wacom->id[i] < 0)
> +                               wacom->id[i] = trkid++ & MAX_TRACKING_ID;
> +                       if (!count++)
> +                               sp = p, sx = x, sy = y;
> +               } else {
> +                       wacom->id[i] = -1;
> +               }
> +               input_report_abs(input, ABS_MT_TRACKING_ID, wacom->id[i]);
> +       }
> +
> +       input_report_key(input, BTN_TOUCH, count > 0);
> +       input_report_key(input, BTN_TOOL_FINGER, count == 1);
> +       input_report_key(input, BTN_TOOL_DOUBLETAP, count == 2);
> +
> +       input_report_abs(input, ABS_PRESSURE, sp);
> +       input_report_abs(input, ABS_X, sx);
> +       input_report_abs(input, ABS_Y, sy);
> +
> +       input_report_key(input, BTN_LEFT, (data[1] & 0x08) != 0);
> +       input_report_key(input, BTN_MIDDLE, (data[1] & 0x06) != 0);
> +       input_report_key(input, BTN_RIGHT, (data[1] & 0x01) != 0);
> +
> +       input_sync(input);
> +
> +       return 0;
> +}
> +
>  void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
>  {
>        bool sync;
> @@ -900,6 +946,10 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
>                sync = wacom_tpc_irq(wacom_wac, len);
>                break;
>
> +       case BAMBOO_TOUCH:
> +               sync = wacom_bbt_irq(wacom_wac, len);
> +               break;
> +
>        default:
>                sync = false;
>                break;
> @@ -1076,6 +1126,22 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
>        case PENPARTNER:
>                __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
>                break;
> +
> +       case BAMBOO_TOUCH:
> +               __clear_bit(ABS_MISC, input_dev->absbit);
> +               __set_bit(BTN_LEFT, input_dev->keybit);
> +               __set_bit(BTN_MIDDLE, input_dev->keybit);
> +               __set_bit(BTN_RIGHT, input_dev->keybit);
> +
> +               __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
> +               __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
> +
> +               input_mt_create_slots(input_dev, 2);
> +               input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, features->x_max, 4, 0);
> +               input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, features->y_max, 4, 0);
> +               input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, features->pressure_max, 16, 0);
> +               input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, MAX_TRACKING_ID, 0, 0);
> +               break;
>        }
>  }
>
> @@ -1213,11 +1279,19 @@ static const struct wacom_features wacom_features_0xE3 =
>        { "Wacom ISDv4 E3",       WACOM_PKGLEN_TPC2FG,    26202, 16325,  255,  0, TABLETPC2FG };
>  static const struct wacom_features wacom_features_0x47 =
>        { "Wacom Intuos2 6x8",    WACOM_PKGLEN_INTUOS,    20320, 16240, 1023, 31, INTUOS };
> +static const struct wacom_features wacom_features_0xD0_0 =
> +       { "Wacom Bamboo Touch",   WACOM_PKGLEN_BBTOUCH,   480,  320, 255, 0, BAMBOO_TOUCH };
> +static const struct wacom_features wacom_features_0xD0_2 =
> +       { "Wacom Bamboo Boot",   WACOM_PKGLEN_BBFUN,     480,  320, 255, 0, BAMBOO_BOOT };
>
>  #define USB_DEVICE_WACOM(prod)                                 \
>        USB_DEVICE(USB_VENDOR_ID_WACOM, prod),                  \
>        .driver_info = (kernel_ulong_t)&wacom_features_##prod
>
> +#define USB_DEVICE_WACOM_PROTO(prod, pr)                               \
> +       USB_DEVICE_INTERFACE_PROTOCOL(USB_VENDOR_ID_WACOM, prod, pr),   \
> +       .driver_info = (kernel_ulong_t)&wacom_features_##prod##_##pr
> +
>  const struct usb_device_id wacom_ids[] = {
>        { USB_DEVICE_WACOM(0x00) },
>        { USB_DEVICE_WACOM(0x10) },
> @@ -1277,6 +1351,8 @@ const struct usb_device_id wacom_ids[] = {
>        { USB_DEVICE_WACOM(0xC6) },
>        { USB_DEVICE_WACOM(0xC7) },
>        { USB_DEVICE_WACOM(0xCE) },
> +       { USB_DEVICE_WACOM_PROTO(0xD0, 0) },
> +       { USB_DEVICE_WACOM_PROTO(0xD0, 2) },
>        { USB_DEVICE_WACOM(0xF0) },
>        { USB_DEVICE_WACOM(0xCC) },
>        { USB_DEVICE_WACOM(0x90) },
> diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
> index 99e1a54..770909c 100644
> --- a/drivers/input/tablet/wacom_wac.h
> +++ b/drivers/input/tablet/wacom_wac.h
> @@ -21,6 +21,7 @@
>  #define WACOM_PKGLEN_INTUOS    10
>  #define WACOM_PKGLEN_TPC1FG     5
>  #define WACOM_PKGLEN_TPC2FG    14
> +#define WACOM_PKGLEN_BBTOUCH   20
>
>  /* device IDs */
>  #define STYLUS_DEVICE_ID       0x02
> @@ -37,6 +38,9 @@
>  #define WACOM_REPORT_TPC1FG            6
>  #define WACOM_REPORT_TPC2FG            13
>
> +/* largest reported tracking id */
> +#define MAX_TRACKING_ID                        0xfff
> +
>  enum {
>        PENPARTNER = 0,
>        GRAPHIRE,
> @@ -57,6 +61,8 @@ enum {
>        WACOM_MO,
>        TABLETPC,
>        TABLETPC2FG,
> +       BAMBOO_TOUCH,
> +       BAMBOO_BOOT,
>        MAX_TYPE
>  };
>
> --
> 1.7.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-input" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux