[PATCH] input: mt: Add support for the Bamboo Touch trackpad
Chase Douglas
chase.douglas at canonical.com
Tue Aug 24 12:20:39 UTC 2010
On Tue, 2010-08-24 at 10:28 +0200, Henrik Rydberg 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.
>
> Suggested for Maverick.
>
> Signed-off-by: Henrik Rydberg <rydberg at euromail.se>
> ---
> 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 415f630..a59c6ce 100644
> --- a/drivers/input/tablet/wacom_wac.c
> +++ b/drivers/input/tablet/wacom_wac.c
> @@ -822,6 +822,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;
> @@ -863,6 +909,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;
> @@ -1038,6 +1088,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;
> }
> }
>
> @@ -1171,11 +1237,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) },
> @@ -1234,6 +1308,8 @@ const struct usb_device_id wacom_ids[] = {
> { USB_DEVICE_WACOM(0xC5) },
> { USB_DEVICE_WACOM(0xC6) },
> { USB_DEVICE_WACOM(0xC7) },
> + { USB_DEVICE_WACOM_PROTO(0xD0, 0) },
> + { USB_DEVICE_WACOM_PROTO(0xD0, 2) },
> { USB_DEVICE_WACOM(0xCC) },
> { USB_DEVICE_WACOM(0x90) },
> { USB_DEVICE_WACOM(0x93) },
> diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
> index 854b920..ee06350 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,
> @@ -56,6 +60,8 @@ enum {
> WACOM_MO,
> TABLETPC,
> TABLETPC2FG,
> + BAMBOO_TOUCH,
> + BAMBOO_BOOT,
> MAX_TYPE
> };
>
> --
> 1.7.1
>
>
I just tested this patch myself, and I can confirm it works with my
Bamboo Touch for two-finger multitouch (the most is provides).
Acked-by: Chase Douglas <chase.douglas at canonical.com>
More information about the kernel-team
mailing list