8
8
#include "dvb-usb-common.h"
9
9
#include <linux/usb/input.h>
12
legacy_dvb_usb_get_keymap_index(const struct input_keymap_entry *ke,
13
struct rc_map_table *keymap,
14
unsigned int keymap_size)
17
unsigned int scancode;
19
if (ke->flags & INPUT_KEYMAP_BY_INDEX) {
22
if (input_scancode_to_scalar(ke, &scancode))
25
/* See if we can match the raw key code. */
26
for (index = 0; index < keymap_size; index++)
27
if (keymap[index].scancode == scancode)
30
/* See if there is an unused hole in the map */
31
if (index >= keymap_size) {
32
for (index = 0; index < keymap_size; index++) {
33
if (keymap[index].keycode == KEY_RESERVED ||
34
keymap[index].keycode == KEY_UNKNOWN) {
11
44
static int legacy_dvb_usb_getkeycode(struct input_dev *dev,
12
unsigned int scancode, unsigned int *keycode)
45
struct input_keymap_entry *ke)
14
47
struct dvb_usb_device *d = input_get_drvdata(dev);
16
48
struct rc_map_table *keymap = d->props.rc.legacy.rc_map_table;
19
/* See if we can match the raw key code. */
20
for (i = 0; i < d->props.rc.legacy.rc_map_size; i++)
21
if (keymap[i].scancode == scancode) {
22
*keycode = keymap[i].keycode;
27
* If is there extra space, returns KEY_RESERVED,
28
* otherwise, input core won't let legacy_dvb_usb_setkeycode
31
for (i = 0; i < d->props.rc.legacy.rc_map_size; i++)
32
if (keymap[i].keycode == KEY_RESERVED ||
33
keymap[i].keycode == KEY_UNKNOWN) {
34
*keycode = KEY_RESERVED;
49
unsigned int keymap_size = d->props.rc.legacy.rc_map_size;
52
index = legacy_dvb_usb_get_keymap_index(ke, keymap, keymap_size);
53
if (index >= keymap_size)
56
ke->keycode = keymap[index].keycode;
57
if (ke->keycode == KEY_UNKNOWN)
58
ke->keycode = KEY_RESERVED;
59
ke->len = sizeof(keymap[index].scancode);
60
memcpy(&ke->scancode, &keymap[index].scancode, ke->len);
41
66
static int legacy_dvb_usb_setkeycode(struct input_dev *dev,
42
unsigned int scancode, unsigned int keycode)
67
const struct input_keymap_entry *ke,
68
unsigned int *old_keycode)
44
70
struct dvb_usb_device *d = input_get_drvdata(dev);
46
71
struct rc_map_table *keymap = d->props.rc.legacy.rc_map_table;
49
/* Search if it is replacing an existing keycode */
50
for (i = 0; i < d->props.rc.legacy.rc_map_size; i++)
51
if (keymap[i].scancode == scancode) {
52
keymap[i].keycode = keycode;
56
/* Search if is there a clean entry. If so, use it */
57
for (i = 0; i < d->props.rc.legacy.rc_map_size; i++)
58
if (keymap[i].keycode == KEY_RESERVED ||
59
keymap[i].keycode == KEY_UNKNOWN) {
60
keymap[i].scancode = scancode;
61
keymap[i].keycode = keycode;
72
unsigned int keymap_size = d->props.rc.legacy.rc_map_size;
75
index = legacy_dvb_usb_get_keymap_index(ke, keymap, keymap_size);
66
77
* FIXME: Currently, it is not possible to increase the size of
67
78
* scancode table. For it to happen, one possibility
69
80
* copying data, appending the new key on it, and freeing
70
81
* the old one - or maybe just allocating some spare space
83
if (index >= keymap_size)
86
*old_keycode = keymap[index].keycode;
87
keymap->keycode = ke->keycode;
88
__set_bit(ke->keycode, dev->keybit);
90
if (*old_keycode != KEY_RESERVED) {
91
__clear_bit(*old_keycode, dev->keybit);
92
for (index = 0; index < keymap_size; index++) {
93
if (keymap[index].keycode == *old_keycode) {
94
__set_bit(*old_keycode, dev->keybit);
76
103
/* Remote-control poll function - called every dib->rc_query_interval ms to see