Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
57d52f67
Commit
57d52f67
authored
Feb 11, 2002
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
http://linuxusb.bkbits.net/linus-2.5
into home.transmeta.com:/home/torvalds/v2.5/linux
parents
0f739278
d96835d3
Changes
9
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
724 additions
and
405 deletions
+724
-405
drivers/usb/hid-core.c
drivers/usb/hid-core.c
+402
-229
drivers/usb/hid-debug.h
drivers/usb/hid-debug.h
+156
-7
drivers/usb/hid-input.c
drivers/usb/hid-input.c
+46
-11
drivers/usb/hid.h
drivers/usb/hid.h
+54
-101
drivers/usb/hiddev.c
drivers/usb/hiddev.c
+2
-2
drivers/usb/pegasus.h
drivers/usb/pegasus.h
+8
-0
drivers/usb/usbkbd.c
drivers/usb/usbkbd.c
+24
-26
drivers/usb/usbmouse.c
drivers/usb/usbmouse.c
+16
-17
drivers/usb/wacom.c
drivers/usb/wacom.c
+16
-12
No files found.
drivers/usb/hid-core.c
View file @
57d52f67
This diff is collapsed.
Click to expand it.
drivers/usb/hid-debug.h
View file @
57d52f67
/*
* $Id: hid-debug.h,v 1.
3 2001/05/10 15:56:0
7 vojtech Exp $
* $Id: hid-debug.h,v 1.
8 2001/09/25 09:37:5
7 vojtech Exp $
*
* (c) 1999 Andreas Gal <gal@cs.uni-magdeburg.de>
* (c) 2000-2001 Vojtech Pavlik <vojtech@
suse
.cz>
* (c) 2000-2001 Vojtech Pavlik <vojtech@
ucw
.cz>
*
* Some debug stuff for the HID parser.
*
* Sponsored by SuSE
*/
/*
...
...
@@ -25,8 +23,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Should you need to contact me, the author, you can do so either by
* e-mail - mail your message to <vojtech@
suse
.cz>, or by paper mail:
* Vojtech Pavlik,
Ucitelska 1576
, Prague 8, 182 00 Czech Republic
* e-mail - mail your message to <vojtech@
ucw
.cz>, or by paper mail:
* Vojtech Pavlik,
Simunkova 1594
, Prague 8, 182 00 Czech Republic
*/
struct
hid_usage_entry
{
...
...
@@ -36,6 +34,7 @@ struct hid_usage_entry {
};
static
struct
hid_usage_entry
hid_usage_table
[]
=
{
{
0
,
0
,
"Undefined"
},
{
1
,
0
,
"GenericDesktop"
},
{
0
,
0x01
,
"Pointer"
},
{
0
,
0x02
,
"Mouse"
},
...
...
@@ -87,6 +86,7 @@ static struct hid_usage_entry hid_usage_table[] = {
{
7
,
0
,
"Keyboard"
},
{
8
,
0
,
"LED"
},
{
9
,
0
,
"Button"
},
{
10
,
0
,
"Ordinal"
},
{
12
,
0
,
"Hotkey"
},
{
13
,
0
,
"Digitizers"
},
{
0
,
0x01
,
"Digitizer"
},
...
...
@@ -112,6 +112,112 @@ static struct hid_usage_entry hid_usage_table[] = {
{
0
,
0x45
,
"Eraser"
},
{
0
,
0x46
,
"TabletPick"
},
{
15
,
0
,
"PhysicalInterfaceDevice"
},
{
0
,
0x00
,
"Undefined"
},
{
0
,
0x01
,
"Physical_Interface_Device"
},
{
0
,
0x20
,
"Normal"
},
{
0
,
0x21
,
"Set_Effect_Report"
},
{
0
,
0x22
,
"Effect_Block_Index"
},
{
0
,
0x23
,
"Parameter_Block_Offset"
},
{
0
,
0x24
,
"ROM_Flag"
},
{
0
,
0x25
,
"Effect_Type"
},
{
0
,
0x26
,
"ET_Constant_Force"
},
{
0
,
0x27
,
"ET_Ramp"
},
{
0
,
0x28
,
"ET_Custom_Force_Data"
},
{
0
,
0x30
,
"ET_Square"
},
{
0
,
0x31
,
"ET_Sine"
},
{
0
,
0x32
,
"ET_Triangle"
},
{
0
,
0x33
,
"ET_Sawtooth_Up"
},
{
0
,
0x34
,
"ET_Sawtooth_Down"
},
{
0
,
0x40
,
"ET_Spring"
},
{
0
,
0x41
,
"ET_Damper"
},
{
0
,
0x42
,
"ET_Inertia"
},
{
0
,
0x43
,
"ET_Friction"
},
{
0
,
0x50
,
"Duration"
},
{
0
,
0x51
,
"Sample_Period"
},
{
0
,
0x52
,
"Gain"
},
{
0
,
0x53
,
"Trigger_Button"
},
{
0
,
0x54
,
"Trigger_Repeat_Interval"
},
{
0
,
0x55
,
"Axes_Enable"
},
{
0
,
0x56
,
"Direction_Enable"
},
{
0
,
0x57
,
"Direction"
},
{
0
,
0x58
,
"Type_Specific_Block_Offset"
},
{
0
,
0x59
,
"Block_Type"
},
{
0
,
0x5A
,
"Set_Envelope_Report"
},
{
0
,
0x5B
,
"Attack_Level"
},
{
0
,
0x5C
,
"Attack_Time"
},
{
0
,
0x5D
,
"Fade_Level"
},
{
0
,
0x5E
,
"Fade_Time"
},
{
0
,
0x5F
,
"Set_Condition_Report"
},
{
0
,
0x60
,
"CP_Offset"
},
{
0
,
0x61
,
"Positive_Coefficient"
},
{
0
,
0x62
,
"Negative_Coefficient"
},
{
0
,
0x63
,
"Positive_Saturation"
},
{
0
,
0x64
,
"Negative_Saturation"
},
{
0
,
0x65
,
"Dead_Band"
},
{
0
,
0x66
,
"Download_Force_Sample"
},
{
0
,
0x67
,
"Isoch_Custom_Force_Enable"
},
{
0
,
0x68
,
"Custom_Force_Data_Report"
},
{
0
,
0x69
,
"Custom_Force_Data"
},
{
0
,
0x6A
,
"Custom_Force_Vendor_Defined_Data"
},
{
0
,
0x6B
,
"Set_Custom_Force_Report"
},
{
0
,
0x6C
,
"Custom_Force_Data_Offset"
},
{
0
,
0x6D
,
"Sample_Count"
},
{
0
,
0x6E
,
"Set_Periodic_Report"
},
{
0
,
0x6F
,
"Offset"
},
{
0
,
0x70
,
"Magnitude"
},
{
0
,
0x71
,
"Phase"
},
{
0
,
0x72
,
"Period"
},
{
0
,
0x73
,
"Set_Constant_Force_Report"
},
{
0
,
0x74
,
"Set_Ramp_Force_Report"
},
{
0
,
0x75
,
"Ramp_Start"
},
{
0
,
0x76
,
"Ramp_End"
},
{
0
,
0x77
,
"Effect_Operation_Report"
},
{
0
,
0x78
,
"Effect_Operation"
},
{
0
,
0x79
,
"Op_Effect_Start"
},
{
0
,
0x7A
,
"Op_Effect_Start_Solo"
},
{
0
,
0x7B
,
"Op_Effect_Stop"
},
{
0
,
0x7C
,
"Loop_Count"
},
{
0
,
0x7D
,
"Device_Gain_Report"
},
{
0
,
0x7E
,
"Device_Gain"
},
{
0
,
0x7F
,
"PID_Pool_Report"
},
{
0
,
0x80
,
"RAM_Pool_Size"
},
{
0
,
0x81
,
"ROM_Pool_Size"
},
{
0
,
0x82
,
"ROM_Effect_Block_Count"
},
{
0
,
0x83
,
"Simultaneous_Effects_Max"
},
{
0
,
0x84
,
"Pool_Alignment"
},
{
0
,
0x85
,
"PID_Pool_Move_Report"
},
{
0
,
0x86
,
"Move_Source"
},
{
0
,
0x87
,
"Move_Destination"
},
{
0
,
0x88
,
"Move_Length"
},
{
0
,
0x89
,
"PID_Block_Load_Report"
},
{
0
,
0x8B
,
"Block_Load_Status"
},
{
0
,
0x8C
,
"Block_Load_Success"
},
{
0
,
0x8D
,
"Block_Load_Full"
},
{
0
,
0x8E
,
"Block_Load_Error"
},
{
0
,
0x8F
,
"Block_Handle"
},
{
0
,
0x90
,
"PID_Block_Free_Report"
},
{
0
,
0x91
,
"Type_Specific_Block_Handle"
},
{
0
,
0x92
,
"PID_State_Report"
},
{
0
,
0x94
,
"Effect_Playing"
},
{
0
,
0x95
,
"PID_Device_Control_Report"
},
{
0
,
0x96
,
"PID_Device_Control"
},
{
0
,
0x97
,
"DC_Enable_Actuators"
},
{
0
,
0x98
,
"DC_Disable_Actuators"
},
{
0
,
0x99
,
"DC_Stop_All_Effects"
},
{
0
,
0x9A
,
"DC_Device_Reset"
},
{
0
,
0x9B
,
"DC_Device_Pause"
},
{
0
,
0x9C
,
"DC_Device_Continue"
},
{
0
,
0x9F
,
"Device_Paused"
},
{
0
,
0xA0
,
"Actuators_Enabled"
},
{
0
,
0xA4
,
"Safety_Switch"
},
{
0
,
0xA5
,
"Actuator_Override_Switch"
},
{
0
,
0xA6
,
"Actuator_Power"
},
{
0
,
0xA7
,
"Start_Delay"
},
{
0
,
0xA8
,
"Parameter_Block_Size"
},
{
0
,
0xA9
,
"Device_Managed_Pool"
},
{
0
,
0xAA
,
"Shared_Parameter_Blocks"
},
{
0
,
0xAB
,
"Create_New_Effect_Report"
},
{
0
,
0xAC
,
"RAM_Pool_Available"
},
{
0
,
0
,
NULL
}
};
...
...
@@ -176,7 +282,50 @@ static void hid_dump_field(struct hid_field *field, int n) {
tab
(
n
);
printk
(
"Unit Exponent(%d)
\n
"
,
field
->
unit_exponent
);
}
if
(
field
->
unit
)
{
tab
(
n
);
printk
(
"Unit(%u)
\n
"
,
field
->
unit
);
char
*
systems
[
5
]
=
{
"None"
,
"SI Linear"
,
"SI Rotation"
,
"English Linear"
,
"English Rotation"
};
char
*
units
[
5
][
8
]
=
{
{
"None"
,
"None"
,
"None"
,
"None"
,
"None"
,
"None"
,
"None"
,
"None"
},
{
"None"
,
"Centimeter"
,
"Gram"
,
"Seconds"
,
"Kelvin"
,
"Ampere"
,
"Candela"
,
"None"
},
{
"None"
,
"Radians"
,
"Gram"
,
"Seconds"
,
"Kelvin"
,
"Ampere"
,
"Candela"
,
"None"
},
{
"None"
,
"Inch"
,
"Slug"
,
"Seconds"
,
"Fahrenheit"
,
"Ampere"
,
"Candela"
,
"None"
},
{
"None"
,
"Degrees"
,
"Slug"
,
"Seconds"
,
"Fahrenheit"
,
"Ampere"
,
"Candela"
,
"None"
}
};
int
i
;
int
sys
;
__u32
data
=
field
->
unit
;
/* First nibble tells us which system we're in. */
sys
=
data
&
0xf
;
data
>>=
4
;
if
(
sys
>
4
)
{
tab
(
n
);
printk
(
"Unit(Invalid)
\n
"
);
}
else
{
int
earlier_unit
=
0
;
tab
(
n
);
printk
(
"Unit(%s : "
,
systems
[
sys
]);
for
(
i
=
1
;
i
<
sizeof
(
__u32
)
*
2
;
i
++
)
{
char
nibble
=
data
&
0xf
;
data
>>=
4
;
if
(
nibble
!=
0
)
{
if
(
earlier_unit
++
>
0
)
printk
(
"*"
);
printk
(
"%s"
,
units
[
sys
][
i
]);
if
(
nibble
!=
1
)
{
/* This is a _signed_ nibble(!) */
int
val
=
nibble
&
0x7
;
if
(
nibble
&
0x08
)
val
=
-
((
0x7
&
~
val
)
+
1
);
printk
(
"^%d"
,
val
);
}
}
}
printk
(
")
\n
"
);
}
}
tab
(
n
);
printk
(
"Report Size(%u)
\n
"
,
field
->
report_size
);
tab
(
n
);
printk
(
"Report Count(%u)
\n
"
,
field
->
report_count
);
...
...
drivers/usb/hid-input.c
View file @
57d52f67
/*
* $Id: hid-input.c,v 1.
5 2001/05/23 09:25:02
vojtech Exp $
* $Id: hid-input.c,v 1.
18 2001/11/07 09:01:18
vojtech Exp $
*
* Copyright (c) 2000-2001 Vojtech Pavlik
*
* USB HID to Linux Input mapping module
*
* Sponsored by SuSE
* USB HID to Linux Input mapping
*/
/*
...
...
@@ -24,13 +22,12 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Should you need to contact me, the author, you can do so either by
* e-mail - mail your message to <vojtech@
suse
.cz>, or by paper mail:
* Vojtech Pavlik,
Ucitelska 1576
, Prague 8, 182 00 Czech Republic
* e-mail - mail your message to <vojtech@
ucw
.cz>, or by paper mail:
* Vojtech Pavlik,
Simunkova 1594
, Prague 8, 182 00 Czech Republic
*/
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/input.h>
#include <linux/usb.h>
...
...
@@ -61,12 +58,13 @@ static unsigned char hid_keyboard[256] = {
static
struct
{
__s32
x
;
__s32
y
;
}
hid_hat_to_axis
[]
=
{{
0
,
0
},
{
0
,
-
1
},
{
1
,
-
1
},
{
1
,
0
},
{
1
,
1
},
{
0
,
1
},
{
-
1
,
1
},
{
-
1
,
0
},
{
-
1
,
-
1
}};
}
hid_hat_to_axis
[]
=
{{
0
,
0
},
{
0
,
-
1
},
{
1
,
-
1
},
{
1
,
0
},
{
1
,
1
},
{
0
,
1
},
{
-
1
,
1
},
{
-
1
,
0
},
{
-
1
,
-
1
}};
static
void
hidinput_configure_usage
(
struct
hid_device
*
device
,
struct
hid_field
*
field
,
struct
hid_usage
*
usage
)
{
struct
input_dev
*
input
=
&
device
->
input
;
int
max
;
int
is_abs
=
0
;
unsigned
long
*
bit
;
switch
(
usage
->
hid
&
HID_USAGE_PAGE
)
{
...
...
@@ -198,6 +196,7 @@ static void hidinput_configure_usage(struct hid_device *device, struct hid_field
case
HID_UP_CONSUMER
:
/* USB HUT v1.1, pages 56-62 */
set_bit
(
EV_REP
,
input
->
evbit
);
switch
(
usage
->
hid
&
HID_USAGE
)
{
case
0x000
:
usage
->
code
=
0
;
break
;
case
0x034
:
usage
->
code
=
KEY_SLEEP
;
break
;
...
...
@@ -205,14 +204,21 @@ static void hidinput_configure_usage(struct hid_device *device, struct hid_field
case
0x08a
:
usage
->
code
=
KEY_WWW
;
break
;
case
0x095
:
usage
->
code
=
KEY_HELP
;
break
;
case
0x0b0
:
usage
->
code
=
KEY_PLAY
;
break
;
case
0x0b1
:
usage
->
code
=
KEY_PAUSE
;
break
;
case
0x0b2
:
usage
->
code
=
KEY_RECORD
;
break
;
case
0x0b3
:
usage
->
code
=
KEY_FASTFORWARD
;
break
;
case
0x0b4
:
usage
->
code
=
KEY_REWIND
;
break
;
case
0x0b5
:
usage
->
code
=
KEY_NEXTSONG
;
break
;
case
0x0b6
:
usage
->
code
=
KEY_PREVIOUSSONG
;
break
;
case
0x0b7
:
usage
->
code
=
KEY_STOPCD
;
break
;
case
0x0b8
:
usage
->
code
=
KEY_EJECTCD
;
break
;
case
0x0cd
:
usage
->
code
=
KEY_PLAYPAUSE
;
break
;
case
0x0e0
:
is_abs
=
1
;
usage
->
code
=
ABS_VOLUME
;
break
;
case
0x0e2
:
usage
->
code
=
KEY_MUTE
;
break
;
case
0x0e5
:
usage
->
code
=
KEY_BASSBOOST
;
break
;
case
0x0e9
:
usage
->
code
=
KEY_VOLUMEUP
;
break
;
case
0x0ea
:
usage
->
code
=
KEY_VOLUMEDOWN
;
break
;
...
...
@@ -220,7 +226,6 @@ static void hidinput_configure_usage(struct hid_device *device, struct hid_field
case
0x18a
:
usage
->
code
=
KEY_MAIL
;
break
;
case
0x192
:
usage
->
code
=
KEY_CALC
;
break
;
case
0x194
:
usage
->
code
=
KEY_FILE
;
break
;
case
0x21a
:
usage
->
code
=
KEY_UNDO
;
break
;
case
0x21b
:
usage
->
code
=
KEY_COPY
;
break
;
case
0x21c
:
usage
->
code
=
KEY_CUT
;
break
;
...
...
@@ -234,6 +239,34 @@ static void hidinput_configure_usage(struct hid_device *device, struct hid_field
case
0x227
:
usage
->
code
=
KEY_REFRESH
;
break
;
case
0x22a
:
usage
->
code
=
KEY_BOOKMARKS
;
break
;
default:
usage
->
code
=
KEY_UNKNOWN
;
break
;
}
if
(
is_abs
)
{
usage
->
type
=
EV_ABS
;
bit
=
input
->
absbit
;
max
=
ABS_MAX
;
}
else
{
usage
->
type
=
EV_KEY
;
bit
=
input
->
keybit
;
max
=
KEY_MAX
;
}
break
;
case
HID_UP_HPVENDOR
:
/* Reported on a Dutch layout HP5308 */
set_bit
(
EV_REP
,
input
->
evbit
);
switch
(
usage
->
hid
&
HID_USAGE
)
{
case
0x021
:
usage
->
code
=
KEY_PRINT
;
break
;
case
0x070
:
usage
->
code
=
KEY_HP
;
break
;
case
0x071
:
usage
->
code
=
KEY_CAMERA
;
break
;
case
0x072
:
usage
->
code
=
KEY_SOUND
;
break
;
case
0x073
:
usage
->
code
=
KEY_QUESTION
;
break
;
case
0x080
:
usage
->
code
=
KEY_EMAIL
;
break
;
case
0x081
:
usage
->
code
=
KEY_CHAT
;
break
;
case
0x082
:
usage
->
code
=
KEY_SEARCH
;
break
;
case
0x083
:
usage
->
code
=
KEY_CONNECT
;
break
;
case
0x084
:
usage
->
code
=
KEY_FINANCE
;
break
;
case
0x085
:
usage
->
code
=
KEY_SPORT
;
break
;
case
0x086
:
usage
->
code
=
KEY_SHOP
;
break
;
default:
usage
->
code
=
KEY_UNKNOWN
;
break
;
}
...
...
@@ -353,7 +386,7 @@ static int hidinput_input_event(struct input_dev *dev, unsigned int type, unsign
}
hid_set_field
(
field
,
offset
,
value
);
hid_
write_report
(
hid
,
field
->
report
);
hid_
submit_report
(
hid
,
field
->
report
,
USB_DIR_OUT
);
return
0
;
}
...
...
@@ -397,6 +430,8 @@ int hidinput_connect(struct hid_device *hid)
hid
->
input
.
close
=
hidinput_close
;
hid
->
input
.
name
=
hid
->
name
;
hid
->
input
.
phys
=
hid
->
phys
;
hid
->
input
.
uniq
=
hid
->
uniq
;
hid
->
input
.
idbus
=
BUS_USB
;
hid
->
input
.
idvendor
=
dev
->
descriptor
.
idVendor
;
hid
->
input
.
idproduct
=
dev
->
descriptor
.
idProduct
;
...
...
drivers/usb/hid.h
View file @
57d52f67
...
...
@@ -2,12 +2,10 @@
#define __HID_H
/*
* $Id: hid.h,v 1.
10 2001/05/10 15:56:07
vojtech Exp $
* $Id: hid.h,v 1.
24 2001/12/27 10:37:41
vojtech Exp $
*
* Copyright (c) 1999 Andreas Gal
* Copyright (c) 2000-2001 Vojtech Pavlik
*
* Sponsored by SuSE
*/
/*
...
...
@@ -26,13 +24,24 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Should you need to contact me, the author, you can do so either by
* e-mail - mail your message to <vojtech@
suse
.cz>, or by paper mail:
* Vojtech Pavlik,
Ucitelska 1576
, Prague 8, 182 00 Czech Republic
* e-mail - mail your message to <vojtech@
ucw
.cz>, or by paper mail:
* Vojtech Pavlik,
Simunkova 1594
, Prague 8, 182 00 Czech Republic
*/
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/list.h>
/*
* USB HID (Human Interface Device) interface class code
*/
#define USB_INTERFACE_CLASS_HID 3
/*
* HID class requests
*/
#define HID_REQ_GET_REPORT 0x01
#define HID_REQ_GET_IDLE 0x02
#define HID_REQ_GET_PROTOCOL 0x03
...
...
@@ -43,85 +52,11 @@
/*
* HID class descriptor types
*/
#define HID_DT_HID (USB_TYPE_CLASS | 0x01)
#define HID_DT_REPORT (USB_TYPE_CLASS | 0x02)
#define HID_DT_PHYSICAL (USB_TYPE_CLASS | 0x03)
/*
* Utilities for class control messaging
*/
static
inline
int
hid_set_idle
(
struct
usb_device
*
dev
,
int
ifnum
,
int
duration
,
int
report_id
)
{
return
usb_control_msg
(
dev
,
usb_sndctrlpipe
(
dev
,
0
),
HID_REQ_SET_IDLE
,
USB_TYPE_CLASS
|
USB_RECIP_INTERFACE
,
(
duration
<<
8
)
|
report_id
,
ifnum
,
NULL
,
0
,
HZ
*
USB_CTRL_SET_TIMEOUT
);
}
static
inline
int
hid_get_protocol
(
struct
usb_device
*
dev
,
int
ifnum
)
{
unsigned
char
type
;
int
ret
;
if
((
ret
=
usb_control_msg
(
dev
,
usb_rcvctrlpipe
(
dev
,
0
),
HID_REQ_GET_PROTOCOL
,
USB_DIR_IN
|
USB_TYPE_CLASS
|
USB_RECIP_INTERFACE
,
0
,
ifnum
,
&
type
,
1
,
HZ
*
USB_CTRL_GET_TIMEOUT
))
<
0
)
return
ret
;
return
type
;
}
static
inline
int
hid_set_protocol
(
struct
usb_device
*
dev
,
int
ifnum
,
int
protocol
)
{
return
usb_control_msg
(
dev
,
usb_sndctrlpipe
(
dev
,
0
),
HID_REQ_SET_PROTOCOL
,
USB_TYPE_CLASS
|
USB_RECIP_INTERFACE
,
protocol
,
ifnum
,
NULL
,
0
,
HZ
*
USB_CTRL_SET_TIMEOUT
);
}
static
inline
int
hid_get_report
(
struct
usb_device
*
dev
,
int
ifnum
,
unsigned
char
type
,
unsigned
char
id
,
void
*
buf
,
int
size
)
{
return
usb_control_msg
(
dev
,
usb_rcvctrlpipe
(
dev
,
0
),
HID_REQ_GET_REPORT
,
USB_DIR_IN
|
USB_TYPE_CLASS
|
USB_RECIP_INTERFACE
,
(
type
<<
8
)
+
id
,
ifnum
,
buf
,
size
,
HZ
*
USB_CTRL_GET_TIMEOUT
);
}
static
inline
int
hid_set_report
(
struct
usb_device
*
dev
,
int
ifnum
,
unsigned
char
type
,
unsigned
char
id
,
void
*
buf
,
int
size
)
{
return
usb_control_msg
(
dev
,
usb_sndctrlpipe
(
dev
,
0
),
HID_REQ_SET_REPORT
,
USB_TYPE_CLASS
|
USB_RECIP_INTERFACE
,
(
type
<<
8
)
+
id
,
ifnum
,
buf
,
size
,
HZ
);
// FIXME USB_CTRL_SET_TIMEOUT
}
/*
* "Boot Protocol" keyboard/mouse drivers use don't use all of HID;
* they're a lot smaller but can't support all the device features.
*/
#ifndef _HID_BOOT_PROTOCOL
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/list.h>
/*
* USB HID (Human Interface Device) interface class code
*/
#define USB_INTERFACE_CLASS_HID 3
/*
* We parse each description item into this structure. Short items data
* values are expanded to 32-bit signed int, long items contain a pointer
...
...
@@ -240,9 +175,11 @@ struct hid_item {
#define HID_UP_KEYBOARD 0x00070000
#define HID_UP_LED 0x00080000
#define HID_UP_BUTTON 0x00090000
#define HID_UP_ORDINAL 0x000a0000
#define HID_UP_CONSUMER 0x000c0000
#define HID_UP_DIGITIZER 0x000d0000
#define HID_UP_PID 0x000f0000
#define HID_UP_HPVENDOR 0xff7f0000
#define HID_USAGE 0x0000ffff
...
...
@@ -279,7 +216,7 @@ struct hid_global {
__s32
logical_maximum
;
__s32
physical_minimum
;
__s32
physical_maximum
;
unsigned
unit_exponent
;
__s32
unit_exponent
;
unsigned
unit
;
unsigned
report_id
;
unsigned
report_size
;
...
...
@@ -336,7 +273,7 @@ struct hid_field {
__s32
logical_maximum
;
__s32
physical_minimum
;
__s32
physical_maximum
;
unsigned
unit_exponent
;
__s32
unit_exponent
;
unsigned
unit
;
struct
hid_report
*
report
;
/* associated report */
};
...
...
@@ -350,8 +287,6 @@ struct hid_report {
struct
hid_field
*
field
[
HID_MAX_FIELDS
];
/* fields of the report */
unsigned
maxfield
;
/* maximum valid field index */
unsigned
size
;
/* size of the report (bits) */
unsigned
idx
;
/* where we're in data */
unsigned
char
*
data
;
/* data for multi-packet reports */
struct
hid_device
*
device
;
/* associated device */
};
...
...
@@ -364,16 +299,20 @@ struct hid_report_enum {
#define HID_REPORT_TYPES 3
#define HID_BUFFER_SIZE 32
#define HID_CONTROL_FIFO_SIZE 8
#define HID_CONTROL_FIFO_SIZE 64
#define HID_OUTPUT_FIFO_SIZE 64
struct
hid_control_fifo
{
struct
usb_ctrlrequest
d
r
;
char
buffer
[
HID_BUFFER_SIZE
]
;
unsigned
char
di
r
;
struct
hid_report
*
report
;
};
#define HID_CLAIMED_INPUT 1
#define HID_CLAIMED_HIDDEV 2
#define HID_CTRL_RUNNING 1
#define HID_OUT_RUNNING 2
struct
hid_device
{
/* device report descriptor */
__u8
*
rdesc
;
unsigned
rsize
;
...
...
@@ -386,12 +325,23 @@ struct hid_device { /* device report descriptor */
struct
usb_device
*
dev
;
/* USB device */
int
ifnum
;
/* USB interface number */
struct
urb
urb
;
/* USB URB structure */
char
buffer
[
HID_BUFFER_SIZE
];
/* Rx buffer */
unsigned
long
iofl
;
/* I/O flags (CTRL_RUNNING, OUT_RUNNING) */
struct
urb
*
urbin
;
/* Input URB */
char
inbuf
[
HID_BUFFER_SIZE
];
/* Input buffer */
struct
urb
urbout
;
/* Output URB */
struct
hid_control_fifo
out
[
HID_CONTROL_FIFO_SIZE
];
/* Transmit buffer */
unsigned
char
outhead
,
outtail
;
/* Tx buffer head & tail */
struct
urb
*
urbctrl
;
/* Control URB */
struct
usb_ctrlrequest
cr
;
/* Control request struct */
struct
hid_control_fifo
ctrl
[
HID_CONTROL_FIFO_SIZE
];
/* Control fifo */
unsigned
char
ctrlhead
,
ctrltail
;
/* Control fifo head & tail */
char
ctrlbuf
[
HID_BUFFER_SIZE
];
/* Control buffer */
spinlock_t
ctrllock
;
/* Control fifo spinlock */
struct
urb
*
urbout
;
/* Output URB */
struct
hid_report
*
out
[
HID_CONTROL_FIFO_SIZE
];
/* Output pipe fifo */
unsigned
char
outhead
,
outtail
;
/* Output pipe fifo head & tail */
char
outbuf
[
HID_BUFFER_SIZE
];
/* Output buffer */
spinlock_t
outlock
;
/* Output fifo spinlock */
unsigned
claimed
;
/* Claimed by hidinput, hiddev? */
unsigned
quirks
;
/* Various quirks the device can pull on us */
...
...
@@ -400,8 +350,12 @@ struct hid_device { /* device report descriptor */
void
*
hiddev
;
/* The hiddev structure */
int
minor
;
/* Hiddev minor number */
wait_queue_head_t
wait
;
/* For sleeping */
int
open
;
/* is the device open by anyone? */
char
name
[
128
];
/* Device name */
char
phys
[
64
];
/* Device physical location */
char
uniq
[
64
];
/* Device unique identifier (serial #) */
};
#define HID_GLOBAL_STACK_SIZE 4
...
...
@@ -441,19 +395,18 @@ void hidinput_disconnect(struct hid_device *);
#else
#define hid_dump_input(a,b) do { } while (0)
#define hid_dump_device(c) do { } while (0)
#endif
/* DEBUG */
#define hid_dump_field(a,b) do { } while (0)
#endif
#define IS_INPUT_APPLICATION(a) (((a >= 0x00010000) && (a <= 0x00010008)) || (a == 0x00010080) || ( a == 0x000c0001))
#endif
/* Applications from HID Usage Tables 4/8/99 Version 1.1 */
/* We ignore a few input applications that are not widely used */
#define IS_INPUT_APPLICATION(a) (((a >= 0x00010000) && (a <= 0x00010008)) || ( a == 0x00010080) || ( a == 0x000c0001))
int
hid_open
(
struct
hid_device
*
);
void
hid_close
(
struct
hid_device
*
);
int
hid_find_field
(
struct
hid_device
*
,
unsigned
int
,
unsigned
int
,
struct
hid_field
**
);
int
hid_set_field
(
struct
hid_field
*
,
unsigned
,
__s32
);
void
hid_write_report
(
struct
hid_device
*
,
struct
hid_report
*
);
void
hid_read_report
(
struct
hid_device
*
,
struct
hid_report
*
);
void
hid_submit_report
(
struct
hid_device
*
,
struct
hid_report
*
,
unsigned
char
dir
);
void
hid_init_reports
(
struct
hid_device
*
hid
);
#endif
/* !_HID_BOOT_PROTOCOL */
#endif
/* !__HID_H */
drivers/usb/hiddev.c
View file @
57d52f67
...
...
@@ -400,7 +400,7 @@ static int hiddev_ioctl(struct inode *inode, struct file *file,
if
((
report
=
hiddev_lookup_report
(
hid
,
&
rinfo
))
==
NULL
)
return
-
EINVAL
;
hid_
read_report
(
hid
,
report
);
hid_
submit_report
(
hid
,
report
,
USB_DIR_IN
);
return
0
;
...
...
@@ -414,7 +414,7 @@ static int hiddev_ioctl(struct inode *inode, struct file *file,
if
((
report
=
hiddev_lookup_report
(
hid
,
&
rinfo
))
==
NULL
)
return
-
EINVAL
;
hid_
write_report
(
hid
,
report
);
hid_
submit_report
(
hid
,
report
,
USB_DIR_OUT
);
return
0
;
...
...
drivers/usb/pegasus.h
View file @
57d52f67
...
...
@@ -134,9 +134,11 @@ struct usb_eth_dev {
#define VENDOR_ALLIEDTEL 0x07c9
#define VENDOR_BELKIN 0x050d
#define VENDOR_BILLIONTON 0x08dd
#define VENDOR_COMPAQ 0x049f
#define VENDOR_COREGA 0x07aa
#define VENDOR_DLINK 0x2001
#define VENDOR_ELSA 0x05cc
#define VENDOR_HAWKING 0x0e66
#define VENDOR_IODATA 0x04bb
#define VENDOR_KINGSTON 0x0951
#define VENDOR_LANEED 0x056e
...
...
@@ -190,6 +192,8 @@ PEGASUS_DEV( "Billionton USB-100", VENDOR_BILLIONTON, 0x0986,
DEFAULT_GPIO_RESET
)
PEGASUS_DEV
(
"Billionton USBLP-100"
,
VENDOR_BILLIONTON
,
0x0987
,
DEFAULT_GPIO_RESET
|
HAS_HOME_PNA
)
PEGASUS_DEV
(
"iPAQ Networking 10/100 USB"
,
VENDOR_COMPAQ
,
0x8511
,
DEFAULT_GPIO_RESET
|
PEGASUS_II
)
PEGASUS_DEV
(
"Billionton USBEL-100"
,
VENDOR_BILLIONTON
,
0x0988
,
DEFAULT_GPIO_RESET
)
PEGASUS_DEV
(
"Billionton USBE-100"
,
VENDOR_BILLIONTON
,
0x8511
,
...
...
@@ -212,8 +216,12 @@ PEGASUS_DEV( "D-Link DSB-650", VENDOR_DLINK, 0xabc1,
DEFAULT_GPIO_RESET
)
PEGASUS_DEV
(
"Elsa Micolink USB2Ethernet"
,
VENDOR_ELSA
,
0x3000
,
DEFAULT_GPIO_RESET
)
PEGASUS_DEV
(
"Hawking UF100 10/100 Ethernet"
,
VENDOR_HAWKING
,
0x400c
,
DEFAULT_GPIO_RESET
|
PEGASUS_II
)
PEGASUS_DEV
(
"IO DATA USB ET/TX"
,
VENDOR_IODATA
,
0x0904
,
DEFAULT_GPIO_RESET
)
PEGASUS_DEV
(
"IO DATA USB ET/TX-S"
,
VENDOR_IODATA
,
0x0913
,
DEFAULT_GPIO_RESET
|
PEGASUS_II
)
PEGASUS_DEV
(
"Kingston KNU101TX Ethernet"
,
VENDOR_KINGSTON
,
0x000a
,
DEFAULT_GPIO_RESET
)
PEGASUS_DEV
(
"LANEED USB Ethernet LD-USB/TX"
,
VENDOR_LANEED
,
0x4002
,
...
...
drivers/usb/usbkbd.c
View file @
57d52f67
/*
* $Id: usbkbd.c,v 1.2
0 2001/04/26 08:34:49
vojtech Exp $
* $Id: usbkbd.c,v 1.2
7 2001/12/27 10:37:41
vojtech Exp $
*
* Copyright (c) 1999-2001 Vojtech Pavlik
*
* USB HIDBP Keyboard support
*
* Sponsored by SuSE
*/
/*
...
...
@@ -24,8 +22,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Should you need to contact me, the author, you can do so either by
* e-mail - mail your message to <vojtech@
suse
.cz>, or by paper mail:
* Vojtech Pavlik,
Ucitelska 1576
, Prague 8, 182 00 Czech Republic
* e-mail - mail your message to <vojtech@
ucw
.cz>, or by paper mail:
* Vojtech Pavlik,
Simunkova 1594
, Prague 8, 182 00 Czech Republic
*/
#include <linux/kernel.h>
...
...
@@ -35,19 +33,17 @@
#include <linux/init.h>
#include <linux/usb.h>
#define _HID_BOOT_PROTOCOL
#include "hid.h"
/*
* Version Information
*/
#define DRIVER_VERSION ""
#define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@
suse
.cz>"
#define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@
ucw
.cz>"
#define DRIVER_DESC "USB HID Boot Protocol keyboard driver"
#define DRIVER_LICENSE "GPL"
MODULE_AUTHOR
(
DRIVER_AUTHOR
);
MODULE_DESCRIPTION
(
DRIVER_DESC
);
MODULE_LICENSE
(
"GPL"
);
MODULE_AUTHOR
(
DRIVER_AUTHOR
);
MODULE_DESCRIPTION
(
DRIVER_DESC
);
MODULE_LICENSE
(
DRIVER_LICENSE
);
static
unsigned
char
usb_kbd_keycode
[
256
]
=
{
0
,
0
,
0
,
0
,
30
,
48
,
46
,
32
,
18
,
33
,
34
,
35
,
23
,
36
,
37
,
38
,
...
...
@@ -74,9 +70,10 @@ struct usb_kbd {
unsigned
char
new
[
8
];
unsigned
char
old
[
8
];
struct
urb
*
irq
,
*
led
;
struct
usb_ctrlrequest
d
r
;
struct
usb_ctrlrequest
c
r
;
unsigned
char
leds
,
newleds
;
char
name
[
128
];
char
phys
[
64
];
int
open
;
};
...
...
@@ -129,7 +126,7 @@ int usb_kbd_event(struct input_dev *dev, unsigned int type, unsigned int code, i
kbd
->
leds
=
kbd
->
newleds
;
kbd
->
led
->
dev
=
kbd
->
usbdev
;
if
(
usb_submit_urb
(
kbd
->
led
,
GFP_
KERNEL
))
if
(
usb_submit_urb
(
kbd
->
led
,
GFP_
ATOMIC
))
err
(
"usb_submit_urb(leds) failed"
);
return
0
;
...
...
@@ -147,7 +144,7 @@ static void usb_kbd_led(struct urb *urb)
kbd
->
leds
=
kbd
->
newleds
;
kbd
->
led
->
dev
=
kbd
->
usbdev
;
if
(
usb_submit_urb
(
kbd
->
led
,
GFP_
KERNEL
))
if
(
usb_submit_urb
(
kbd
->
led
,
GFP_
ATOMIC
))
err
(
"usb_submit_urb(leds) failed"
);
}
...
...
@@ -181,6 +178,7 @@ static void *usb_kbd_probe(struct usb_device *dev, unsigned int ifnum,
struct
usb_endpoint_descriptor
*
endpoint
;
struct
usb_kbd
*
kbd
;
int
i
,
pipe
,
maxp
;
char
path
[
64
];
char
*
buf
;
iface
=
&
dev
->
actconfig
->
interface
[
ifnum
];
...
...
@@ -195,9 +193,6 @@ static void *usb_kbd_probe(struct usb_device *dev, unsigned int ifnum,
pipe
=
usb_rcvintpipe
(
dev
,
endpoint
->
bEndpointAddress
);
maxp
=
usb_maxpacket
(
dev
,
pipe
,
usb_pipeout
(
pipe
));
hid_set_protocol
(
dev
,
interface
->
bInterfaceNumber
,
0
);
hid_set_idle
(
dev
,
interface
->
bInterfaceNumber
,
0
,
0
);
if
(
!
(
kbd
=
kmalloc
(
sizeof
(
struct
usb_kbd
),
GFP_KERNEL
)))
return
NULL
;
memset
(
kbd
,
0
,
sizeof
(
struct
usb_kbd
));
...
...
@@ -230,13 +225,17 @@ static void *usb_kbd_probe(struct usb_device *dev, unsigned int ifnum,
FILL_INT_URB
(
kbd
->
irq
,
dev
,
pipe
,
kbd
->
new
,
maxp
>
8
?
8
:
maxp
,
usb_kbd_irq
,
kbd
,
endpoint
->
bInterval
);
kbd
->
dr
.
bRequestType
=
USB_TYPE_CLASS
|
USB_RECIP_INTERFACE
;
kbd
->
dr
.
bRequest
=
HID_REQ_SET_REPORT
;
kbd
->
dr
.
wValue
=
0x200
;
kbd
->
dr
.
wIndex
=
interface
->
bInterfaceNumber
;
kbd
->
dr
.
wLength
=
1
;
kbd
->
cr
.
bRequestType
=
USB_TYPE_CLASS
|
USB_RECIP_INTERFACE
;
kbd
->
cr
.
bRequest
=
0x09
;
kbd
->
cr
.
wValue
=
0x200
;
kbd
->
cr
.
wIndex
=
interface
->
bInterfaceNumber
;
kbd
->
cr
.
wLength
=
1
;
usb_make_path
(
dev
,
path
,
64
);
sprintf
(
kbd
->
phys
,
"%s/input0"
,
path
);
kbd
->
dev
.
name
=
kbd
->
name
;
kbd
->
dev
.
phys
=
kbd
->
phys
;
kbd
->
dev
.
idbus
=
BUS_USB
;
kbd
->
dev
.
idvendor
=
dev
->
descriptor
.
idVendor
;
kbd
->
dev
.
idproduct
=
dev
->
descriptor
.
idProduct
;
...
...
@@ -261,12 +260,11 @@ static void *usb_kbd_probe(struct usb_device *dev, unsigned int ifnum,
kfree
(
buf
);
FILL_CONTROL_URB
(
kbd
->
led
,
dev
,
usb_sndctrlpipe
(
dev
,
0
),
(
void
*
)
&
kbd
->
d
r
,
&
kbd
->
leds
,
1
,
usb_kbd_led
,
kbd
);
(
void
*
)
&
kbd
->
c
r
,
&
kbd
->
leds
,
1
,
usb_kbd_led
,
kbd
);
input_register_device
(
&
kbd
->
dev
);
printk
(
KERN_INFO
"input%d: %s on usb%d:%d.%d
\n
"
,
kbd
->
dev
.
number
,
kbd
->
name
,
dev
->
bus
->
busnum
,
dev
->
devnum
,
ifnum
);
printk
(
KERN_INFO
"input: %s on %s
\n
"
,
kbd
->
name
,
path
);
return
kbd
;
}
...
...
drivers/usb/usbmouse.c
View file @
57d52f67
/*
* $Id: usbmouse.c,v 1.
6 2000/08/14 21:05:26
vojtech Exp $
* $Id: usbmouse.c,v 1.
15 2001/12/27 10:37:41
vojtech Exp $
*
* Copyright (c) 1999-200
0
Vojtech Pavlik
* Copyright (c) 1999-200
1
Vojtech Pavlik
*
* USB HIDBP Mouse support
*
* Sponsored by SuSE
*/
/*
...
...
@@ -24,8 +22,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Should you need to contact me, the author, you can do so either by
* e-mail - mail your message to <vojtech@
suse
.cz>, or by paper mail:
* Vojtech Pavlik,
Ucitelska 1576
, Prague 8, 182 00 Czech Republic
* e-mail - mail your message to <vojtech@
ucw
.cz>, or by paper mail:
* Vojtech Pavlik,
Simunkova 1594
, Prague 8, 182 00 Czech Republic
*/
#include <linux/kernel.h>
...
...
@@ -35,23 +33,22 @@
#include <linux/init.h>
#include <linux/usb.h>
#define _HID_BOOT_PROTOCOL
#include "hid.h"
/*
* Version Information
*/
#define DRIVER_VERSION "v1.6"
#define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@
suse
.cz>"
#define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@
ucw
.cz>"
#define DRIVER_DESC "USB HID Boot Protocol mouse driver"
#define DRIVER_LICENSE "GPL"
MODULE_AUTHOR
(
DRIVER_AUTHOR
);
MODULE_DESCRIPTION
(
DRIVER_DESC
);
MODULE_LICENSE
(
"GPL"
);
MODULE_AUTHOR
(
DRIVER_AUTHOR
);
MODULE_DESCRIPTION
(
DRIVER_DESC
);
MODULE_LICENSE
(
DRIVER_LICENSE
);
struct
usb_mouse
{
signed
char
data
[
8
];
char
name
[
128
];
char
phys
[
64
];
struct
usb_device
*
usbdev
;
struct
input_dev
dev
;
struct
urb
*
irq
;
...
...
@@ -107,6 +104,7 @@ static void *usb_mouse_probe(struct usb_device *dev, unsigned int ifnum,
struct
usb_endpoint_descriptor
*
endpoint
;
struct
usb_mouse
*
mouse
;
int
pipe
,
maxp
;
char
path
[
64
];
char
*
buf
;
iface
=
&
dev
->
actconfig
->
interface
[
ifnum
];
...
...
@@ -121,8 +119,6 @@ static void *usb_mouse_probe(struct usb_device *dev, unsigned int ifnum,
pipe
=
usb_rcvintpipe
(
dev
,
endpoint
->
bEndpointAddress
);
maxp
=
usb_maxpacket
(
dev
,
pipe
,
usb_pipeout
(
pipe
));
hid_set_idle
(
dev
,
interface
->
bInterfaceNumber
,
0
,
0
);
if
(
!
(
mouse
=
kmalloc
(
sizeof
(
struct
usb_mouse
),
GFP_KERNEL
)))
return
NULL
;
memset
(
mouse
,
0
,
sizeof
(
struct
usb_mouse
));
...
...
@@ -144,7 +140,11 @@ static void *usb_mouse_probe(struct usb_device *dev, unsigned int ifnum,
mouse
->
dev
.
open
=
usb_mouse_open
;
mouse
->
dev
.
close
=
usb_mouse_close
;
usb_make_path
(
dev
,
path
,
64
);
sprintf
(
mouse
->
phys
,
"%s/input0"
,
path
);
mouse
->
dev
.
name
=
mouse
->
name
;
mouse
->
dev
.
phys
=
mouse
->
phys
;
mouse
->
dev
.
idbus
=
BUS_USB
;
mouse
->
dev
.
idvendor
=
dev
->
descriptor
.
idVendor
;
mouse
->
dev
.
idproduct
=
dev
->
descriptor
.
idProduct
;
...
...
@@ -173,8 +173,7 @@ static void *usb_mouse_probe(struct usb_device *dev, unsigned int ifnum,
input_register_device
(
&
mouse
->
dev
);
printk
(
KERN_INFO
"input%d: %s on usb%d:%d.%d
\n
"
,
mouse
->
dev
.
number
,
mouse
->
name
,
dev
->
bus
->
busnum
,
dev
->
devnum
,
ifnum
);
printk
(
KERN_INFO
"input: %s on %s
\n
"
,
mouse
->
name
,
path
);
return
mouse
;
}
...
...
drivers/usb/wacom.c
View file @
57d52f67
/*
* $Id: wacom.c,v 1.2
2 2001/04/26 11:26:09
vojtech Exp $
* $Id: wacom.c,v 1.2
8 2001/09/25 10:12:07
vojtech Exp $
*
* Copyright (c) 2000-2001 Vojtech Pavlik <vojtech@
suse
.cz>
* Copyright (c) 2000-2001 Vojtech Pavlik <vojtech@
ucw
.cz>
* Copyright (c) 2000 Andreas Bach Aaen <abach@stofanet.dk>
* Copyright (c) 2000 Clifford Wolf <clifford@clifford.at>
* Copyright (c) 2000 Sam Mosel <sam.mosel@computer.org>
...
...
@@ -11,8 +11,6 @@
*
* USB Wacom Graphire and Wacom Intuos tablet support
*
* Sponsored by SuSE
*
* ChangeLog:
* v0.1 (vp) - Initial release
* v0.2 (aba) - Support for all buttons / combinations
...
...
@@ -57,8 +55,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Should you need to contact me, the author, you can do so either by
* e-mail - mail your message to <vojtech@
suse
.cz>, or by paper mail:
* Vojtech Pavlik,
Ucitelska 1576
, Prague 8, 182 00 Czech Republic
* e-mail - mail your message to <vojtech@
ucw
.cz>, or by paper mail:
* Vojtech Pavlik,
Simunkova 1594
, Prague 8, 182 00 Czech Republic
*/
#include <linux/kernel.h>
...
...
@@ -72,12 +70,13 @@
* Version Information
*/
#define DRIVER_VERSION "v1.21"
#define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@
suse
.cz>"
#define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@
ucw
.cz>"
#define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver"
#define DRIVER_LICENSE "GPL"
MODULE_AUTHOR
(
DRIVER_AUTHOR
);
MODULE_DESCRIPTION
(
DRIVER_DESC
);
MODULE_LICENSE
(
"GPL"
);
MODULE_AUTHOR
(
DRIVER_AUTHOR
);
MODULE_DESCRIPTION
(
DRIVER_DESC
);
MODULE_LICENSE
(
DRIVER_LICENSE
);
#define USB_VENDOR_ID_WACOM 0x056a
...
...
@@ -106,6 +105,7 @@ struct wacom {
int
open
;
int
x
,
y
;
__u32
serial
[
2
];
char
phys
[
32
];
};
static
void
wacom_pl_irq
(
struct
urb
*
urb
)
...
...
@@ -354,6 +354,7 @@ static void *wacom_probe(struct usb_device *dev, unsigned int ifnum, const struc
{
struct
usb_endpoint_descriptor
*
endpoint
;
struct
wacom
*
wacom
;
char
path
[
64
];
if
(
!
(
wacom
=
kmalloc
(
sizeof
(
struct
wacom
),
GFP_KERNEL
)))
return
NULL
;
memset
(
wacom
,
0
,
sizeof
(
struct
wacom
));
...
...
@@ -394,7 +395,11 @@ static void *wacom_probe(struct usb_device *dev, unsigned int ifnum, const struc
wacom
->
dev
.
open
=
wacom_open
;
wacom
->
dev
.
close
=
wacom_close
;
usb_make_path
(
dev
,
path
,
64
);
sprintf
(
wacom
->
phys
,
"%s/input0"
,
path
);
wacom
->
dev
.
name
=
wacom
->
features
->
name
;
wacom
->
dev
.
phys
=
wacom
->
phys
;
wacom
->
dev
.
idbus
=
BUS_USB
;
wacom
->
dev
.
idvendor
=
dev
->
descriptor
.
idVendor
;
wacom
->
dev
.
idproduct
=
dev
->
descriptor
.
idProduct
;
...
...
@@ -408,8 +413,7 @@ static void *wacom_probe(struct usb_device *dev, unsigned int ifnum, const struc
input_register_device
(
&
wacom
->
dev
);
printk
(
KERN_INFO
"input%d: %s on usb%d:%d.%d
\n
"
,
wacom
->
dev
.
number
,
wacom
->
features
->
name
,
dev
->
bus
->
busnum
,
dev
->
devnum
,
ifnum
);
printk
(
KERN_INFO
"input: %s on %s
\n
"
,
wacom
->
features
->
name
,
path
);
return
wacom
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment