Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
1953ea2d
Commit
1953ea2d
authored
Nov 04, 2007
by
Dmitry Torokhov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Input: keyspan_remote - add support for loadable keymaps
Signed-off-by:
Dmitry Torokhov
<
dtor@mail.ru
>
parent
f4f37c8e
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
67 additions
and
51 deletions
+67
-51
drivers/input/misc/keyspan_remote.c
drivers/input/misc/keyspan_remote.c
+67
-51
No files found.
drivers/input/misc/keyspan_remote.c
View file @
1953ea2d
...
...
@@ -46,53 +46,12 @@ MODULE_PARM_DESC(debug, "Enable extra debug messages and information");
#define RECV_SIZE 8
/* The UIA-11 type have a 8 byte limit. */
/* table of devices that work with this driver */
static
struct
usb_device_id
keyspan_table
[]
=
{
{
USB_DEVICE
(
USB_KEYSPAN_VENDOR_ID
,
USB_KEYSPAN_PRODUCT_UIA11
)
},
{
}
/* Terminating entry */
};
/* Structure to store all the real stuff that a remote sends to us. */
struct
keyspan_message
{
u16
system
;
u8
button
;
u8
toggle
;
};
/* Structure used for all the bit testing magic needed to be done. */
struct
bit_tester
{
u32
tester
;
int
len
;
int
pos
;
int
bits_left
;
u8
buffer
[
32
];
};
/* Structure to hold all of our driver specific stuff */
struct
usb_keyspan
{
char
name
[
128
];
char
phys
[
64
];
struct
usb_device
*
udev
;
struct
input_dev
*
input
;
struct
usb_interface
*
interface
;
struct
usb_endpoint_descriptor
*
in_endpoint
;
struct
urb
*
irq_urb
;
int
open
;
dma_addr_t
in_dma
;
unsigned
char
*
in_buffer
;
/* variables used to parse messages from remote. */
struct
bit_tester
data
;
int
stage
;
int
toggle
;
};
/*
* Table that maps the 31 possible keycodes to input keys.
* Currently there are 15 and 17 button models so RESERVED codes
* are blank areas in the mapping.
*/
static
const
in
t
keyspan_key_table
[]
=
{
static
const
unsigned
shor
t
keyspan_key_table
[]
=
{
KEY_RESERVED
,
/* 0 is just a place holder. */
KEY_RESERVED
,
KEY_STOP
,
...
...
@@ -127,6 +86,48 @@ static const int keyspan_key_table[] = {
KEY_MENU
};
/* table of devices that work with this driver */
static
struct
usb_device_id
keyspan_table
[]
=
{
{
USB_DEVICE
(
USB_KEYSPAN_VENDOR_ID
,
USB_KEYSPAN_PRODUCT_UIA11
)
},
{
}
/* Terminating entry */
};
/* Structure to store all the real stuff that a remote sends to us. */
struct
keyspan_message
{
u16
system
;
u8
button
;
u8
toggle
;
};
/* Structure used for all the bit testing magic needed to be done. */
struct
bit_tester
{
u32
tester
;
int
len
;
int
pos
;
int
bits_left
;
u8
buffer
[
32
];
};
/* Structure to hold all of our driver specific stuff */
struct
usb_keyspan
{
char
name
[
128
];
char
phys
[
64
];
unsigned
short
keymap
[
ARRAY_SIZE
(
keyspan_key_table
)];
struct
usb_device
*
udev
;
struct
input_dev
*
input
;
struct
usb_interface
*
interface
;
struct
usb_endpoint_descriptor
*
in_endpoint
;
struct
urb
*
irq_urb
;
int
open
;
dma_addr_t
in_dma
;
unsigned
char
*
in_buffer
;
/* variables used to parse messages from remote. */
struct
bit_tester
data
;
int
stage
;
int
toggle
;
};
static
struct
usb_driver
keyspan_driver
;
/*
...
...
@@ -173,6 +174,15 @@ static int keyspan_load_tester(struct usb_keyspan* dev, int bits_needed)
return
0
;
}
static
void
keyspan_report_button
(
struct
usb_keyspan
*
remote
,
int
button
,
int
press
)
{
struct
input_dev
*
input
=
remote
->
input
;
input_event
(
input
,
EV_MSC
,
MSC_SCAN
,
button
);
input_report_key
(
input
,
remote
->
keymap
[
button
],
press
);
input_sync
(
input
);
}
/*
* Routine that handles all the logic needed to parse out the message from the remote.
*/
...
...
@@ -311,9 +321,8 @@ static void keyspan_check_data(struct usb_keyspan *remote)
__FUNCTION__
,
message
.
system
,
message
.
button
,
message
.
toggle
);
if
(
message
.
toggle
!=
remote
->
toggle
)
{
input_report_key
(
remote
->
input
,
keyspan_key_table
[
message
.
button
],
1
);
input_report_key
(
remote
->
input
,
keyspan_key_table
[
message
.
button
],
0
);
input_sync
(
remote
->
input
);
keyspan_report_button
(
remote
,
message
.
button
,
1
);
keyspan_report_button
(
remote
,
message
.
button
,
0
);
remote
->
toggle
=
message
.
toggle
;
}
...
...
@@ -491,16 +500,21 @@ static int keyspan_probe(struct usb_interface *interface, const struct usb_devic
usb_make_path
(
udev
,
remote
->
phys
,
sizeof
(
remote
->
phys
));
strlcat
(
remote
->
phys
,
"/input0"
,
sizeof
(
remote
->
phys
));
memcpy
(
remote
->
keymap
,
keyspan_key_table
,
sizeof
(
remote
->
keymap
));
input_dev
->
name
=
remote
->
name
;
input_dev
->
phys
=
remote
->
phys
;
usb_to_input_id
(
udev
,
&
input_dev
->
id
);
input_dev
->
dev
.
parent
=
&
interface
->
dev
;
input_dev
->
keycode
=
remote
->
keymap
;
input_dev
->
keycodesize
=
sizeof
(
unsigned
short
);
input_dev
->
keycodemax
=
ARRAY_SIZE
(
remote
->
keymap
);
input_dev
->
evbit
[
0
]
=
BIT_MASK
(
EV_KEY
);
/* We will only report KEY events. */
input_set_capability
(
input_dev
,
EV_MSC
,
MSC_SCAN
);
__set_bit
(
EV_KEY
,
input_dev
->
evbit
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
keyspan_key_table
);
i
++
)
if
(
keyspan_key_table
[
i
]
!=
KEY_RESERVED
)
set_bit
(
keyspan_key_table
[
i
]
,
input_dev
->
keybit
);
__set_bit
(
keyspan_key_table
[
i
],
input_dev
->
keybit
);
__clear_bit
(
KEY_RESERVED
,
input_dev
->
keybit
);
input_set_drvdata
(
input_dev
,
remote
);
...
...
@@ -508,12 +522,14 @@ static int keyspan_probe(struct usb_interface *interface, const struct usb_devic
input_dev
->
close
=
keyspan_close
;
/*
* Initialize the URB to access the device. The urb gets sent to the device in keyspan_open()
* Initialize the URB to access the device.
* The urb gets sent to the device in keyspan_open()
*/
usb_fill_int_urb
(
remote
->
irq_urb
,
remote
->
udev
,
usb_rcvintpipe
(
remote
->
udev
,
remote
->
in_endpoint
->
bEndpointAddress
),
remote
->
udev
,
usb_rcvintpipe
(
remote
->
udev
,
endpoint
->
bEndpointAddress
),
remote
->
in_buffer
,
RECV_SIZE
,
keyspan_irq_recv
,
remote
,
remote
->
in_
endpoint
->
bInterval
);
endpoint
->
bInterval
);
remote
->
irq_urb
->
transfer_dma
=
remote
->
in_dma
;
remote
->
irq_urb
->
transfer_flags
|=
URB_NO_TRANSFER_DMA_MAP
;
...
...
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