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
dd394d1a
Commit
dd394d1a
authored
Feb 09, 2004
by
Vojtech Pavlik
Browse files
Options
Browse Files
Download
Plain Diff
Manual merge.
parents
a6eebfd5
dca0c121
Changes
24
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
859 additions
and
997 deletions
+859
-997
Documentation/kernel-parameters.txt
Documentation/kernel-parameters.txt
+10
-3
Documentation/usb/acm.txt
Documentation/usb/acm.txt
+4
-4
arch/arm26/Kconfig
arch/arm26/Kconfig
+0
-5
drivers/char/Kconfig
drivers/char/Kconfig
+0
-24
drivers/char/Makefile
drivers/char/Makefile
+0
-1
drivers/input/gameport/ns558.c
drivers/input/gameport/ns558.c
+24
-11
drivers/input/keyboard/Kconfig
drivers/input/keyboard/Kconfig
+1
-0
drivers/input/keyboard/atkbd.c
drivers/input/keyboard/atkbd.c
+81
-51
drivers/input/keyboard/hpps2atkbd.h
drivers/input/keyboard/hpps2atkbd.h
+91
-83
drivers/input/keyboard/sunkbd.c
drivers/input/keyboard/sunkbd.c
+11
-11
drivers/input/misc/Kconfig
drivers/input/misc/Kconfig
+0
-9
drivers/input/misc/Makefile
drivers/input/misc/Makefile
+0
-1
drivers/input/misc/gsc_ps2.c
drivers/input/misc/gsc_ps2.c
+0
-712
drivers/input/mouse/Kconfig
drivers/input/mouse/Kconfig
+1
-0
drivers/input/serio/Kconfig
drivers/input/serio/Kconfig
+16
-0
drivers/input/serio/Makefile
drivers/input/serio/Makefile
+1
-0
drivers/input/serio/gscps2.c
drivers/input/serio/gscps2.c
+470
-0
drivers/input/serio/i8042.c
drivers/input/serio/i8042.c
+2
-1
drivers/usb/input/hid-core.c
drivers/usb/input/hid-core.c
+42
-21
drivers/usb/input/hid-input.c
drivers/usb/input/hid-input.c
+4
-3
drivers/usb/input/hiddev.c
drivers/usb/input/hiddev.c
+55
-24
drivers/usb/input/wacom.c
drivers/usb/input/wacom.c
+3
-1
include/linux/hiddev.h
include/linux/hiddev.h
+43
-31
include/linux/miscdevice.h
include/linux/miscdevice.h
+0
-1
No files found.
Documentation/kernel-parameters.txt
View file @
dd394d1a
...
...
@@ -174,11 +174,18 @@ running once the system is up.
atascsi= [HW,SCSI] Atari SCSI
atkbd.set= [HW] Select keyboard code set
Format: <int>
atkbd.extra= [HW] Enable extra LEDs and keys on IBM RapidAccess, EzKey
and similar keyboards
atkbd.reset= [HW] Reset keyboard during initialization
atkbd.set= [HW] Select keyboard code set
Format: <int> (2 = AT (default) 3 = PS/2)
atkbd.scroll= [HW] Enable scroll wheel on MS Office and similar keyboards
atkbd.softrepeat=
[HW] Use software keyboard repeat
atkbd.reset= [HW] Reset keyboard during initialization
autotest [IA64]
...
...
Documentation/usb/acm.txt
View file @
dd394d1a
...
...
@@ -28,7 +28,7 @@ in the package: See the file COPYING.
1. Usage
~~~~~~~~
The drivers/usb/acm.c drivers works with USB modems and USB ISDN terminal
The drivers/usb/
class/cdc-
acm.c drivers works with USB modems and USB ISDN terminal
adapters that conform to the Universal Serial Bus Communication Device Class
Abstract Control Model (USB CDC ACM) specification.
...
...
@@ -65,9 +65,9 @@ minor/major numbers anywhere you want, but either the above location or
To use the modems you need these modules loaded:
usbcore.o
u
sb-[uo]hci.o or uhci.
o
acm.
o
usbcore.
k
o
u
hci-hcd.ko ohci-hcd.ko or ehci-hcd.k
o
cdc-acm.k
o
After that, the modem[s] should be accessible. You should be able to use
minicom, ppp and mgetty with them.
...
...
arch/arm26/Kconfig
View file @
dd394d1a
...
...
@@ -216,11 +216,6 @@ source "drivers/input/Kconfig"
source "drivers/char/Kconfig"
config KBDMOUSE
bool
depends on ARCH_ACORN && BUSMOUSE=y
default y
source "drivers/media/Kconfig"
source "fs/Kconfig"
...
...
drivers/char/Kconfig
View file @
dd394d1a
...
...
@@ -588,30 +588,6 @@ config PC9800_OLDLP_CONSOLE
bool "Support for console on line printer"
depends on PC9800_OLDLP
menu "Mice"
config BUSMOUSE
tristate "Bus Mouse Support"
---help---
Say Y here if your machine has a bus mouse as opposed to a serial
mouse. Most people have a regular serial MouseSystem or
Microsoft mouse (made by Logitech) that plugs into a COM port
(rectangular with 9 or 25 pins). These people say N here.
If you have a laptop, you either have to check the documentation or
experiment a bit to find out whether the trackball is a serial mouse
or not; it's best to say Y here for you.
This is the generic bus mouse driver code. If you have a bus mouse,
you will have to say Y here and also to the specific driver for your
mouse below.
To compile this driver as a module, choose M here: the
module will be called busmouse.
endmenu
config QIC02_TAPE
tristate "QIC-02 tape support"
help
...
...
drivers/char/Makefile
View file @
dd394d1a
...
...
@@ -49,7 +49,6 @@ obj-$(CONFIG_PRINTER) += lp.o
obj-$(CONFIG_TIPAR)
+=
tipar.o
obj-$(CONFIG_PC9800_OLDLP)
+=
lp_old98.o
obj-$(CONFIG_BUSMOUSE)
+=
busmouse.o
obj-$(CONFIG_DTLK)
+=
dtlk.o
obj-$(CONFIG_R3964)
+=
n_r3964.o
obj-$(CONFIG_APPLICOM)
+=
applicom.o
...
...
drivers/input/gameport/ns558.c
View file @
dd394d1a
...
...
@@ -77,7 +77,7 @@ static void ns558_isa_probe(int io)
* No one should be using this address.
*/
if
(
check_region
(
io
,
1
))
if
(
!
request_region
(
io
,
1
,
"ns558-isa"
))
return
;
/*
...
...
@@ -89,7 +89,8 @@ static void ns558_isa_probe(int io)
outb
(
~
c
&
~
3
,
io
);
if
(
~
(
u
=
v
=
inb
(
io
))
&
3
)
{
outb
(
c
,
io
);
return
;
i
=
0
;
goto
out
;
}
/*
* After a trigger, there must be at least some bits changing.
...
...
@@ -99,7 +100,8 @@ static void ns558_isa_probe(int io)
if
(
u
==
v
)
{
outb
(
c
,
io
);
return
;
i
=
0
;
goto
out
;
}
wait_ms
(
3
);
/*
...
...
@@ -110,7 +112,8 @@ static void ns558_isa_probe(int io)
for
(
i
=
0
;
i
<
1000
;
i
++
)
if
((
u
^
inb
(
io
))
&
0xf
)
{
outb
(
c
,
io
);
return
;
i
=
0
;
goto
out
;
}
/*
* And now find the number of mirrors of the port.
...
...
@@ -118,7 +121,9 @@ static void ns558_isa_probe(int io)
for
(
i
=
1
;
i
<
5
;
i
++
)
{
if
(
check_region
(
io
&
(
-
1
<<
i
),
(
1
<<
i
)))
/* Don't disturb anyone */
release_region
(
io
&
(
-
1
<<
(
i
-
1
)),
(
1
<<
(
i
-
1
)));
if
(
!
request_region
(
io
&
(
-
1
<<
i
),
(
1
<<
i
),
"ns558-isa"
))
/* Don't disturb anyone */
break
;
outb
(
0xff
,
io
&
(
-
1
<<
i
));
...
...
@@ -126,18 +131,25 @@ static void ns558_isa_probe(int io)
if
(
inb
(
io
&
(
-
1
<<
i
))
!=
inb
((
io
&
(
-
1
<<
i
))
+
(
1
<<
i
)
-
1
))
b
++
;
wait_ms
(
3
);
if
(
b
>
300
)
/* We allow 30% difference */
if
(
b
>
300
)
{
/* We allow 30% difference */
release_region
(
io
&
(
-
1
<<
i
),
(
1
<<
i
));
break
;
}
}
i
--
;
if
(
i
!=
4
)
{
if
(
!
request_region
(
io
&
(
-
1
<<
i
),
(
1
<<
i
),
"ns558-isa"
))
return
;
}
if
(
!
(
port
=
kmalloc
(
sizeof
(
struct
ns558
),
GFP_KERNEL
)))
{
printk
(
KERN_ERR
"ns558: Memory allocation failed.
\n
"
);
return
;
goto
out
;
}
memset
(
port
,
0
,
sizeof
(
struct
ns558
));
memset
(
port
,
0
,
sizeof
(
struct
ns558
));
port
->
type
=
NS558_ISA
;
port
->
size
=
(
1
<<
i
);
port
->
gameport
.
io
=
io
;
...
...
@@ -148,8 +160,6 @@ static void ns558_isa_probe(int io)
sprintf
(
port
->
phys
,
"isa%04x/gameport0"
,
io
&
(
-
1
<<
i
));
sprintf
(
port
->
name
,
"NS558 ISA"
);
request_region
(
io
&
(
-
1
<<
i
),
(
1
<<
i
),
"ns558-isa"
);
gameport_register_port
(
&
port
->
gameport
);
printk
(
KERN_INFO
"gameport: NS558 ISA at %#x"
,
port
->
gameport
.
io
);
...
...
@@ -157,6 +167,9 @@ static void ns558_isa_probe(int io)
printk
(
" speed %d kHz
\n
"
,
port
->
gameport
.
speed
);
list_add
(
&
port
->
node
,
&
ns558_list
);
return
;
out:
release_region
(
io
&
(
-
1
<<
i
),
(
1
<<
i
));
}
#ifdef CONFIG_PNP
...
...
drivers/input/keyboard/Kconfig
View file @
dd394d1a
...
...
@@ -17,6 +17,7 @@ config KEYBOARD_ATKBD
depends on INPUT && INPUT_KEYBOARD
select SERIO
select SERIO_I8042 if PC
select SERIO_GSCPS2 if GSC
help
Say Y here if you want to use a standard AT or PS/2 keyboard. Usually
you'll need this, unless you have a different type keyboard (USB, ADB
...
...
drivers/input/keyboard/atkbd.c
View file @
dd394d1a
...
...
@@ -37,14 +37,13 @@ MODULE_LICENSE("GPL");
static
int
atkbd_set
=
2
;
module_param_named
(
set
,
atkbd_set
,
int
,
0
);
MODULE_PARM_DESC
(
set
,
"Select keyboard code set (2 = default, 3, 4)"
);
MODULE_PARM_DESC
(
set
,
"Select keyboard code set (2 = default, 3 = PS/2 native)"
);
#if defined(__i386__) || defined(__x86_64__) || defined(__hppa__)
static
int
atkbd_reset
;
#else
static
int
atkbd_reset
=
1
;
#endif
static
int
atkbd_softrepeat
;
module_param_named
(
reset
,
atkbd_reset
,
bool
,
0
);
MODULE_PARM_DESC
(
reset
,
"Reset keyboard during initialization"
);
...
...
@@ -52,6 +51,14 @@ static int atkbd_softrepeat;
module_param_named
(
softrepeat
,
atkbd_softrepeat
,
bool
,
0
);
MODULE_PARM_DESC
(
softrepeat
,
"Use software keyboard repeat"
);
static
int
atkbd_scroll
;
module_param_named
(
scroll
,
atkbd_scroll
,
bool
,
0
);
MODULE_PARM_DESC
(
scroll
,
"Enable scroll-wheel on MS Office and similar keyboards"
);
static
int
atkbd_extra
;
module_param_named
(
extra
,
atkbd_extra
,
bool
,
0
);
MODULE_PARM_DESC
(
extra
,
"Enable extra LEDs and keys on IBM RapidAcces, EzKey and similar keyboards"
);
/*
* Scancode to keycode tables. These are just the default setting, and
* are loadable via an userland utility.
...
...
@@ -127,11 +134,11 @@ static unsigned char atkbd_unxlate_table[128] = {
#define ATKBD_CMD_EX_SETLEDS 0x20eb
#define ATKBD_CMD_OK_GETID 0x02e8
#define ATKBD_RET_ACK 0xfa
#define ATKBD_RET_NAK 0xfe
#define ATKBD_RET_BAT 0xaa
#define ATKBD_RET_EMUL0 0xe0
#define ATKBD_RET_EMULX 0x80
#define ATKBD_RET_EMUL1 0xe1
#define ATKBD_RET_RELEASE 0xf0
#define ATKBD_RET_HANGUEL 0xf1
...
...
@@ -141,6 +148,22 @@ static unsigned char atkbd_unxlate_table[128] = {
#define ATKBD_KEY_UNKNOWN 0
#define ATKBD_KEY_NULL 255
#define ATKBD_SCR_1 254
#define ATKBD_SCR_2 253
#define ATKBD_SCR_4 252
#define ATKBD_SCR_8 251
#define ATKBD_SCR_CLICK 250
#define ATKBD_SPECIAL 250
static
unsigned
char
atkbd_scroll_keys
[
5
][
2
]
=
{
{
ATKBD_SCR_1
,
0x45
},
{
ATKBD_SCR_2
,
0x29
},
{
ATKBD_SCR_4
,
0x36
},
{
ATKBD_SCR_8
,
0x27
},
{
ATKBD_SCR_CLICK
,
0x60
},
};
/*
* The atkbd control structure
*/
...
...
@@ -155,6 +178,7 @@ struct atkbd {
unsigned
char
cmdbuf
[
4
];
unsigned
char
cmdcnt
;
unsigned
char
set
;
unsigned
char
extra
;
unsigned
char
release
;
int
lastkey
;
volatile
signed
char
ack
;
...
...
@@ -189,6 +213,7 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
{
struct
atkbd
*
atkbd
=
serio
->
private
;
unsigned
int
code
=
data
;
int
scroll
=
0
,
click
=
-
1
;
int
value
;
#ifdef ATKBD_DEBUG
...
...
@@ -284,6 +309,21 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
else
printk
(
KERN_WARNING
"atkbd.c: Use 'setkeycodes %s%02x <keycode>' to make it known.
\n
"
,
code
&
0x80
?
"e0"
:
""
,
code
&
0x7f
);
break
;
case
ATKBD_SCR_1
:
scroll
=
1
-
atkbd
->
release
*
2
;
break
;
case
ATKBD_SCR_2
:
scroll
=
2
-
atkbd
->
release
*
4
;
break
;
case
ATKBD_SCR_4
:
scroll
=
4
-
atkbd
->
release
*
8
;
break
;
case
ATKBD_SCR_8
:
scroll
=
8
-
atkbd
->
release
*
16
;
break
;
case
ATKBD_SCR_CLICK
:
click
=
!
atkbd
->
release
;
break
;
default:
value
=
atkbd
->
release
?
0
:
(
1
+
(
!
atkbd_softrepeat
&&
test_bit
(
atkbd
->
keycode
[
code
],
atkbd
->
dev
.
key
)));
...
...
@@ -305,6 +345,13 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
atkbd_report_key
(
&
atkbd
->
dev
,
regs
,
atkbd
->
keycode
[
code
],
value
);
}
if
(
scroll
||
click
!=
-
1
)
{
input_regs
(
&
atkbd
->
dev
,
regs
);
input_report_key
(
&
atkbd
->
dev
,
BTN_MIDDLE
,
click
);
input_report_rel
(
&
atkbd
->
dev
,
REL_WHEEL
,
scroll
);
input_sync
(
&
atkbd
->
dev
);
}
atkbd
->
release
=
0
;
out:
return
IRQ_HANDLED
;
...
...
@@ -420,7 +467,7 @@ static int atkbd_event(struct input_dev *dev, unsigned int type, unsigned int co
|
(
test_bit
(
LED_CAPSL
,
dev
->
led
)
?
4
:
0
);
atkbd_command
(
atkbd
,
param
,
ATKBD_CMD_SETLEDS
);
if
(
atkbd
->
set
==
4
)
{
if
(
atkbd
->
extra
)
{
param
[
0
]
=
0
;
param
[
1
]
=
(
test_bit
(
LED_COMPOSE
,
dev
->
led
)
?
0x01
:
0
)
|
(
test_bit
(
LED_SLEEP
,
dev
->
led
)
?
0x02
:
0
)
...
...
@@ -529,21 +576,22 @@ static int atkbd_set_3(struct atkbd *atkbd)
return
3
;
}
if
(
atkbd_set
!=
2
)
if
(
!
atkbd_command
(
atkbd
,
param
,
ATKBD_CMD_OK_GETID
))
{
atkbd
->
id
=
param
[
0
]
<<
8
|
param
[
1
];
if
(
atkbd_extra
)
{
param
[
0
]
=
0x71
;
if
(
!
atkbd_command
(
atkbd
,
param
,
ATKBD_CMD_EX_ENABLE
))
{
atkbd
->
extra
=
1
;
return
2
;
}
if
(
atkbd_set
==
4
)
{
param
[
0
]
=
0x71
;
if
(
!
atkbd_command
(
atkbd
,
param
,
ATKBD_CMD_EX_ENABLE
))
return
4
;
}
if
(
atkbd_set
!=
3
)
return
2
;
if
(
!
atkbd_command
(
atkbd
,
param
,
ATKBD_CMD_OK_GETID
))
{
atkbd
->
id
=
param
[
0
]
<<
8
|
param
[
1
];
return
2
;
}
param
[
0
]
=
3
;
if
(
atkbd_command
(
atkbd
,
param
,
ATKBD_CMD_SSCANSET
))
return
2
;
...
...
@@ -696,24 +744,32 @@ static void atkbd_connect(struct serio *serio, struct serio_dev *dev)
atkbd
->
id
=
0xab00
;
}
if
(
atkbd
->
set
==
4
)
{
if
(
atkbd
->
extra
)
{
atkbd
->
dev
.
ledbit
[
0
]
|=
BIT
(
LED_COMPOSE
)
|
BIT
(
LED_SUSPEND
)
|
BIT
(
LED_SLEEP
)
|
BIT
(
LED_MUTE
)
|
BIT
(
LED_MISC
);
sprintf
(
atkbd
->
name
,
"AT Set 2 Ext
ended
keyboard"
);
sprintf
(
atkbd
->
name
,
"AT Set 2 Ext
ra
keyboard"
);
}
else
sprintf
(
atkbd
->
name
,
"AT %s Set %d keyboard"
,
atkbd
->
translated
?
"Translated"
:
"Raw"
,
atkbd
->
set
);
sprintf
(
atkbd
->
phys
,
"%s/input0"
,
serio
->
phys
);
if
(
atkbd_scroll
)
{
for
(
i
=
0
;
i
<
5
;
i
++
)
atkbd_set2_keycode
[
atkbd_scroll_keys
[
i
][
1
]]
=
atkbd_scroll_keys
[
i
][
0
];
atkbd
->
dev
.
evbit
[
0
]
|=
BIT
(
EV_REL
);
atkbd
->
dev
.
relbit
[
0
]
=
BIT
(
REL_WHEEL
);
set_bit
(
BTN_MIDDLE
,
atkbd
->
dev
.
keybit
);
}
if
(
atkbd
->
translated
)
{
for
(
i
=
0
;
i
<
128
;
i
++
)
{
atkbd
->
keycode
[
i
]
=
atkbd_set2_keycode
[
atkbd_unxlate_table
[
i
]];
atkbd
->
keycode
[
i
|
0x80
]
=
atkbd_set2_keycode
[
atkbd_unxlate_table
[
i
]
|
0x80
];
}
}
else
if
(
atkbd
->
set
==
2
)
{
memcpy
(
atkbd
->
keycode
,
atkbd_set2_keycode
,
sizeof
(
atkbd
->
keycode
));
}
else
{
}
else
if
(
atkbd
->
set
==
3
)
{
memcpy
(
atkbd
->
keycode
,
atkbd_set3_keycode
,
sizeof
(
atkbd
->
keycode
));
}
else
{
memcpy
(
atkbd
->
keycode
,
atkbd_set2_keycode
,
sizeof
(
atkbd
->
keycode
));
}
atkbd
->
dev
.
name
=
atkbd
->
name
;
...
...
@@ -724,7 +780,7 @@ static void atkbd_connect(struct serio *serio, struct serio_dev *dev)
atkbd
->
dev
.
id
.
version
=
atkbd
->
id
;
for
(
i
=
0
;
i
<
512
;
i
++
)
if
(
atkbd
->
keycode
[
i
]
&&
atkbd
->
keycode
[
i
]
<
255
)
if
(
atkbd
->
keycode
[
i
]
&&
atkbd
->
keycode
[
i
]
<
ATKBD_SPECIAL
)
set_bit
(
atkbd
->
keycode
[
i
],
atkbd
->
dev
.
keybit
);
input_register_device
(
&
atkbd
->
dev
);
...
...
@@ -741,46 +797,20 @@ static int atkbd_reconnect(struct serio *serio)
{
struct
atkbd
*
atkbd
=
serio
->
private
;
struct
serio_dev
*
dev
=
serio
->
dev
;
int
i
;
if
(
!
dev
)
{
printk
(
KERN_DEBUG
"atkbd: reconnect request, but serio is disconnected, ignoring...
\n
"
);
return
-
1
;
}
if
(
!
dev
)
{
printk
(
KERN_DEBUG
"atkbd: reconnect request, but serio is disconnected, ignoring...
\n
"
);
return
-
1
;
}
if
(
atkbd
->
write
)
{
if
(
atkbd_probe
(
atkbd
))
return
-
1
;
atkbd
->
set
=
atkbd_set_3
(
atkbd
)
;
if
(
atkbd
->
set
!=
atkbd_set_3
(
atkbd
))
return
-
1
;
atkbd_enable
(
atkbd
);
}
else
{
atkbd
->
set
=
2
;
atkbd
->
id
=
0xab00
;
}
/*
* Here we probably should check if the keyboard has the same set that
* it had before and bail out if it's different. But this will most likely
* cause new keyboard device be created... and for the user it will look
* like keyboard is lost
*/
if
(
atkbd
->
translated
)
{
for
(
i
=
0
;
i
<
128
;
i
++
)
{
atkbd
->
keycode
[
i
]
=
atkbd_set2_keycode
[
atkbd_unxlate_table
[
i
]];
atkbd
->
keycode
[
i
|
0x80
]
=
atkbd_set2_keycode
[
atkbd_unxlate_table
[
i
]
|
0x80
];
}
}
else
if
(
atkbd
->
set
==
2
)
{
memcpy
(
atkbd
->
keycode
,
atkbd_set2_keycode
,
sizeof
(
atkbd
->
keycode
));
}
else
{
memcpy
(
atkbd
->
keycode
,
atkbd_set3_keycode
,
sizeof
(
atkbd
->
keycode
));
}
for
(
i
=
0
;
i
<
512
;
i
++
)
if
(
atkbd
->
keycode
[
i
]
&&
atkbd
->
keycode
[
i
]
<
255
)
set_bit
(
atkbd
->
keycode
[
i
],
atkbd
->
dev
.
keybit
);
return
0
;
}
...
...
drivers/input/keyboard/hpps2atkbd.h
View file @
dd394d1a
This diff is collapsed.
Click to expand it.
drivers/input/keyboard/sunkbd.c
View file @
dd394d1a
...
...
@@ -77,6 +77,7 @@ struct sunkbd {
struct
input_dev
dev
;
struct
serio
*
serio
;
struct
work_struct
tq
;
wait_queue_head_t
wait
;
char
name
[
64
];
char
phys
[
32
];
char
type
;
...
...
@@ -96,11 +97,13 @@ static irqreturn_t sunkbd_interrupt(struct serio *serio,
if
(
sunkbd
->
reset
<=
-
1
)
{
/* If cp[i] is 0xff, sunkbd->reset will stay -1. */
sunkbd
->
reset
=
data
;
/* The keyboard sends 0xff 0xff 0xID on powerup */
wake_up_interruptible
(
&
sunkbd
->
wait
);
goto
out
;
}
if
(
sunkbd
->
layout
==
-
1
)
{
sunkbd
->
layout
=
data
;
wake_up_interruptible
(
&
sunkbd
->
wait
);
goto
out
;
}
...
...
@@ -176,22 +179,19 @@ static int sunkbd_event(struct input_dev *dev, unsigned int type, unsigned int c
static
int
sunkbd_initialize
(
struct
sunkbd
*
sunkbd
)
{
int
t
;
t
=
1000
;
sunkbd
->
reset
=
-
2
;
sunkbd
->
serio
->
write
(
sunkbd
->
serio
,
SUNKBD_CMD_RESET
);
while
(
sunkbd
->
reset
<
0
&&
--
t
)
mdelay
(
1
);
if
(
!
t
)
return
-
1
;
wait_event_interruptible_timeout
(
sunkbd
->
wait
,
sunkbd
->
reset
>=
0
,
HZ
);
if
(
sunkbd
->
reset
<
0
)
return
-
1
;
sunkbd
->
type
=
sunkbd
->
reset
;
if
(
sunkbd
->
type
==
4
)
{
/* Type 4 keyboard */
t
=
250
;
sunkbd
->
layout
=
-
2
;
sunkbd
->
serio
->
write
(
sunkbd
->
serio
,
SUNKBD_CMD_LAYOUT
);
w
hile
(
sunkbd
->
layout
<
0
&&
--
t
)
mdelay
(
1
);
if
(
!
t
)
return
-
1
;
w
ait_event_interruptible_timeout
(
sunkbd
->
wait
,
sunkbd
->
layout
>=
0
,
HZ
/
4
);
if
(
sunkbd
->
layout
<
0
)
return
-
1
;
if
(
sunkbd
->
layout
&
SUNKBD_LAYOUT_5_MASK
)
sunkbd
->
type
=
5
;
}
...
...
@@ -206,9 +206,8 @@ static int sunkbd_initialize(struct sunkbd *sunkbd)
static
void
sunkbd_reinit
(
void
*
data
)
{
struct
sunkbd
*
sunkbd
=
data
;
int
t
=
1000
;
w
hile
(
sunkbd
->
reset
<
0
&&
--
t
)
mdelay
(
1
);
w
ait_event_interruptible_timeout
(
sunkbd
->
wait
,
sunkbd
->
reset
>=
0
,
HZ
);
sunkbd
->
serio
->
write
(
sunkbd
->
serio
,
SUNKBD_CMD_SETLED
);
sunkbd
->
serio
->
write
(
sunkbd
->
serio
,
...
...
@@ -239,6 +238,7 @@ static void sunkbd_connect(struct serio *serio, struct serio_dev *dev)
memset
(
sunkbd
,
0
,
sizeof
(
struct
sunkbd
));
init_input_dev
(
&
sunkbd
->
dev
);
init_waitqueue_head
(
&
sunkbd
->
wait
);
sunkbd
->
dev
.
evbit
[
0
]
=
BIT
(
EV_KEY
)
|
BIT
(
EV_LED
)
|
BIT
(
EV_SND
)
|
BIT
(
EV_REP
);
sunkbd
->
dev
.
ledbit
[
0
]
=
BIT
(
LED_CAPSL
)
|
BIT
(
LED_COMPOSE
)
|
BIT
(
LED_SCROLLL
)
|
BIT
(
LED_NUML
);
...
...
@@ -275,7 +275,7 @@ static void sunkbd_connect(struct serio *serio, struct serio_dev *dev)
set_bit
(
sunkbd
->
keycode
[
i
],
sunkbd
->
dev
.
keybit
);
clear_bit
(
0
,
sunkbd
->
dev
.
keybit
);
sprintf
(
sunkbd
->
name
,
"%s/input
"
,
serio
->
phys
);
sprintf
(
sunkbd
->
phys
,
"%s/input0
"
,
serio
->
phys
);
sunkbd
->
dev
.
name
=
sunkbd
->
name
;
sunkbd
->
dev
.
phys
=
sunkbd
->
phys
;
...
...
drivers/input/misc/Kconfig
View file @
dd394d1a
...
...
@@ -54,12 +54,3 @@ config INPUT_UINPUT
To compile this driver as a module, choose M here: the
module will be called uinput.
config INPUT_GSC
tristate "PA-RISC GSC PS/2 keyboard/mouse support"
depends on GSC && INPUT && INPUT_MISC
help
Say Y here if you have a PS/2 keyboard and/or mouse attached
to your PA-RISC box. HP run the keyboard in AT mode rather than
XT mode like everyone else, so we need our own driver.
Furthermore, the GSC PS/2 controller shares IRQ between mouse and
keyboard.
drivers/input/misc/Makefile
View file @
dd394d1a
...
...
@@ -9,4 +9,3 @@ obj-$(CONFIG_INPUT_PCSPKR) += pcspkr.o
obj-$(CONFIG_INPUT_M68K_BEEP)
+=
m68kspkr.o
obj-$(CONFIG_INPUT_98SPKR)
+=
98spkr.o
obj-$(CONFIG_INPUT_UINPUT)
+=
uinput.o
obj-$(CONFIG_INPUT_GSC)
+=
gsc_ps2.o
drivers/input/misc/gsc_ps2.c
deleted
100644 → 0
View file @
a6eebfd5
This diff is collapsed.
Click to expand it.
drivers/input/mouse/Kconfig
View file @
dd394d1a
...
...
@@ -17,6 +17,7 @@ config MOUSE_PS2
depends on INPUT && INPUT_MOUSE
select SERIO
select SERIO_I8042 if PC
select SERIO_GSCPS2 if GSC
---help---
Say Y here if you have a PS/2 mouse connected to your system. This
includes the standard 2 or 3-button PS/2 mouse, as well as PS/2
...
...
drivers/input/serio/Kconfig
View file @
dd394d1a
...
...
@@ -20,6 +20,7 @@ config SERIO_I8042
tristate "i8042 PC Keyboard controller" if EMBEDDED || !X86
default y
select SERIO
depends on !PARISC
---help---
i8042 is the chip over which the standard AT keyboard and PS/2
mouse are connected to the computer. If you use these devices,
...
...
@@ -48,6 +49,7 @@ config SERIO_SERPORT
config SERIO_CT82C710
tristate "ct82c710 Aux port controller"
depends on SERIO
depends on !PARISC
---help---
Say Y here if you have a Texas Instruments TravelMate notebook
equipped with the ct82c710 chip and want to use a mouse connected
...
...
@@ -105,6 +107,20 @@ config SERIO_98KBD
To compile this driver as a module, choose M here: the
module will be called 98kbd-io.
config SERIO_GSCPS2
tristate "HP GSC PS/2 keyboard and PS/2 mouse controller"
depends on GSC && SERIO
default y
help
This driver provides support for the PS/2 ports on PA-RISC machines
over which HP PS/2 keyboards and PS/2 mice may be connected.
If you use these devices, you'll need to say Y here.
It's safe to enable this driver, so if unsure, say Y.
To compile this driver as a module, choose M here: the
module will be called gscps2.
config SERIO_PCIPS2
tristate "PCI PS/2 keyboard and PS/2 mouse controller"
depends on PCI && SERIO
...
...
drivers/input/serio/Makefile
View file @
dd394d1a
...
...
@@ -14,4 +14,5 @@ obj-$(CONFIG_SERIO_SA1111) += sa1111ps2.o
obj-$(CONFIG_SERIO_AMBAKMI)
+=
ambakmi.o
obj-$(CONFIG_SERIO_Q40KBD)
+=
q40kbd.o
obj-$(CONFIG_SERIO_98KBD)
+=
98kbd-io.o
obj-$(CONFIG_SERIO_GSCPS2)
+=
gscps2.o
obj-$(CONFIG_SERIO_PCIPS2)
+=
pcips2.o
drivers/input/serio/gscps2.c
0 → 100644
View file @
dd394d1a
This diff is collapsed.
Click to expand it.
drivers/input/serio/i8042.c
View file @
dd394d1a
...
...
@@ -379,6 +379,8 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id, struct pt_regs *regs)
unsigned
int
dfl
;
int
ret
;
mod_timer
(
&
i8042_timer
,
jiffies
+
I8042_POLL_PERIOD
);
spin_lock_irqsave
(
&
i8042_lock
,
flags
);
str
=
i8042_read_status
();
if
(
str
&
I8042_STR_OBF
)
...
...
@@ -433,7 +435,6 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id, struct pt_regs *regs)
irq_ret:
ret
=
1
;
out:
mod_timer
(
&
i8042_timer
,
jiffies
+
I8042_POLL_PERIOD
);
return
IRQ_RETVAL
(
ret
);
}
...
...
drivers/usb/input/hid-core.c
View file @
dd394d1a
...
...
@@ -224,6 +224,9 @@ static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsign
offset
=
report
->
size
;
report
->
size
+=
parser
->
global
.
report_size
*
parser
->
global
.
report_count
;
if
(
usages
<
parser
->
global
.
report_count
)
usages
=
parser
->
global
.
report_count
;
if
(
usages
==
0
)
return
0
;
/* ignore padding fields */
...
...
@@ -235,9 +238,13 @@ static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsign
field
->
application
=
hid_lookup_collection
(
parser
,
HID_COLLECTION_APPLICATION
);
for
(
i
=
0
;
i
<
usages
;
i
++
)
{
field
->
usage
[
i
].
hid
=
parser
->
local
.
usage
[
i
];
int
j
=
i
;
/* Duplicate the last usage we parsed if we have excess values */
if
(
i
>=
parser
->
local
.
usage_index
)
j
=
parser
->
local
.
usage_index
-
1
;
field
->
usage
[
i
].
hid
=
parser
->
local
.
usage
[
j
];
field
->
usage
[
i
].
collection_index
=
parser
->
local
.
collection_index
[
i
];
parser
->
local
.
collection_index
[
j
];
}
field
->
maxusage
=
usages
;
...
...
@@ -1315,7 +1322,6 @@ void hid_init_reports(struct hid_device *hid)
#define USB_VENDOR_ID_KBGEAR 0x084e
#define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001
#define USB_VENDOR_ID_AIPTEK 0x08ca
#define USB_DEVICE_ID_AIPTEK_6000 0x0020
...
...
@@ -1354,17 +1360,40 @@ void hid_init_reports(struct hid_device *hid)
#define USB_VENDOR_ID_A4TECH 0x09DA
#define USB_DEVICE_ID_A4TECH_WCP32PU 0x0006
#define USB_VENDOR_ID_CYPRESS 0x04b4
#define USB_DEVICE_ID_CYPRESS_MOUSE 0x0001
#define USB_VENDOR_ID_BERKSHIRE 0x0c98
#define USB_DEVICE_ID_BERKSHIRE_PCWD 0x1140
#define USB_VENDOR_ID_ALPS 0x0433
#define USB_DEVICE_ID_IBM_GAMEPAD 0x1101
#define USB_VENDOR_ID_SAITEK 0x06a3
#define USB_DEVICE_ID_SAITEK_RUMBLEPAD 0xff17
struct
hid_blacklist
{
__u16
idVendor
;
__u16
idProduct
;
unsigned
quirks
;
}
hid_blacklist
[]
=
{
{
USB_VENDOR_ID_AIPTEK
,
USB_DEVICE_ID_AIPTEK_6000
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_BERKSHIRE
,
USB_DEVICE_ID_BERKSHIRE_PCWD
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_ESSENTIAL_REALITY
,
USB_DEVICE_ID_ESSENTIAL_REALITY_P5
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_KBGEAR
,
USB_DEVICE_ID_KBGEAR_JAMSTUDIO
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_GRIFFIN
,
USB_DEVICE_ID_POWERMATE
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_GRIFFIN
,
USB_DEVICE_ID_SOUNDKNOB
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_MGE
,
USB_DEVICE_ID_MGE_UPS
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_MGE
,
USB_DEVICE_ID_MGE_UPS1
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_ONTRAK
,
USB_DEVICE_ID_ONTRAK_ADU100
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_ONTRAK
,
USB_DEVICE_ID_ONTRAK_ADU100
+
100
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_ONTRAK
,
USB_DEVICE_ID_ONTRAK_ADU100
+
200
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_ONTRAK
,
USB_DEVICE_ID_ONTRAK_ADU100
+
300
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_ONTRAK
,
USB_DEVICE_ID_ONTRAK_ADU100
+
400
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_ONTRAK
,
USB_DEVICE_ID_ONTRAK_ADU100
+
500
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_WACOM
,
USB_DEVICE_ID_WACOM_PENPARTNER
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_WACOM
,
USB_DEVICE_ID_WACOM_GRAPHIRE
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_WACOM
,
USB_DEVICE_ID_WACOM_GRAPHIRE
+
1
,
HID_QUIRK_IGNORE
},
...
...
@@ -1386,32 +1415,24 @@ struct hid_blacklist {
{
USB_VENDOR_ID_WACOM
,
USB_DEVICE_ID_WACOM_INTUOS2
+
2
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_WACOM
,
USB_DEVICE_ID_WACOM_INTUOS2
+
3
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_WACOM
,
USB_DEVICE_ID_WACOM_INTUOS2
+
4
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_KBGEAR
,
USB_DEVICE_ID_KBGEAR_JAMSTUDIO
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_AIPTEK
,
USB_DEVICE_ID_AIPTEK_6000
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_GRIFFIN
,
USB_DEVICE_ID_POWERMATE
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_GRIFFIN
,
USB_DEVICE_ID_SOUNDKNOB
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_ATEN
,
USB_DEVICE_ID_ATEN_UC100KM
,
HID_QUIRK_NOGET
},
{
USB_VENDOR_ID_ATEN
,
USB_DEVICE_ID_ATEN_CS124U
,
HID_QUIRK_NOGET
},
{
USB_VENDOR_ID_ATEN
,
USB_DEVICE_ID_ATEN_2PORTKVM
,
HID_QUIRK_NOGET
},
{
USB_VENDOR_ID_ATEN
,
USB_DEVICE_ID_ATEN_4PORTKVM
,
HID_QUIRK_NOGET
},
{
USB_VENDOR_ID_ATEN
,
USB_DEVICE_ID_ATEN_4PORTKVMC
,
HID_QUIRK_NOGET
},
{
USB_VENDOR_ID_MGE
,
USB_DEVICE_ID_MGE_UPS
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_MGE
,
USB_DEVICE_ID_MGE_UPS1
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_TOPMAX
,
USB_DEVICE_ID_TOPMAX_COBRAPAD
,
HID_QUIRK_BADPAD
},
{
USB_VENDOR_ID_HAPP
,
USB_DEVICE_ID_UGCI_DRIVING
,
HID_QUIRK_BADPAD
|
HID_QUIRK_MULTI_INPUT
},
{
USB_VENDOR_ID_HAPP
,
USB_DEVICE_ID_UGCI_FLYING
,
HID_QUIRK_BADPAD
|
HID_QUIRK_MULTI_INPUT
},
{
USB_VENDOR_ID_HAPP
,
USB_DEVICE_ID_UGCI_FIGHTING
,
HID_QUIRK_BADPAD
|
HID_QUIRK_MULTI_INPUT
},
{
USB_VENDOR_ID_ONTRAK
,
USB_DEVICE_ID_ONTRAK_ADU100
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_ONTRAK
,
USB_DEVICE_ID_ONTRAK_ADU100
+
100
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_ONTRAK
,
USB_DEVICE_ID_ONTRAK_ADU100
+
200
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_ONTRAK
,
USB_DEVICE_ID_ONTRAK_ADU100
+
300
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_ONTRAK
,
USB_DEVICE_ID_ONTRAK_ADU100
+
400
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_ONTRAK
,
USB_DEVICE_ID_ONTRAK_ADU100
+
500
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_TANGTOP
,
USB_DEVICE_ID_TANGTOP_USBPS2
,
HID_QUIRK_NOGET
},
{
USB_VENDOR_ID_ESSENTIAL_REALITY
,
USB_DEVICE_ID_ESSENTIAL_REALITY_P5
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_A4TECH
,
USB_DEVICE_ID_A4TECH_WCP32PU
,
HID_QUIRK_2WHEEL_MOUSE_HACK
},
{
USB_VENDOR_ID_BERKSHIRE
,
USB_DEVICE_ID_BERKSHIRE_PCWD
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_CYPRESS
,
USB_DEVICE_ID_CYPRESS_MOUSE
,
HID_QUIRK_2WHEEL_MOUSE_HACK
},
{
USB_VENDOR_ID_ALPS
,
USB_DEVICE_ID_IBM_GAMEPAD
,
HID_QUIRK_BADPAD
},
{
USB_VENDOR_ID_HAPP
,
USB_DEVICE_ID_UGCI_DRIVING
,
HID_QUIRK_BADPAD
|
HID_QUIRK_MULTI_INPUT
},
{
USB_VENDOR_ID_HAPP
,
USB_DEVICE_ID_UGCI_FLYING
,
HID_QUIRK_BADPAD
|
HID_QUIRK_MULTI_INPUT
},
{
USB_VENDOR_ID_HAPP
,
USB_DEVICE_ID_UGCI_FIGHTING
,
HID_QUIRK_BADPAD
|
HID_QUIRK_MULTI_INPUT
},
{
USB_VENDOR_ID_SAITEK
,
USB_DEVICE_ID_SAITEK_RUMBLEPAD
,
HID_QUIRK_BADPAD
},
{
USB_VENDOR_ID_TOPMAX
,
USB_DEVICE_ID_TOPMAX_COBRAPAD
,
HID_QUIRK_BADPAD
},
{
0
,
0
}
};
...
...
drivers/usb/input/hid-input.c
View file @
dd394d1a
...
...
@@ -432,20 +432,21 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
input_regs
(
input
,
regs
);
if
((
hid
->
quirks
&
HID_QUIRK_2WHEEL_MOUSE_HACK
)
&&
(
usage
->
code
==
BTN_BACK
))
{
&&
(
usage
->
code
==
BTN_BACK
||
usage
->
code
==
BTN_EXTRA
))
{
if
(
value
)
hid
->
quirks
|=
HID_QUIRK_2WHEEL_MOUSE_HACK_ON
;
else
hid
->
quirks
&=
~
HID_QUIRK_2WHEEL_MOUSE_HACK_ON
;
return
;
}
if
((
hid
->
quirks
&
HID_QUIRK_2WHEEL_MOUSE_HACK_ON
)
&&
(
usage
->
code
==
REL_WHEEL
))
{
input_event
(
input
,
usage
->
type
,
REL_HWHEEL
,
value
);
return
;
}
if
(
usage
->
hat_min
!=
usage
->
hat_max
)
{
if
(
usage
->
hat_min
!=
usage
->
hat_max
)
{
/* FIXME: hat_max can be 0 and hat_min 1 */
value
=
(
value
-
usage
->
hat_min
)
*
8
/
(
usage
->
hat_max
-
usage
->
hat_min
+
1
)
+
1
;
if
(
value
<
0
||
value
>
8
)
value
=
0
;
input_event
(
input
,
usage
->
type
,
usage
->
code
,
hid_hat_to_axis
[
value
].
x
);
...
...
@@ -484,7 +485,7 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
return
;
}
if
((
usage
->
type
==
EV_KEY
)
&&
(
usage
->
code
==
0
))
/* Key 0 is "unassigned", not KEY_UKNOWN */
if
((
usage
->
type
==
EV_KEY
)
&&
(
usage
->
code
==
0
))
/* Key 0 is "unassigned", not KEY_U
N
KNOWN */
return
;
input_event
(
input
,
usage
->
type
,
usage
->
code
,
value
);
...
...
drivers/usb/input/hiddev.c
View file @
dd394d1a
...
...
@@ -403,7 +403,8 @@ static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd
struct
hiddev_collection_info
cinfo
;
struct
hiddev_report_info
rinfo
;
struct
hiddev_field_info
finfo
;
struct
hiddev_usage_ref
uref
;
struct
hiddev_usage_ref_multi
uref_multi
;
struct
hiddev_usage_ref
*
uref
=
&
uref_multi
.
uref
;
struct
hiddev_devinfo
dinfo
;
struct
hid_report
*
report
;
struct
hid_field
*
field
;
...
...
@@ -575,68 +576,98 @@ static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd
return
0
;
case
HIDIOCGUCODE
:
if
(
copy_from_user
(
&
uref
,
(
void
*
)
arg
,
sizeof
(
uref
)))
if
(
copy_from_user
(
uref
,
(
void
*
)
arg
,
sizeof
(
*
uref
)))
return
-
EFAULT
;
rinfo
.
report_type
=
uref
.
report_type
;
rinfo
.
report_id
=
uref
.
report_id
;
rinfo
.
report_type
=
uref
->
report_type
;
rinfo
.
report_id
=
uref
->
report_id
;
if
((
report
=
hiddev_lookup_report
(
hid
,
&
rinfo
))
==
NULL
)
return
-
EINVAL
;
if
(
uref
.
field_index
>=
report
->
maxfield
)
if
(
uref
->
field_index
>=
report
->
maxfield
)
return
-
EINVAL
;
field
=
report
->
field
[
uref
.
field_index
];
if
(
uref
.
usage_index
>=
field
->
maxusage
)
field
=
report
->
field
[
uref
->
field_index
];
if
(
uref
->
usage_index
>=
field
->
maxusage
)
return
-
EINVAL
;
uref
.
usage_code
=
field
->
usage
[
uref
.
usage_index
].
hid
;
uref
->
usage_code
=
field
->
usage
[
uref
->
usage_index
].
hid
;
if
(
copy_to_user
((
void
*
)
arg
,
&
uref
,
sizeof
(
uref
)))
if
(
copy_to_user
((
void
*
)
arg
,
uref
,
sizeof
(
*
uref
)))
return
-
EFAULT
;
return
0
;
case
HIDIOCGUSAGE
:
case
HIDIOCSUSAGE
:
case
HIDIOCGUSAGES
:
case
HIDIOCSUSAGES
:
case
HIDIOCGCOLLECTIONINDEX
:
if
(
copy_from_user
(
&
uref
,
(
void
*
)
arg
,
sizeof
(
uref
)))
return
-
EFAULT
;
if
(
cmd
==
HIDIOCGUSAGES
||
cmd
==
HIDIOCSUSAGES
)
{
if
(
copy_from_user
(
&
uref_multi
,
(
void
*
)
arg
,
sizeof
(
uref_multi
)))
return
-
EFAULT
;
}
else
{
if
(
copy_from_user
(
uref
,
(
void
*
)
arg
,
sizeof
(
*
uref
)))
return
-
EFAULT
;
}
if
(
cmd
!=
HIDIOCGUSAGE
&&
uref
.
report_type
==
HID_REPORT_TYPE_INPUT
)
return
-
EINVAL
;
if
(
cmd
!=
HIDIOCGUSAGE
&&
cmd
!=
HIDIOCGUSAGES
&&
uref
->
report_type
==
HID_REPORT_TYPE_INPUT
)
return
-
EINVAL
;
if
(
uref
.
report_id
==
HID_REPORT_ID_UNKNOWN
)
{
field
=
hiddev_lookup_usage
(
hid
,
&
uref
);
if
(
uref
->
report_id
==
HID_REPORT_ID_UNKNOWN
)
{
field
=
hiddev_lookup_usage
(
hid
,
uref
);
if
(
field
==
NULL
)
return
-
EINVAL
;
}
else
{
rinfo
.
report_type
=
uref
.
report_type
;
rinfo
.
report_id
=
uref
.
report_id
;
rinfo
.
report_type
=
uref
->
report_type
;
rinfo
.
report_id
=
uref
->
report_id
;
if
((
report
=
hiddev_lookup_report
(
hid
,
&
rinfo
))
==
NULL
)
return
-
EINVAL
;
if
(
uref
.
field_index
>=
report
->
maxfield
)
if
(
uref
->
field_index
>=
report
->
maxfield
)
return
-
EINVAL
;
field
=
report
->
field
[
uref
.
field_index
];
if
(
uref
.
usage_index
>=
field
->
maxusage
)
field
=
report
->
field
[
uref
->
field_index
];
if
(
uref
->
usage_index
>=
field
->
maxusage
)
return
-
EINVAL
;
if
(
cmd
==
HIDIOCGUSAGES
||
cmd
==
HIDIOCSUSAGES
)
{
if
(
uref_multi
.
num_values
>=
HID_MAX_USAGES
||
uref
->
usage_index
>=
field
->
maxusage
||
(
uref
->
usage_index
+
uref_multi
.
num_values
)
>=
field
->
maxusage
)
return
-
EINVAL
;
}
}
switch
(
cmd
)
{
case
HIDIOCGUSAGE
:
uref
.
value
=
field
->
value
[
uref
.
usage_index
];
if
(
copy_to_user
((
void
*
)
arg
,
&
uref
,
sizeof
(
uref
)))
uref
->
value
=
field
->
value
[
uref
->
usage_index
];
if
(
copy_to_user
((
void
*
)
arg
,
uref
,
sizeof
(
*
uref
)))
return
-
EFAULT
;
return
0
;
case
HIDIOCSUSAGE
:
field
->
value
[
uref
.
usage_index
]
=
uref
.
value
;
field
->
value
[
uref
->
usage_index
]
=
uref
->
value
;
return
0
;
case
HIDIOCGCOLLECTIONINDEX
:
return
field
->
usage
[
uref
.
usage_index
].
collection_index
;
return
field
->
usage
[
uref
->
usage_index
].
collection_index
;
case
HIDIOCGUSAGES
:
for
(
i
=
0
;
i
<
uref_multi
.
num_values
;
i
++
)
uref_multi
.
values
[
i
]
=
field
->
value
[
uref
->
usage_index
+
i
];
if
(
copy_to_user
((
void
*
)
arg
,
&
uref_multi
,
sizeof
(
uref_multi
)))
return
-
EFAULT
;
return
0
;
case
HIDIOCSUSAGES
:
for
(
i
=
0
;
i
<
uref_multi
.
num_values
;
i
++
)
field
->
value
[
uref
->
usage_index
+
i
]
=
uref_multi
.
values
[
i
];
return
0
;
}
return
0
;
...
...
drivers/usb/input/wacom.c
View file @
dd394d1a
/*
* USB Wacom Graphire and Wacom Intuos tablet support
*
* Copyright (c) 2000-200
2
Vojtech Pavlik <vojtech@ucw.cz>
* Copyright (c) 2000-200
4
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>
...
...
@@ -9,6 +9,7 @@
* Copyright (c) 2000 Daniel Egger <egger@suse.de>
* Copyright (c) 2001 Frederic Lepied <flepied@mandrakesoft.com>
* Copyright (c) 2002 Ping Cheng <pingc@wacom.com>
* Copyright (c) 2004 Panagiotis Issaris <panagiotis.issaris@mech.kuleuven.ac.be>
*
* ChangeLog:
* v0.1 (vp) - Initial release
...
...
@@ -48,6 +49,7 @@
* v1.30 (vp) - Merge 2.4 and 2.5 drivers
* - Since 2.5 now has input_sync(), remove MSC_SERIAL abuse
* - Cleanups here and there
* v1.30.1 (pi) - Added Graphire3 support
*/
/*
...
...
include/linux/hiddev.h
View file @
dd394d1a
...
...
@@ -39,33 +39,33 @@ struct hiddev_event {
};
struct
hiddev_devinfo
{
unsigned
int
bustype
;
unsigned
int
busnum
;
unsigned
int
devnum
;
unsigned
int
ifnum
;
short
vendor
;
short
product
;
short
version
;
unsigned
num_applications
;
__u32
bustype
;
__u32
busnum
;
__u32
devnum
;
__u32
ifnum
;
__s16
vendor
;
__s16
product
;
__s16
version
;
__u32
num_applications
;
};
struct
hiddev_collection_info
{
unsigned
index
;
unsigned
type
;
unsigned
usage
;
unsigned
level
;
__u32
index
;
__u32
type
;
__u32
usage
;
__u32
level
;
};
#define HID_STRING_SIZE 256
struct
hiddev_string_descriptor
{
int
index
;
__s32
index
;
char
value
[
HID_STRING_SIZE
];
};
struct
hiddev_report_info
{
unsigned
report_type
;
unsigned
report_id
;
unsigned
num_fields
;
__u32
report_type
;
__u32
report_id
;
__u32
num_fields
;
};
/* To do a GUSAGE/SUSAGE, fill in at least usage_code, report_type and
...
...
@@ -88,20 +88,20 @@ struct hiddev_report_info {
#define HID_REPORT_TYPE_MAX 3
struct
hiddev_field_info
{
unsigned
report_type
;
unsigned
report_id
;
unsigned
field_index
;
unsigned
maxusage
;
unsigned
flags
;
unsigned
physical
;
/* physical usage for this field */
unsigned
logical
;
/* logical usage for this field */
unsigned
application
;
/* application usage for this field */
__u32
report_type
;
__u32
report_id
;
__u32
field_index
;
__u32
maxusage
;
__u32
flags
;
__u32
physical
;
/* physical usage for this field */
__u32
logical
;
/* logical usage for this field */
__u32
application
;
/* application usage for this field */
__s32
logical_minimum
;
__s32
logical_maximum
;
__s32
physical_minimum
;
__s32
physical_maximum
;
unsigned
unit_exponent
;
unsigned
unit
;
__u32
unit_exponent
;
__u32
unit
;
};
/* Fill in report_type, report_id and field_index to get the information on a
...
...
@@ -118,14 +118,22 @@ struct hiddev_field_info {
#define HID_FIELD_BUFFERED_BYTE 0x100
struct
hiddev_usage_ref
{
unsigned
report_type
;
unsigned
report_id
;
unsigned
field_index
;
unsigned
usage_index
;
unsigned
usage_code
;
__u32
report_type
;
__u32
report_id
;
__u32
field_index
;
__u32
usage_index
;
__u32
usage_code
;
__s32
value
;
};
/* hiddev_usage_ref_multi is used for sending multiple bytes to a control.
* It really manifests itself as setting the value of consecutive usages */
struct
hiddev_usage_ref_multi
{
struct
hiddev_usage_ref
uref
;
__u32
num_values
;
__s32
values
[
HID_MAX_USAGES
];
};
/* FIELD_INDEX_NONE is returned in read() data from the kernel when flags
* is set to (HIDDEV_FLAG_UREF | HIDDEV_FLAG_REPORT) and a new report has
* been sent by the device
...
...
@@ -161,6 +169,10 @@ struct hiddev_usage_ref {
#define HIDIOCGCOLLECTIONINFO _IOWR('H', 0x11, struct hiddev_collection_info)
#define HIDIOCGPHYS(len) _IOC(_IOC_READ, 'H', 0x12, len)
/* For writing/reading to multiple/consecutive usages */
#define HIDIOCGUSAGES _IOWR('H', 0x13, struct hiddev_usage_ref_multi)
#define HIDIOCSUSAGES _IOW('H', 0x14, struct hiddev_usage_ref_multi)
/*
* Flags to be used in HIDIOCSFLAG
*/
...
...
include/linux/miscdevice.h
View file @
dd394d1a
...
...
@@ -3,7 +3,6 @@
#include <linux/module.h>
#include <linux/major.h>
#define BUSMOUSE_MINOR 0
#define PSMOUSE_MINOR 1
#define MS_BUSMOUSE_MINOR 2
#define ATIXL_BUSMOUSE_MINOR 3
...
...
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