2010-08-20 19:21:11 +04:00
/*
* HID driver for Waltop devices not fully compliant with HID standard
*
* Copyright ( c ) 2010 Nikolai Kondrashov
*/
/*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation ; either version 2 of the License , or ( at your option )
* any later version .
*/
# include <linux/device.h>
# include <linux/hid.h>
# include <linux/module.h>
# include "hid-ids.h"
2010-08-30 14:06:38 +04:00
/*
* There exists an official driver on the manufacturer ' s website , which
* wasn ' t submitted to the kernel , for some reason . The official driver
* doesn ' t seem to support extra features of some tablets , like wheels .
*
* It shows that the feature report ID 2 could be used to control any waltop
* tablet input mode , switching it between " default " , " tablet " and " ink " .
*
* This driver only uses " default " mode for all the supported tablets . This
* mode tries to be HID - compatible ( not very successfully ) , but cripples the
* resolution of some tablets .
*
* The " tablet " mode uses some proprietary , yet decipherable protocol , which
* represents the correct resolution , but is possibly HID - incompatible ( i . e .
* indescribable by a report descriptor ) .
*
* The purpose of the " ink " mode is unknown .
*
* The feature reports needed for switching to each mode are these :
*
* 02 16 00 default
* 02 16 01 tablet
* 02 16 02 ink
*/
2010-08-20 19:21:11 +04:00
/*
* Original Slim Tablet 5.8 inch report descriptor .
*
* All the reports except the report with ID 16 ( the stylus ) are unused ,
* possibly because the tablet is not configured to , or because they were
2010-08-30 14:06:38 +04:00
* just copied from a more capable model . The full purpose of features
* described for report ID 2 is unknown .
2010-08-20 19:21:11 +04:00
*
* The stylus buttons are described as three bit fields , whereas actually
* it ' s an " array " , i . e . they ' re reported as button numbers ( 1 , 2 and 3 ) .
* The " eraser " field is not used . There is also a " push " without a " pop " in
* the stylus description .
*
* Usage Page ( Desktop ) , ; Generic desktop controls ( 01 h )
* Usage ( Mouse ) , ; Mouse ( 02 h , application collection )
* Collection ( Application ) ,
* Report ID ( 1 ) ,
* Usage ( Pointer ) , ; Pointer ( 01 h , physical collection )
* Collection ( Physical ) ,
* Usage Page ( Button ) , ; Button ( 09 h )
* Usage Minimum ( 01 h ) ,
* Usage Maximum ( 05 h ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 1 ) ,
* Report Size ( 1 ) ,
* Report Count ( 5 ) ,
* Input ( Variable ) ,
* Report Size ( 3 ) ,
* Report Count ( 1 ) ,
* Input ( Constant , Variable ) ,
* Usage Page ( Desktop ) , ; Generic desktop controls ( 01 h )
* Usage ( X ) , ; X ( 30 h , dynamic value )
* Usage ( Y ) , ; Y ( 31 h , dynamic value )
* Usage ( Wheel ) , ; Wheel ( 38 h , dynamic value )
* Logical Minimum ( - 127 ) ,
* Logical Maximum ( 127 ) ,
* Report Size ( 8 ) ,
* Report Count ( 3 ) ,
* Input ( Variable , Relative ) ,
* End Collection ,
* End Collection ,
* Usage Page ( Digitizer ) , ; Digitizer ( 0 Dh )
* Usage ( Pen ) , ; Pen ( 02 h , application collection )
* Collection ( Application ) ,
* Report ID ( 2 ) ,
* Usage ( Stylus ) , ; Stylus ( 20 h , logical collection )
* Collection ( Physical ) ,
* Usage ( 00 h ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 255 ) ,
* Report Size ( 8 ) ,
* Report Count ( 7 ) ,
* Input ( Variable ) ,
* Usage ( Azimuth ) , ; Azimuth ( 3F h , dynamic value )
* Usage ( Altitude ) , ; Altitude ( 40 h , dynamic value )
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 255 ) ,
* Report Size ( 8 ) ,
* Report Count ( 2 ) ,
* Feature ( Variable ) ,
* End Collection ,
* Report ID ( 5 ) ,
* Usage Page ( Digitizer ) , ; Digitizer ( 0 Dh )
* Usage ( Stylus ) , ; Stylus ( 20 h , logical collection )
* Collection ( Physical ) ,
* Usage ( 00 h ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 255 ) ,
* Report Size ( 8 ) ,
* Report Count ( 7 ) ,
* Input ( Variable ) ,
* End Collection ,
* Report ID ( 10 ) ,
* Usage Page ( Digitizer ) , ; Digitizer ( 0 Dh )
* Usage ( Stylus ) , ; Stylus ( 20 h , logical collection )
* Collection ( Physical ) ,
* Usage ( 00 h ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 255 ) ,
* Report Size ( 8 ) ,
* Report Count ( 3 ) ,
* Input ( Variable ) ,
* End Collection ,
* Report ID ( 16 ) ,
* Usage ( Stylus ) , ; Stylus ( 20 h , logical collection )
* Collection ( Physical ) ,
* Usage ( Tip Switch ) , ; Tip switch ( 42 h , momentary control )
* Usage ( Barrel Switch ) , ; Barrel switch ( 44 h , momentary control )
* Usage ( Invert ) , ; Invert ( 3 Ch , momentary control )
* Usage ( Eraser ) , ; Eraser ( 45 h , momentary control )
* Usage ( In Range ) , ; In range ( 32 h , momentary control )
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 1 ) ,
* Report Size ( 1 ) ,
* Report Count ( 5 ) ,
* Input ( Variable ) ,
* Report Count ( 3 ) ,
* Input ( Constant , Variable ) ,
* Usage Page ( Desktop ) , ; Generic desktop controls ( 01 h )
* Usage ( X ) , ; X ( 30 h , dynamic value )
* Report Size ( 16 ) ,
* Report Count ( 1 ) ,
* Push ,
* Unit Exponent ( 13 ) ,
* Unit ( Inch ^ 3 ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 10000 ) ,
* Physical Minimum ( 0 ) ,
* Physical Maximum ( 10000 ) ,
* Input ( Variable ) ,
* Usage ( Y ) , ; Y ( 31 h , dynamic value )
* Logical Maximum ( 6000 ) ,
* Physical Maximum ( 6000 ) ,
* Input ( Variable ) ,
* Usage Page ( Digitizer ) , ; Digitizer ( 0 Dh )
* Usage ( Tip Pressure ) , ; Tip pressure ( 30 h , dynamic value )
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 1023 ) ,
* Physical Minimum ( 0 ) ,
* Physical Maximum ( 1023 ) ,
* Input ( Variable ) ,
* End Collection ,
* End Collection
*/
/* Size of the original report descriptor of Slim Tablet 5.8 inch */
# define SLIM_TABLET_5_8_INCH_RDESC_ORIG_SIZE 222
/*
* Fixed Slim Tablet 5.8 inch descriptor .
*
* All the reports except the stylus report ( ID 16 ) were removed as unused .
* The stylus buttons description was fixed .
*/
static __u8 slim_tablet_5_8_inch_rdesc_fixed [ ] = {
0x05 , 0x0D , /* Usage Page (Digitizer), */
0x09 , 0x02 , /* Usage (Pen), */
0xA1 , 0x01 , /* Collection (Application), */
0x85 , 0x10 , /* Report ID (16), */
0x09 , 0x20 , /* Usage (Stylus), */
0xA0 , /* Collection (Physical), */
0x09 , 0x42 , /* Usage (Tip Switch), */
0x09 , 0x44 , /* Usage (Barrel Switch), */
0x09 , 0x46 , /* Usage (Tablet Pick), */
0x15 , 0x01 , /* Logical Minimum (1), */
0x25 , 0x03 , /* Logical Maximum (3), */
0x75 , 0x04 , /* Report Size (4), */
0x95 , 0x01 , /* Report Count (1), */
0x80 , /* Input, */
0x09 , 0x32 , /* Usage (In Range), */
0x14 , /* Logical Minimum (0), */
0x25 , 0x01 , /* Logical Maximum (1), */
0x75 , 0x01 , /* Report Size (1), */
0x95 , 0x01 , /* Report Count (1), */
0x81 , 0x02 , /* Input (Variable), */
0x95 , 0x03 , /* Report Count (3), */
0x81 , 0x03 , /* Input (Constant, Variable), */
0x75 , 0x10 , /* Report Size (16), */
0x95 , 0x01 , /* Report Count (1), */
0x14 , /* Logical Minimum (0), */
0xA4 , /* Push, */
0x05 , 0x01 , /* Usage Page (Desktop), */
0x65 , 0x13 , /* Unit (Inch), */
0x55 , 0xFD , /* Unit Exponent (-3), */
0x34 , /* Physical Minimum (0), */
0x09 , 0x30 , /* Usage (X), */
0x46 , 0x88 , 0x13 , /* Physical Maximum (5000), */
0x26 , 0x10 , 0x27 , /* Logical Maximum (10000), */
0x81 , 0x02 , /* Input (Variable), */
0x09 , 0x31 , /* Usage (Y), */
0x46 , 0xB8 , 0x0B , /* Physical Maximum (3000), */
0x26 , 0x70 , 0x17 , /* Logical Maximum (6000), */
0x81 , 0x02 , /* Input (Variable), */
0xB4 , /* Pop, */
0x09 , 0x30 , /* Usage (Tip Pressure), */
0x26 , 0xFF , 0x03 , /* Logical Maximum (1023), */
0x81 , 0x02 , /* Input (Variable), */
0xC0 , /* End Collection, */
0xC0 /* End Collection */
} ;
2010-09-25 23:16:58 +04:00
/*
* Original Slim Tablet 12.1 inch report descriptor .
*
* The descriptor is similar to the Slim Tablet 5.8 inch descriptor with the
* addition of a keyboard report , seemingly unused . It may have get here
* from a Media Tablet - probably an unimplemented feature .
*
* Usage Page ( Desktop ) , ; Generic desktop controls ( 01 h )
* Usage ( Mouse ) , ; Mouse ( 02 h , application collection )
* Collection ( Application ) ,
* Report ID ( 1 ) ,
* Usage ( Pointer ) , ; Pointer ( 01 h , physical collection )
* Collection ( Physical ) ,
* Usage Page ( Button ) , ; Button ( 09 h )
* Usage Minimum ( 01 h ) ,
* Usage Maximum ( 05 h ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 1 ) ,
* Report Size ( 1 ) ,
* Report Count ( 5 ) ,
* Input ( Variable ) ,
* Report Size ( 3 ) ,
* Report Count ( 1 ) ,
* Input ( Constant , Variable ) ,
* Usage Page ( Desktop ) , ; Generic desktop controls ( 01 h )
* Usage ( X ) , ; X ( 30 h , dynamic value )
* Usage ( Y ) , ; Y ( 31 h , dynamic value )
* Usage ( Wheel ) , ; Wheel ( 38 h , dynamic value )
* Logical Minimum ( - 127 ) ,
* Logical Maximum ( 127 ) ,
* Report Size ( 8 ) ,
* Report Count ( 3 ) ,
* Input ( Variable , Relative ) ,
* End Collection ,
* End Collection ,
* Usage Page ( Digitizer ) , ; Digitizer ( 0 Dh )
* Usage ( Pen ) , ; Pen ( 02 h , application collection )
* Collection ( Application ) ,
* Report ID ( 2 ) ,
* Usage ( Stylus ) , ; Stylus ( 20 h , logical collection )
* Collection ( Physical ) ,
* Usage ( 00 h ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 255 ) ,
* Report Size ( 8 ) ,
* Report Count ( 7 ) ,
* Input ( Variable ) ,
* Usage ( Azimuth ) , ; Azimuth ( 3F h , dynamic value )
* Usage ( Altitude ) , ; Altitude ( 40 h , dynamic value )
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 255 ) ,
* Report Size ( 8 ) ,
* Report Count ( 2 ) ,
* Feature ( Variable ) ,
* End Collection ,
* Report ID ( 5 ) ,
* Usage Page ( Digitizer ) , ; Digitizer ( 0 Dh )
* Usage ( Stylus ) , ; Stylus ( 20 h , logical collection )
* Collection ( Physical ) ,
* Usage ( 00 h ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 255 ) ,
* Report Size ( 8 ) ,
* Report Count ( 7 ) ,
* Input ( Variable ) ,
* End Collection ,
* Report ID ( 10 ) ,
* Usage Page ( Digitizer ) , ; Digitizer ( 0 Dh )
* Usage ( Stylus ) , ; Stylus ( 20 h , logical collection )
* Collection ( Physical ) ,
* Usage ( 00 h ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 255 ) ,
* Report Size ( 8 ) ,
* Report Count ( 3 ) ,
* Input ( Variable ) ,
* End Collection ,
* Report ID ( 16 ) ,
* Usage ( Stylus ) , ; Stylus ( 20 h , logical collection )
* Collection ( Physical ) ,
* Usage ( Tip Switch ) , ; Tip switch ( 42 h , momentary control )
* Usage ( Barrel Switch ) , ; Barrel switch ( 44 h , momentary control )
* Usage ( Invert ) , ; Invert ( 3 Ch , momentary control )
* Usage ( Eraser ) , ; Eraser ( 45 h , momentary control )
* Usage ( In Range ) , ; In range ( 32 h , momentary control )
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 1 ) ,
* Report Size ( 1 ) ,
* Report Count ( 5 ) ,
* Input ( Variable ) ,
* Report Count ( 3 ) ,
* Input ( Constant , Variable ) ,
* Usage Page ( Desktop ) , ; Generic desktop controls ( 01 h )
* Usage ( X ) , ; X ( 30 h , dynamic value )
* Report Size ( 16 ) ,
* Report Count ( 1 ) ,
* Push ,
* Unit Exponent ( 13 ) ,
* Unit ( Inch ^ 3 ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 20000 ) ,
* Physical Minimum ( 0 ) ,
* Physical Maximum ( 20000 ) ,
* Input ( Variable ) ,
* Usage ( Y ) , ; Y ( 31 h , dynamic value )
* Logical Maximum ( 12500 ) ,
* Physical Maximum ( 12500 ) ,
* Input ( Variable ) ,
* Usage Page ( Digitizer ) , ; Digitizer ( 0 Dh )
* Usage ( Tip Pressure ) , ; Tip pressure ( 30 h , dynamic value )
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 1023 ) ,
* Physical Minimum ( 0 ) ,
* Physical Maximum ( 1023 ) ,
* Input ( Variable ) ,
* End Collection ,
* End Collection ,
* Usage Page ( Desktop ) , ; Generic desktop controls ( 01 h )
* Usage ( Keyboard ) , ; Keyboard ( 06 h , application collection )
* Collection ( Application ) ,
* Report ID ( 13 ) ,
* Usage Page ( Keyboard ) , ; Keyboard / keypad ( 07 h )
* Usage Minimum ( KB Leftcontrol ) , ; Keyboard left control
* ; ( E0h , dynamic value )
* Usage Maximum ( KB Right GUI ) , ; Keyboard right GUI ( E7h , dynamic value )
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 1 ) ,
* Report Size ( 1 ) ,
* Report Count ( 8 ) ,
* Input ( Variable ) ,
* Report Size ( 8 ) ,
* Report Count ( 1 ) ,
* Input ( Constant ) ,
* Usage Page ( Keyboard ) , ; Keyboard / keypad ( 07 h )
* Usage Minimum ( None ) , ; No event ( 00 h , selector )
* Usage Maximum ( KB Application ) , ; Keyboard Application ( 65 h , selector )
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 101 ) ,
* Report Size ( 8 ) ,
* Report Count ( 5 ) ,
* Input ,
* End Collection
*/
/* Size of the original report descriptor of Slim Tablet 12.1 inch */
# define SLIM_TABLET_12_1_INCH_RDESC_ORIG_SIZE 269
/*
* Fixed Slim Tablet 12.1 inch descriptor .
*
* All the reports except the stylus report ( ID 16 ) were removed as unused .
* The stylus buttons description was fixed .
*/
static __u8 slim_tablet_12_1_inch_rdesc_fixed [ ] = {
0x05 , 0x0D , /* Usage Page (Digitizer), */
0x09 , 0x02 , /* Usage (Pen), */
0xA1 , 0x01 , /* Collection (Application), */
0x85 , 0x10 , /* Report ID (16), */
0x09 , 0x20 , /* Usage (Stylus), */
0xA0 , /* Collection (Physical), */
0x09 , 0x42 , /* Usage (Tip Switch), */
0x09 , 0x44 , /* Usage (Barrel Switch), */
0x09 , 0x46 , /* Usage (Tablet Pick), */
0x15 , 0x01 , /* Logical Minimum (1), */
0x25 , 0x03 , /* Logical Maximum (3), */
0x75 , 0x04 , /* Report Size (4), */
0x95 , 0x01 , /* Report Count (1), */
0x80 , /* Input, */
0x09 , 0x32 , /* Usage (In Range), */
0x14 , /* Logical Minimum (0), */
0x25 , 0x01 , /* Logical Maximum (1), */
0x75 , 0x01 , /* Report Size (1), */
0x95 , 0x01 , /* Report Count (1), */
0x81 , 0x02 , /* Input (Variable), */
0x95 , 0x03 , /* Report Count (3), */
0x81 , 0x03 , /* Input (Constant, Variable), */
0x75 , 0x10 , /* Report Size (16), */
0x95 , 0x01 , /* Report Count (1), */
0x14 , /* Logical Minimum (0), */
0xA4 , /* Push, */
0x05 , 0x01 , /* Usage Page (Desktop), */
0x65 , 0x13 , /* Unit (Inch), */
0x55 , 0xFD , /* Unit Exponent (-3), */
0x34 , /* Physical Minimum (0), */
0x09 , 0x30 , /* Usage (X), */
0x46 , 0x10 , 0x27 , /* Physical Maximum (10000), */
0x26 , 0x20 , 0x4E , /* Logical Maximum (20000), */
0x81 , 0x02 , /* Input (Variable), */
0x09 , 0x31 , /* Usage (Y), */
0x46 , 0x6A , 0x18 , /* Physical Maximum (6250), */
0x26 , 0xD4 , 0x30 , /* Logical Maximum (12500), */
0x81 , 0x02 , /* Input (Variable), */
0xB4 , /* Pop, */
0x09 , 0x30 , /* Usage (Tip Pressure), */
0x26 , 0xFF , 0x03 , /* Logical Maximum (1023), */
0x81 , 0x02 , /* Input (Variable), */
0xC0 , /* End Collection, */
0xC0 /* End Collection */
} ;
2010-08-20 19:21:11 +04:00
/*
* Original Media Tablet 10.6 inch report descriptor .
*
* There are at least two versions of this model in the wild . They are
* represented by Genius G - Pen M609 ( older version ) and Genius G - Pen M609X
* ( newer version ) .
*
* Both versions have the usual pen with two barrel buttons and two
* identical wheels with center buttons in the top corners of the tablet
* base . They also have buttons on the top , between the wheels , for
* selecting the wheels ' functions and wide / standard mode . In the wide mode
* the whole working surface is sensed , in the standard mode a narrower area
* is sensed , but the logical report extents remain the same . These modes
* correspond roughly to 16 : 9 and 4 : 3 aspect ratios respectively .
*
* The older version has three wheel function buttons ( " scroll " , " zoom " and
* " volume " ) and two separate buttons for wide and standard mode . The newer
* version has four wheel function buttons ( plus " brush " ) and only one
* button is used for selecting wide / standard mode . So , the total number of
* buttons remains the same , but one of the mode buttons is repurposed as a
* wheels ' function button in the newer version .
*
* The wheel functions are :
2010-08-30 14:06:35 +04:00
* scroll - the wheels act as scroll wheels , the center buttons switch
* between vertical and horizontal scrolling ;
* zoom - the wheels zoom in / out , the buttons supposedly reset to 100 % ;
* volume - the wheels control the sound volume , the buttons mute ;
2010-08-20 19:21:11 +04:00
* brush - the wheels are supposed to control brush width in a graphics
* editor , the buttons do nothing .
*
* Below is the newer version ' s report descriptor . It may very well be that
* the older version ' s descriptor is different and thus it won ' t be
* supported .
*
* The mouse report ( ID 1 ) only uses the wheel field for reporting the tablet
* wheels ' scroll mode . The keyboard report ( ID 13 ) is used to report the
* wheels ' zoom and brush control functions as key presses . The report ID 12
* is used to report the wheels ' volume control functions . The stylus report
* ( ID 16 ) has the same problems as the Slim Tablet 5.8 inch report has .
*
* The rest of the reports are unused , at least in the default configuration .
* The purpose of the features is unknown .
*
* Usage Page ( Desktop ) ,
* Usage ( Mouse ) ,
* Collection ( Application ) ,
* Report ID ( 1 ) ,
* Usage ( Pointer ) ,
* Collection ( Physical ) ,
* Usage Page ( Button ) ,
* Usage Minimum ( 01 h ) ,
* Usage Maximum ( 05 h ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 1 ) ,
* Report Size ( 1 ) ,
* Report Count ( 5 ) ,
* Input ( Variable ) ,
* Report Size ( 3 ) ,
* Report Count ( 1 ) ,
* Input ( Constant , Variable ) ,
* Usage Page ( Desktop ) ,
* Usage ( X ) ,
* Usage ( Y ) ,
* Usage ( Wheel ) ,
* Logical Minimum ( - 127 ) ,
* Logical Maximum ( 127 ) ,
* Report Size ( 8 ) ,
* Report Count ( 3 ) ,
* Input ( Variable , Relative ) ,
* End Collection ,
* End Collection ,
* Usage Page ( Digitizer ) ,
* Usage ( Pen ) ,
* Collection ( Application ) ,
* Report ID ( 2 ) ,
* Usage ( Stylus ) ,
* Collection ( Physical ) ,
* Usage ( 00 h ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 255 ) ,
* Report Size ( 8 ) ,
* Report Count ( 7 ) ,
* Input ( Variable ) ,
* Usage ( Azimuth ) ,
* Usage ( Altitude ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 255 ) ,
* Report Size ( 8 ) ,
* Report Count ( 2 ) ,
* Feature ( Variable ) ,
* End Collection ,
* Report ID ( 5 ) ,
* Usage Page ( Digitizer ) ,
* Usage ( Stylus ) ,
* Collection ( Physical ) ,
* Usage ( 00 h ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 255 ) ,
* Report Size ( 8 ) ,
* Report Count ( 7 ) ,
* Input ( Variable ) ,
* End Collection ,
* Report ID ( 10 ) ,
* Usage Page ( Digitizer ) ,
* Usage ( Stylus ) ,
* Collection ( Physical ) ,
* Usage ( 00 h ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 255 ) ,
* Report Size ( 8 ) ,
* Report Count ( 7 ) ,
* Input ( Variable ) ,
* End Collection ,
* Report ID ( 16 ) ,
* Usage ( Stylus ) ,
* Collection ( Physical ) ,
* Usage ( Tip Switch ) ,
* Usage ( Barrel Switch ) ,
* Usage ( Invert ) ,
* Usage ( Eraser ) ,
* Usage ( In Range ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 1 ) ,
* Report Size ( 1 ) ,
* Report Count ( 5 ) ,
* Input ( Variable ) ,
* Report Count ( 3 ) ,
* Input ( Constant , Variable ) ,
* Usage Page ( Desktop ) ,
* Usage ( X ) ,
* Report Size ( 16 ) ,
* Report Count ( 1 ) ,
* Push ,
* Unit Exponent ( 13 ) ,
* Unit ( Inch ^ 3 ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 18000 ) ,
* Physical Minimum ( 0 ) ,
* Physical Maximum ( 18000 ) ,
* Input ( Variable ) ,
* Usage ( Y ) ,
* Logical Maximum ( 11000 ) ,
* Physical Maximum ( 11000 ) ,
* Input ( Variable ) ,
* Usage Page ( Digitizer ) ,
* Usage ( Tip Pressure ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 1023 ) ,
* Physical Minimum ( 0 ) ,
* Physical Maximum ( 1023 ) ,
* Input ( Variable ) ,
* End Collection ,
* End Collection ,
* Usage Page ( Desktop ) ,
* Usage ( Keyboard ) ,
* Collection ( Application ) ,
* Report ID ( 13 ) ,
* Usage Page ( Keyboard ) ,
* Usage Minimum ( KB Leftcontrol ) ,
* Usage Maximum ( KB Right GUI ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 1 ) ,
* Report Size ( 1 ) ,
* Report Count ( 8 ) ,
* Input ( Variable ) ,
* Report Size ( 8 ) ,
* Report Count ( 1 ) ,
* Input ( Constant ) ,
* Usage Page ( Keyboard ) ,
* Usage Minimum ( None ) ,
* Usage Maximum ( KB Application ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 101 ) ,
* Report Size ( 8 ) ,
* Report Count ( 5 ) ,
* Input ,
* End Collection ,
* Usage Page ( Consumer ) ,
* Usage ( Consumer Control ) ,
* Collection ( Application ) ,
* Report ID ( 12 ) ,
* Usage ( Volume Inc ) ,
* Usage ( Volume Dec ) ,
* Usage ( Mute ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 1 ) ,
* Report Size ( 1 ) ,
* Report Count ( 3 ) ,
* Input ( Variable , Relative ) ,
* Report Size ( 5 ) ,
* Report Count ( 1 ) ,
* Input ( Constant , Variable , Relative ) ,
* End Collection
*/
/* Size of the original report descriptor of Media Tablet 10.6 inch */
# define MEDIA_TABLET_10_6_INCH_RDESC_ORIG_SIZE 300
/*
* Fixed Media Tablet 10.6 inch descriptor .
*
* The descriptions of reports unused in the default configuration are
* removed . The stylus report ( ID 16 ) is fixed similarly to Slim Tablet 5.8
* inch . The unused mouse report ( ID 1 ) fields are replaced with constant
* padding .
*
* The keyboard report ( ID 13 ) is hacked to instead have an " array " field
* reporting consumer page controls , and all the unused bits are masked out
* with constant padding . The " brush " wheels ' function is represented as " Scan
* Previous / Next Track " controls due to the lack of brush controls in the
* usage tables specification .
*/
static __u8 media_tablet_10_6_inch_rdesc_fixed [ ] = {
0x05 , 0x0D , /* Usage Page (Digitizer), */
0x09 , 0x02 , /* Usage (Pen), */
0xA1 , 0x01 , /* Collection (Application), */
0x85 , 0x10 , /* Report ID (16), */
0x09 , 0x20 , /* Usage (Stylus), */
0xA0 , /* Collection (Physical), */
0x09 , 0x42 , /* Usage (Tip Switch), */
0x09 , 0x44 , /* Usage (Barrel Switch), */
0x09 , 0x46 , /* Usage (Tablet Pick), */
0x15 , 0x01 , /* Logical Minimum (1), */
0x25 , 0x03 , /* Logical Maximum (3), */
0x75 , 0x04 , /* Report Size (4), */
0x95 , 0x01 , /* Report Count (1), */
0x80 , /* Input, */
0x75 , 0x01 , /* Report Size (1), */
0x09 , 0x32 , /* Usage (In Range), */
0x14 , /* Logical Minimum (0), */
0x25 , 0x01 , /* Logical Maximum (1), */
0x95 , 0x01 , /* Report Count (1), */
0x81 , 0x02 , /* Input (Variable), */
0x95 , 0x03 , /* Report Count (3), */
0x81 , 0x03 , /* Input (Constant, Variable), */
0x75 , 0x10 , /* Report Size (16), */
0x95 , 0x01 , /* Report Count (1), */
0x14 , /* Logical Minimum (0), */
0xA4 , /* Push, */
0x05 , 0x01 , /* Usage Page (Desktop), */
0x65 , 0x13 , /* Unit (Inch), */
0x55 , 0xFD , /* Unit Exponent (-3), */
0x34 , /* Physical Minimum (0), */
0x09 , 0x30 , /* Usage (X), */
0x46 , 0x28 , 0x23 , /* Physical Maximum (9000), */
0x26 , 0x50 , 0x46 , /* Logical Maximum (18000), */
0x81 , 0x02 , /* Input (Variable), */
0x09 , 0x31 , /* Usage (Y), */
0x46 , 0x7C , 0x15 , /* Physical Maximum (5500), */
0x26 , 0xF8 , 0x2A , /* Logical Maximum (11000), */
0x81 , 0x02 , /* Input (Variable), */
0xB4 , /* Pop, */
0x09 , 0x30 , /* Usage (Tip Pressure), */
0x26 , 0xFF , 0x03 , /* Logical Maximum (1023), */
0x81 , 0x02 , /* Input (Variable), */
0xC0 , /* End Collection, */
0xC0 , /* End Collection, */
0x05 , 0x01 , /* Usage Page (Desktop), */
0x09 , 0x02 , /* Usage (Mouse), */
0xA1 , 0x01 , /* Collection (Application), */
0x85 , 0x01 , /* Report ID (1), */
0x09 , 0x01 , /* Usage (Pointer), */
0xA0 , /* Collection (Physical), */
2010-08-30 14:06:35 +04:00
0x75 , 0x08 , /* Report Size (8), */
0x95 , 0x03 , /* Report Count (3), */
2010-08-20 19:21:11 +04:00
0x81 , 0x03 , /* Input (Constant, Variable), */
2010-08-30 14:06:35 +04:00
0x95 , 0x02 , /* Report Count (2), */
2010-08-20 19:21:11 +04:00
0x15 , 0xFF , /* Logical Minimum (-1), */
0x25 , 0x01 , /* Logical Maximum (1), */
2010-08-30 14:06:35 +04:00
0x09 , 0x38 , /* Usage (Wheel), */
0x0B , 0x38 , 0x02 , /* Usage (Consumer AC Pan), */
0x0C , 0x00 ,
2010-08-20 19:21:11 +04:00
0x81 , 0x06 , /* Input (Variable, Relative), */
2010-08-30 14:06:35 +04:00
0x95 , 0x02 , /* Report Count (2), */
2010-08-20 19:21:11 +04:00
0x81 , 0x03 , /* Input (Constant, Variable), */
0xC0 , /* End Collection, */
0xC0 , /* End Collection, */
0x05 , 0x0C , /* Usage Page (Consumer), */
0x09 , 0x01 , /* Usage (Consumer Control), */
0xA1 , 0x01 , /* Collection (Application), */
0x85 , 0x0D , /* Report ID (13), */
0x95 , 0x01 , /* Report Count (1), */
0x75 , 0x10 , /* Report Size (16), */
0x81 , 0x03 , /* Input (Constant, Variable), */
0x0A , 0x2F , 0x02 , /* Usage (AC Zoom), */
0x0A , 0x2E , 0x02 , /* Usage (AC Zoom Out), */
0x0A , 0x2D , 0x02 , /* Usage (AC Zoom In), */
0x09 , 0xB6 , /* Usage (Scan Previous Track), */
0x09 , 0xB5 , /* Usage (Scan Next Track), */
2010-08-30 14:06:37 +04:00
0x08 , /* Usage (00h), */
0x08 , /* Usage (00h), */
0x08 , /* Usage (00h), */
0x08 , /* Usage (00h), */
0x08 , /* Usage (00h), */
0x0A , 0x2E , 0x02 , /* Usage (AC Zoom Out), */
0x0A , 0x2D , 0x02 , /* Usage (AC Zoom In), */
0x15 , 0x0C , /* Logical Minimum (12), */
0x25 , 0x17 , /* Logical Maximum (23), */
0x75 , 0x05 , /* Report Size (5), */
2010-08-20 19:21:11 +04:00
0x80 , /* Input, */
2010-08-30 14:06:37 +04:00
0x75 , 0x03 , /* Report Size (3), */
0x81 , 0x03 , /* Input (Constant, Variable), */
2010-08-20 19:21:11 +04:00
0x75 , 0x20 , /* Report Size (32), */
0x81 , 0x03 , /* Input (Constant, Variable), */
0xC0 , /* End Collection, */
0x09 , 0x01 , /* Usage (Consumer Control), */
0xA1 , 0x01 , /* Collection (Application), */
0x85 , 0x0C , /* Report ID (12), */
0x75 , 0x01 , /* Report Size (1), */
0x09 , 0xE9 , /* Usage (Volume Inc), */
0x09 , 0xEA , /* Usage (Volume Dec), */
0x09 , 0xE2 , /* Usage (Mute), */
0x14 , /* Logical Minimum (0), */
0x25 , 0x01 , /* Logical Maximum (1), */
0x95 , 0x03 , /* Report Count (3), */
0x81 , 0x06 , /* Input (Variable, Relative), */
0x95 , 0x35 , /* Report Count (53), */
0x81 , 0x03 , /* Input (Constant, Variable), */
0xC0 /* End Collection */
} ;
2010-08-30 14:06:36 +04:00
/*
* Original Media Tablet 14.1 inch report descriptor .
*
* There are at least two versions of this model in the wild . They are
* represented by Genius G - Pen M712 ( older version ) and Genius G - Pen M712X
* ( newer version ) . The hardware difference between these versions is the same
* as between older and newer versions of Media Tablet 10.6 inch . The report
* descriptors are identical for both versions .
*
* The function , behavior and report descriptor of this tablet is similar to
* that of Media Tablet 10.6 inch . However , there is one more field ( with
* Consumer AC Pan usage ) in the mouse description . Then the tablet X and Y
* logical extents both get scaled to 0. .16383 range ( a hardware limit ? ) ,
* which kind of defeats the advertised 4000 LPI resolution , considering the
* physical extents of 12 x7 .25 inches . Plus , reports 5 , 10 and 255 are used
* sometimes ( while moving the pen ) with unknown purpose . Also , the key codes
* generated for zoom in / out are different .
*
* Usage Page ( Desktop ) ,
* Usage ( Mouse ) ,
* Collection ( Application ) ,
* Report ID ( 1 ) ,
* Usage ( Pointer ) ,
* Collection ( Physical ) ,
* Usage Page ( Button ) ,
* Usage Minimum ( 01 h ) ,
* Usage Maximum ( 05 h ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 1 ) ,
* Report Size ( 1 ) ,
* Report Count ( 5 ) ,
* Input ( Variable ) ,
* Report Size ( 3 ) ,
* Report Count ( 1 ) ,
* Input ( Constant , Variable ) ,
* Usage Page ( Desktop ) ,
* Usage ( X ) ,
* Usage ( Y ) ,
* Usage ( Wheel ) ,
* Logical Minimum ( - 127 ) ,
* Logical Maximum ( 127 ) ,
* Report Size ( 8 ) ,
* Report Count ( 3 ) ,
* Input ( Variable , Relative ) ,
* Usage Page ( Consumer ) ,
* Logical Minimum ( - 127 ) ,
* Logical Maximum ( 127 ) ,
* Report Size ( 8 ) ,
* Report Count ( 1 ) ,
* Usage ( AC Pan ) ,
* Input ( Variable , Relative ) ,
* End Collection ,
* End Collection ,
* Usage Page ( Digitizer ) ,
* Usage ( Pen ) ,
* Collection ( Application ) ,
* Report ID ( 2 ) ,
* Usage ( Stylus ) ,
* Collection ( Physical ) ,
* Usage ( 00 h ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 255 ) ,
* Report Size ( 8 ) ,
* Report Count ( 7 ) ,
* Input ( Variable ) ,
* Usage ( Azimuth ) ,
* Usage ( Altitude ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 255 ) ,
* Report Size ( 8 ) ,
* Report Count ( 2 ) ,
* Feature ( Variable ) ,
* End Collection ,
* Report ID ( 5 ) ,
* Usage Page ( Digitizer ) ,
* Usage ( Stylus ) ,
* Collection ( Physical ) ,
* Usage ( 00 h ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 255 ) ,
* Report Size ( 8 ) ,
* Report Count ( 7 ) ,
* Input ( Variable ) ,
* End Collection ,
* Report ID ( 10 ) ,
* Usage Page ( Digitizer ) ,
* Usage ( Stylus ) ,
* Collection ( Physical ) ,
* Usage ( 00 h ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 255 ) ,
* Report Size ( 8 ) ,
* Report Count ( 7 ) ,
* Input ( Variable ) ,
* End Collection ,
* Report ID ( 16 ) ,
* Usage ( Stylus ) ,
* Collection ( Physical ) ,
* Usage ( Tip Switch ) ,
* Usage ( Barrel Switch ) ,
* Usage ( Invert ) ,
* Usage ( Eraser ) ,
* Usage ( In Range ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 1 ) ,
* Report Size ( 1 ) ,
* Report Count ( 5 ) ,
* Input ( Variable ) ,
* Report Count ( 3 ) ,
* Input ( Constant , Variable ) ,
* Usage Page ( Desktop ) ,
* Usage ( X ) ,
* Report Size ( 16 ) ,
* Report Count ( 1 ) ,
* Push ,
* Unit Exponent ( 13 ) ,
* Unit ( Inch ^ 3 ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 16383 ) ,
* Physical Minimum ( 0 ) ,
* Physical Maximum ( 16383 ) ,
* Input ( Variable ) ,
* Usage ( Y ) ,
* Input ( Variable ) ,
* Usage Page ( Digitizer ) ,
* Usage ( Tip Pressure ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 1023 ) ,
* Physical Minimum ( 0 ) ,
* Physical Maximum ( 1023 ) ,
* Input ( Variable ) ,
* End Collection ,
* End Collection ,
* Usage Page ( Desktop ) ,
* Usage ( Keyboard ) ,
* Collection ( Application ) ,
* Report ID ( 13 ) ,
* Usage Page ( Keyboard ) ,
* Usage Minimum ( KB Leftcontrol ) ,
* Usage Maximum ( KB Right GUI ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 1 ) ,
* Report Size ( 1 ) ,
* Report Count ( 8 ) ,
* Input ( Variable ) ,
* Report Size ( 8 ) ,
* Report Count ( 1 ) ,
* Input ( Constant ) ,
* Usage Page ( Keyboard ) ,
* Usage Minimum ( None ) ,
* Usage Maximum ( KB Application ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 101 ) ,
* Report Size ( 8 ) ,
* Report Count ( 5 ) ,
* Input ,
* End Collection ,
* Usage Page ( Consumer ) ,
* Usage ( Consumer Control ) ,
* Collection ( Application ) ,
* Report ID ( 12 ) ,
* Usage ( Volume Inc ) ,
* Usage ( Volume Dec ) ,
* Usage ( Mute ) ,
* Logical Minimum ( 0 ) ,
* Logical Maximum ( 1 ) ,
* Report Size ( 1 ) ,
* Report Count ( 3 ) ,
* Input ( Variable , Relative ) ,
* Report Size ( 5 ) ,
* Report Count ( 1 ) ,
* Input ( Constant , Variable , Relative ) ,
* End Collection
*/
/* Size of the original report descriptor of Media Tablet 14.1 inch */
# define MEDIA_TABLET_14_1_INCH_RDESC_ORIG_SIZE 309
/*
* Fixed Media Tablet 14.1 inch descriptor .
* It is fixed similarly to the Media Tablet 10.6 inch descriptor .
*/
static __u8 media_tablet_14_1_inch_rdesc_fixed [ ] = {
0x05 , 0x0D , /* Usage Page (Digitizer), */
0x09 , 0x02 , /* Usage (Pen), */
0xA1 , 0x01 , /* Collection (Application), */
0x85 , 0x10 , /* Report ID (16), */
0x09 , 0x20 , /* Usage (Stylus), */
0xA0 , /* Collection (Physical), */
0x09 , 0x42 , /* Usage (Tip Switch), */
0x09 , 0x44 , /* Usage (Barrel Switch), */
0x09 , 0x46 , /* Usage (Tablet Pick), */
0x15 , 0x01 , /* Logical Minimum (1), */
0x25 , 0x03 , /* Logical Maximum (3), */
0x75 , 0x04 , /* Report Size (4), */
0x95 , 0x01 , /* Report Count (1), */
0x80 , /* Input, */
0x75 , 0x01 , /* Report Size (1), */
0x09 , 0x32 , /* Usage (In Range), */
0x14 , /* Logical Minimum (0), */
0x25 , 0x01 , /* Logical Maximum (1), */
0x95 , 0x01 , /* Report Count (1), */
0x81 , 0x02 , /* Input (Variable), */
0x95 , 0x03 , /* Report Count (3), */
0x81 , 0x03 , /* Input (Constant, Variable), */
0x75 , 0x10 , /* Report Size (16), */
0x95 , 0x01 , /* Report Count (1), */
0x14 , /* Logical Minimum (0), */
0xA4 , /* Push, */
0x05 , 0x01 , /* Usage Page (Desktop), */
0x65 , 0x13 , /* Unit (Inch), */
0x55 , 0xFD , /* Unit Exponent (-3), */
0x34 , /* Physical Minimum (0), */
0x09 , 0x30 , /* Usage (X), */
0x46 , 0xE0 , 0x2E , /* Physical Maximum (12000), */
0x26 , 0xFF , 0x3F , /* Logical Maximum (16383), */
0x81 , 0x02 , /* Input (Variable), */
0x09 , 0x31 , /* Usage (Y), */
0x46 , 0x52 , 0x1C , /* Physical Maximum (7250), */
0x26 , 0xFF , 0x3F , /* Logical Maximum (16383), */
0x81 , 0x02 , /* Input (Variable), */
0xB4 , /* Pop, */
0x09 , 0x30 , /* Usage (Tip Pressure), */
0x26 , 0xFF , 0x03 , /* Logical Maximum (1023), */
0x81 , 0x02 , /* Input (Variable), */
0xC0 , /* End Collection, */
0xC0 , /* End Collection, */
0x05 , 0x01 , /* Usage Page (Desktop), */
0x09 , 0x02 , /* Usage (Mouse), */
0xA1 , 0x01 , /* Collection (Application), */
0x85 , 0x01 , /* Report ID (1), */
0x09 , 0x01 , /* Usage (Pointer), */
0xA0 , /* Collection (Physical), */
0x75 , 0x08 , /* Report Size (8), */
0x95 , 0x03 , /* Report Count (3), */
0x81 , 0x03 , /* Input (Constant, Variable), */
0x95 , 0x02 , /* Report Count (2), */
0x15 , 0xFF , /* Logical Minimum (-1), */
0x25 , 0x01 , /* Logical Maximum (1), */
0x09 , 0x38 , /* Usage (Wheel), */
0x0B , 0x38 , 0x02 , /* Usage (Consumer AC Pan), */
0x0C , 0x00 ,
0x81 , 0x06 , /* Input (Variable, Relative), */
0xC0 , /* End Collection, */
0xC0 , /* End Collection, */
0x05 , 0x0C , /* Usage Page (Consumer), */
0x09 , 0x01 , /* Usage (Consumer Control), */
0xA1 , 0x01 , /* Collection (Application), */
0x85 , 0x0D , /* Report ID (13), */
0x95 , 0x01 , /* Report Count (1), */
0x75 , 0x10 , /* Report Size (16), */
0x81 , 0x03 , /* Input (Constant, Variable), */
0x0A , 0x2F , 0x02 , /* Usage (AC Zoom), */
0x0A , 0x2E , 0x02 , /* Usage (AC Zoom Out), */
0x0A , 0x2D , 0x02 , /* Usage (AC Zoom In), */
0x09 , 0xB6 , /* Usage (Scan Previous Track), */
0x09 , 0xB5 , /* Usage (Scan Next Track), */
0x08 , /* Usage (00h), */
0x08 , /* Usage (00h), */
0x08 , /* Usage (00h), */
0x08 , /* Usage (00h), */
0x08 , /* Usage (00h), */
0x0A , 0x2E , 0x02 , /* Usage (AC Zoom Out), */
0x0A , 0x2D , 0x02 , /* Usage (AC Zoom In), */
0x15 , 0x0C , /* Logical Minimum (12), */
0x25 , 0x17 , /* Logical Maximum (23), */
0x75 , 0x05 , /* Report Size (5), */
0x80 , /* Input, */
0x75 , 0x03 , /* Report Size (3), */
0x81 , 0x03 , /* Input (Constant, Variable), */
0x75 , 0x20 , /* Report Size (32), */
0x81 , 0x03 , /* Input (Constant, Variable), */
0xC0 , /* End Collection, */
0x09 , 0x01 , /* Usage (Consumer Control), */
0xA1 , 0x01 , /* Collection (Application), */
0x85 , 0x0C , /* Report ID (12), */
0x75 , 0x01 , /* Report Size (1), */
0x09 , 0xE9 , /* Usage (Volume Inc), */
0x09 , 0xEA , /* Usage (Volume Dec), */
0x09 , 0xE2 , /* Usage (Mute), */
0x14 , /* Logical Minimum (0), */
0x25 , 0x01 , /* Logical Maximum (1), */
0x95 , 0x03 , /* Report Count (3), */
0x81 , 0x06 , /* Input (Variable, Relative), */
0x75 , 0x05 , /* Report Size (5), */
0x81 , 0x03 , /* Input (Constant, Variable), */
0xC0 /* End Collection */
} ;
2010-08-20 19:21:11 +04:00
static __u8 * waltop_report_fixup ( struct hid_device * hdev , __u8 * rdesc ,
unsigned int * rsize )
{
switch ( hdev - > product ) {
case USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH :
if ( * rsize = = SLIM_TABLET_5_8_INCH_RDESC_ORIG_SIZE ) {
rdesc = slim_tablet_5_8_inch_rdesc_fixed ;
* rsize = sizeof ( slim_tablet_5_8_inch_rdesc_fixed ) ;
}
break ;
2010-09-25 23:16:58 +04:00
case USB_DEVICE_ID_WALTOP_SLIM_TABLET_12_1_INCH :
if ( * rsize = = SLIM_TABLET_12_1_INCH_RDESC_ORIG_SIZE ) {
rdesc = slim_tablet_12_1_inch_rdesc_fixed ;
* rsize = sizeof ( slim_tablet_12_1_inch_rdesc_fixed ) ;
}
break ;
2010-08-20 19:21:11 +04:00
case USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH :
if ( * rsize = = MEDIA_TABLET_10_6_INCH_RDESC_ORIG_SIZE ) {
rdesc = media_tablet_10_6_inch_rdesc_fixed ;
* rsize = sizeof ( media_tablet_10_6_inch_rdesc_fixed ) ;
}
break ;
2010-08-30 14:06:36 +04:00
case USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH :
if ( * rsize = = MEDIA_TABLET_14_1_INCH_RDESC_ORIG_SIZE ) {
rdesc = media_tablet_14_1_inch_rdesc_fixed ;
* rsize = sizeof ( media_tablet_14_1_inch_rdesc_fixed ) ;
}
break ;
2010-08-20 19:21:11 +04:00
}
return rdesc ;
}
static const struct hid_device_id waltop_devices [ ] = {
{ HID_USB_DEVICE ( USB_VENDOR_ID_WALTOP ,
USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH ) } ,
2010-09-25 23:16:58 +04:00
{ HID_USB_DEVICE ( USB_VENDOR_ID_WALTOP ,
USB_DEVICE_ID_WALTOP_SLIM_TABLET_12_1_INCH ) } ,
2010-08-20 19:21:11 +04:00
{ HID_USB_DEVICE ( USB_VENDOR_ID_WALTOP ,
USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH ) } ,
2010-08-30 14:06:36 +04:00
{ HID_USB_DEVICE ( USB_VENDOR_ID_WALTOP ,
USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH ) } ,
2010-08-20 19:21:11 +04:00
{ }
} ;
MODULE_DEVICE_TABLE ( hid , waltop_devices ) ;
static struct hid_driver waltop_driver = {
. name = " waltop " ,
. id_table = waltop_devices ,
. report_fixup = waltop_report_fixup ,
} ;
static int __init waltop_init ( void )
{
return hid_register_driver ( & waltop_driver ) ;
}
static void __exit waltop_exit ( void )
{
hid_unregister_driver ( & waltop_driver ) ;
}
module_init ( waltop_init ) ;
module_exit ( waltop_exit ) ;
MODULE_LICENSE ( " GPL " ) ;