Re: [PATCH] Input: hanwang - add support for Art Master II tablet

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

 



Hi,

On Mon, Jun 11, 2012 at 10:10:39PM +0800, weixing wrote:
> this adds support for old hanwang Art master II tablet
> 
> Signed-off-by: weixing <weixing@xxxxxxxxxxxxxx>
> ---
>  drivers/input/tablet/hanwang.c |   63 ++++++++++++++++++++++++++++++++++++++-
>  1 files changed, 61 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/input/tablet/hanwang.c b/drivers/input/tablet/hanwang.c
> index b2db3cf..4154c1d 100644
> --- a/drivers/input/tablet/hanwang.c
> +++ b/drivers/input/tablet/hanwang.c
> @@ -63,6 +63,7 @@ MODULE_LICENSE(DRIVER_LICENSE);
>  enum hanwang_tablet_type {
>  	HANWANG_ART_MASTER_III,
>  	HANWANG_ART_MASTER_HD,
> +	HANWANG_ART_MASTER_II,
>  };
>  
>  struct hanwang {
> @@ -99,6 +100,8 @@ static const struct hanwang_features features_array[] = {
>  	  ART_MASTER_PKGLEN_MAX, 0x7f00, 0x4f60, 0x3f, 0x7f, 2048 },
>  	{ 0x8401, "Hanwang Art Master HD 5012", HANWANG_ART_MASTER_HD,
>  	  ART_MASTER_PKGLEN_MAX, 0x678e, 0x4150, 0x3f, 0x7f, 1024 },
> +	{ 0x8503, "Hanwang Art Master II", HANWANG_ART_MASTER_II,
> +	  ART_MASTER_PKGLEN_MAX, 0x27de, 0x1cfe, 0x3f, 0x7f, 1024 },
>  };
>  
>  static const int hw_eventtypes[] = {
> @@ -120,6 +123,55 @@ static const int hw_mscevents[] = {
>  	MSC_SERIAL,
>  };
>  
> +static void hanwang_parse_ArtmasterII_packet(struct hanwang *hanwang)

Caps are disliked. Why don't you call it
hanwang_parse_artmaster2_packet()?

> +{
> +	unsigned char *data = hanwang->data;
> +	struct input_dev *input_dev = hanwang->dev;
> +	struct usb_device *dev = hanwang->usbdev;
> +	u16 x, y, p;
> +
> +	hanwang->current_tool = BTN_TOOL_PEN;
> +
i> +	switch (data[0]) {
> +	case 0x02:	/* correct report id */
> +		switch (data[1]) {
> +		case 0x00:	/* pen leave */
> +			hanwang->current_id = 0;
> +			input_report_key(input_dev, hanwang->current_tool, 0);
> +			break;
> +		default:
> +			hanwang->current_id = STYLUS_DEVICE_ID;
> +			x = (data[2] << 8) | data[3];
> +			y = (data[4] << 8) | data[5];
> +			p = (data[7] >> 6) | (data[6] << 2);
> +
> +			input_report_key(input_dev, BTN_TOOL_PEN, 1);
> +			input_report_abs(input_dev, ABS_X,
> +						le16_to_cpup((__le16 *)&x));
> +			input_report_abs(input_dev, ABS_Y,
> +						le16_to_cpup((__le16 *)&y));
> +			input_report_abs(input_dev, ABS_PRESSURE,
> +						le16_to_cpup((__le16 *)&p));

This does not make any sense. You first manually conver BE data to CPU
format and then you do "le16_to_cpup((__le16 *)&x" for no reason...

It looks what you need is:

			input_report_abs(input_dev, ABS_X,
					 be16_to_cpup((__be16 *)&data[2]);
			input_report_abs(input_dev, ABS_Y,
					 be16_to_cpup((__be16 *)&data[3]);
			input_report_abs(input_dev, ABS_PRESSURE,
					 (data[7] >> 6) | (data[6] << 2));

I see that the original driver has the same issue.. My bad, we need to
fix it as well.

> +			input_report_abs(input_dev, ABS_TILT_X, data[7] & 0x3f);
> +			input_report_abs(input_dev, ABS_TILT_Y, data[8] & 0x7f);
> +			input_report_key(input_dev, BTN_STYLUS2,
> +						data[1] & 0x02);
> +			break;
> +		}
> +
> +		input_report_abs(input_dev, ABS_MISC, hanwang->current_id);
> +		input_event(input_dev, EV_MSC, MSC_SERIAL,
> +				hanwang->features->pid);

Hmm, so the difference between ArtmasterII and others is that you it
does not have BTN_STYLUS, only BTN_STYLUS2 (why, BTW? I'd expect if a
device had only one button on a stylus it woudl report BTN_STYLUS, not
BTN_STYLUS2); and it sends hanwang->features->pid instead of 0xffffffff
in MSC_SERIAL. Does it have to be a separate fucntion that is 99% the
same as the original one?

Thanks.

-- 
Dmitry
--
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