Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] ati_remote: switch to single-byte scancodes

The ati_remote driver currently uses 2-byte scancodes. However, one of
those bytes is actually a checksum and therefore shouldn't be considered
as part of the scancode.

Fix the driver to only use the actual data byte as a scancode and to
check the checksum itself. Update the bundled keymaps accordingly.

Since ati_remote was only migrated to the rc subsystem for 3.2, the
previous scancodes weren't emitted on any stable kernel.

Reported-by: George Spelvin <linux@horizon.com>
Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Anssi Hannula and committed by
Mauro Carvalho Chehab
5eefb4f0 6b806e30

+200 -209
+51 -60
drivers/media/rc/ati_remote.c
··· 189 189 dma_addr_t inbuf_dma; 190 190 dma_addr_t outbuf_dma; 191 191 192 - unsigned char old_data[2]; /* Detect duplicate events */ 192 + unsigned char old_data; /* Detect duplicate events */ 193 193 unsigned long old_jiffies; 194 194 unsigned long acc_jiffies; /* handle acceleration */ 195 195 unsigned long first_jiffies; ··· 221 221 /* Translation table from hardware messages to input events. */ 222 222 static const struct { 223 223 short kind; 224 - unsigned char data1, data2; 224 + unsigned char data; 225 225 int type; 226 226 unsigned int code; 227 227 int value; 228 228 } ati_remote_tbl[] = { 229 229 /* Directional control pad axes */ 230 - {KIND_ACCEL, 0x35, 0x70, EV_REL, REL_X, -1}, /* left */ 231 - {KIND_ACCEL, 0x36, 0x71, EV_REL, REL_X, 1}, /* right */ 232 - {KIND_ACCEL, 0x37, 0x72, EV_REL, REL_Y, -1}, /* up */ 233 - {KIND_ACCEL, 0x38, 0x73, EV_REL, REL_Y, 1}, /* down */ 230 + {KIND_ACCEL, 0x70, EV_REL, REL_X, -1}, /* left */ 231 + {KIND_ACCEL, 0x71, EV_REL, REL_X, 1}, /* right */ 232 + {KIND_ACCEL, 0x72, EV_REL, REL_Y, -1}, /* up */ 233 + {KIND_ACCEL, 0x73, EV_REL, REL_Y, 1}, /* down */ 234 234 /* Directional control pad diagonals */ 235 - {KIND_LU, 0x39, 0x74, EV_REL, 0, 0}, /* left up */ 236 - {KIND_RU, 0x3a, 0x75, EV_REL, 0, 0}, /* right up */ 237 - {KIND_LD, 0x3c, 0x77, EV_REL, 0, 0}, /* left down */ 238 - {KIND_RD, 0x3b, 0x76, EV_REL, 0, 0}, /* right down */ 235 + {KIND_LU, 0x74, EV_REL, 0, 0}, /* left up */ 236 + {KIND_RU, 0x75, EV_REL, 0, 0}, /* right up */ 237 + {KIND_LD, 0x77, EV_REL, 0, 0}, /* left down */ 238 + {KIND_RD, 0x76, EV_REL, 0, 0}, /* right down */ 239 239 240 240 /* "Mouse button" buttons */ 241 - {KIND_LITERAL, 0x3d, 0x78, EV_KEY, BTN_LEFT, 1}, /* left btn down */ 242 - {KIND_LITERAL, 0x3e, 0x79, EV_KEY, BTN_LEFT, 0}, /* left btn up */ 243 - {KIND_LITERAL, 0x41, 0x7c, EV_KEY, BTN_RIGHT, 1},/* right btn down */ 244 - {KIND_LITERAL, 0x42, 0x7d, EV_KEY, BTN_RIGHT, 0},/* right btn up */ 241 + {KIND_LITERAL, 0x78, EV_KEY, BTN_LEFT, 1}, /* left btn down */ 242 + {KIND_LITERAL, 0x79, EV_KEY, BTN_LEFT, 0}, /* left btn up */ 243 + {KIND_LITERAL, 0x7c, EV_KEY, BTN_RIGHT, 1},/* right btn down */ 244 + {KIND_LITERAL, 0x7d, EV_KEY, BTN_RIGHT, 0},/* right btn up */ 245 245 246 246 /* Artificial "doubleclick" events are generated by the hardware. 247 247 * They are mapped to the "side" and "extra" mouse buttons here. */ 248 - {KIND_FILTERED, 0x3f, 0x7a, EV_KEY, BTN_SIDE, 1}, /* left dblclick */ 249 - {KIND_FILTERED, 0x43, 0x7e, EV_KEY, BTN_EXTRA, 1},/* right dblclick */ 248 + {KIND_FILTERED, 0x7a, EV_KEY, BTN_SIDE, 1}, /* left dblclick */ 249 + {KIND_FILTERED, 0x7e, EV_KEY, BTN_EXTRA, 1},/* right dblclick */ 250 250 251 251 /* Non-mouse events are handled by rc-core */ 252 - {KIND_END, 0x00, 0x00, EV_MAX + 1, 0, 0} 252 + {KIND_END, 0x00, EV_MAX + 1, 0, 0} 253 253 }; 254 254 255 255 /* Local function prototypes */ ··· 397 397 } 398 398 399 399 /* 400 - * ati_remote_event_lookup 401 - */ 402 - static int ati_remote_event_lookup(int rem, unsigned char d1, unsigned char d2) 403 - { 404 - int i; 405 - 406 - for (i = 0; ati_remote_tbl[i].kind != KIND_END; i++) { 407 - /* 408 - * Decide if the table entry matches the remote input. 409 - */ 410 - if (ati_remote_tbl[i].data1 == d1 && 411 - ati_remote_tbl[i].data2 == d2) 412 - return i; 413 - 414 - } 415 - return -1; 416 - } 417 - 418 - /* 419 400 * ati_remote_compute_accel 420 401 * 421 402 * Implements acceleration curve for directional control pad ··· 444 463 int index = -1; 445 464 int acc; 446 465 int remote_num; 447 - unsigned char scancode[2]; 466 + unsigned char scancode; 467 + int i; 468 + 469 + /* 470 + * data[0] = 0x14 471 + * data[1] = data[2] + data[3] + 0xd5 (a checksum byte) 472 + * data[2] = the key code (with toggle bit in MSB with some models) 473 + * data[3] = channel << 4 (the low 4 bits must be zero) 474 + */ 448 475 449 476 /* Deal with strange looking inputs */ 450 477 if ( (urb->actual_length != 4) || (data[0] != 0x14) || 451 478 ((data[3] & 0x0f) != 0x00) ) { 452 479 ati_remote_dump(&urb->dev->dev, data, urb->actual_length); 480 + return; 481 + } 482 + 483 + if (data[1] != ((data[2] + data[3] + 0xd5) & 0xff)) { 484 + dbginfo(&ati_remote->interface->dev, 485 + "wrong checksum in input: %02x %02x %02x %02x\n", 486 + data[0], data[1], data[2], data[3]); 453 487 return; 454 488 } 455 489 ··· 478 482 return; 479 483 } 480 484 481 - scancode[0] = (((data[1] - ((remote_num + 1) << 4)) & 0xf0) | (data[1] & 0x0f)); 482 - 483 485 /* 484 - * Some devices (e.g. SnapStream Firefly) use 8080 as toggle code, 485 - * so we have to clear them. The first bit is a bit tricky as the 486 - * "non-toggled" state depends on remote_num, so we xor it with the 487 - * second bit which is only used for toggle. 486 + * MSB is a toggle code, though only used by some devices 487 + * (e.g. SnapStream Firefly) 488 488 */ 489 - scancode[0] ^= (data[2] & 0x80); 489 + scancode = data[2] & 0x7f; 490 490 491 - scancode[1] = data[2] & ~0x80; 492 - 493 - /* Look up event code index in mouse translation table. */ 494 - index = ati_remote_event_lookup(remote_num, scancode[0], scancode[1]); 491 + /* Look up event code index in the mouse translation table. */ 492 + for (i = 0; ati_remote_tbl[i].kind != KIND_END; i++) { 493 + if (scancode == ati_remote_tbl[i].data) { 494 + index = i; 495 + break; 496 + } 497 + } 495 498 496 499 if (index >= 0) { 497 500 dbginfo(&ati_remote->interface->dev, 498 - "channel 0x%02x; mouse data %02x,%02x; index %d; keycode %d\n", 499 - remote_num, data[1], data[2], index, ati_remote_tbl[index].code); 501 + "channel 0x%02x; mouse data %02x; index %d; keycode %d\n", 502 + remote_num, data[2], index, ati_remote_tbl[index].code); 500 503 if (!dev) 501 504 return; /* no mouse device */ 502 505 } else 503 506 dbginfo(&ati_remote->interface->dev, 504 - "channel 0x%02x; key data %02x,%02x, scancode %02x,%02x\n", 505 - remote_num, data[1], data[2], scancode[0], scancode[1]); 507 + "channel 0x%02x; key data %02x, scancode %02x\n", 508 + remote_num, data[2], scancode); 506 509 507 510 508 511 if (index >= 0 && ati_remote_tbl[index].kind == KIND_LITERAL) { ··· 518 523 unsigned long now = jiffies; 519 524 520 525 /* Filter duplicate events which happen "too close" together. */ 521 - if (ati_remote->old_data[0] == data[1] && 522 - ati_remote->old_data[1] == data[2] && 526 + if (ati_remote->old_data == data[2] && 523 527 time_before(now, ati_remote->old_jiffies + 524 528 msecs_to_jiffies(repeat_filter))) { 525 529 ati_remote->repeat_count++; ··· 527 533 ati_remote->first_jiffies = now; 528 534 } 529 535 530 - ati_remote->old_data[0] = data[1]; 531 - ati_remote->old_data[1] = data[2]; 536 + ati_remote->old_data = data[2]; 532 537 ati_remote->old_jiffies = now; 533 538 534 539 /* Ensure we skip at least the 4 first duplicate events (generated ··· 542 549 543 550 if (index < 0) { 544 551 /* Not a mouse event, hand it to rc-core. */ 545 - u32 rc_code = (scancode[0] << 8) | scancode[1]; 546 552 547 553 /* 548 554 * We don't use the rc-core repeat handling yet as 549 555 * it would cause ghost repeats which would be a 550 556 * regression for this driver. 551 557 */ 552 - rc_keydown_notimeout(ati_remote->rdev, rc_code, 558 + rc_keydown_notimeout(ati_remote->rdev, scancode, 553 559 data[2]); 554 560 rc_keyup(ati_remote->rdev); 555 561 return; ··· 599 607 input_sync(dev); 600 608 601 609 ati_remote->old_jiffies = jiffies; 602 - ati_remote->old_data[0] = data[1]; 603 - ati_remote->old_data[1] = data[2]; 610 + ati_remote->old_data = data[2]; 604 611 } 605 612 } 606 613
+48 -48
drivers/media/rc/keymaps/rc-ati-x10.c
··· 27 27 #include <media/rc-map.h> 28 28 29 29 static struct rc_map_table ati_x10[] = { 30 - { 0xd20d, KEY_1 }, 31 - { 0xd30e, KEY_2 }, 32 - { 0xd40f, KEY_3 }, 33 - { 0xd510, KEY_4 }, 34 - { 0xd611, KEY_5 }, 35 - { 0xd712, KEY_6 }, 36 - { 0xd813, KEY_7 }, 37 - { 0xd914, KEY_8 }, 38 - { 0xda15, KEY_9 }, 39 - { 0xdc17, KEY_0 }, 40 - { 0xc500, KEY_A }, 41 - { 0xc601, KEY_B }, 42 - { 0xde19, KEY_C }, 43 - { 0xe01b, KEY_D }, 44 - { 0xe621, KEY_E }, 45 - { 0xe823, KEY_F }, 30 + { 0x0d, KEY_1 }, 31 + { 0x0e, KEY_2 }, 32 + { 0x0f, KEY_3 }, 33 + { 0x10, KEY_4 }, 34 + { 0x11, KEY_5 }, 35 + { 0x12, KEY_6 }, 36 + { 0x13, KEY_7 }, 37 + { 0x14, KEY_8 }, 38 + { 0x15, KEY_9 }, 39 + { 0x17, KEY_0 }, 40 + { 0x00, KEY_A }, 41 + { 0x01, KEY_B }, 42 + { 0x19, KEY_C }, 43 + { 0x1b, KEY_D }, 44 + { 0x21, KEY_E }, 45 + { 0x23, KEY_F }, 46 46 47 - { 0xdd18, KEY_KPENTER }, /* "check" */ 48 - { 0xdb16, KEY_MENU }, /* "menu" */ 49 - { 0xc702, KEY_POWER }, /* Power */ 50 - { 0xc803, KEY_TV }, /* TV */ 51 - { 0xc904, KEY_DVD }, /* DVD */ 52 - { 0xca05, KEY_WWW }, /* WEB */ 53 - { 0xcb06, KEY_BOOKMARKS }, /* "book" */ 54 - { 0xcc07, KEY_EDIT }, /* "hand" */ 55 - { 0xe11c, KEY_COFFEE }, /* "timer" */ 56 - { 0xe520, KEY_FRONT }, /* "max" */ 57 - { 0xe21d, KEY_LEFT }, /* left */ 58 - { 0xe41f, KEY_RIGHT }, /* right */ 59 - { 0xe722, KEY_DOWN }, /* down */ 60 - { 0xdf1a, KEY_UP }, /* up */ 61 - { 0xe31e, KEY_OK }, /* "OK" */ 62 - { 0xce09, KEY_VOLUMEDOWN }, /* VOL + */ 63 - { 0xcd08, KEY_VOLUMEUP }, /* VOL - */ 64 - { 0xcf0a, KEY_MUTE }, /* MUTE */ 65 - { 0xd00b, KEY_CHANNELUP }, /* CH + */ 66 - { 0xd10c, KEY_CHANNELDOWN },/* CH - */ 67 - { 0xec27, KEY_RECORD }, /* ( o) red */ 68 - { 0xea25, KEY_PLAY }, /* ( >) */ 69 - { 0xe924, KEY_REWIND }, /* (<<) */ 70 - { 0xeb26, KEY_FORWARD }, /* (>>) */ 71 - { 0xed28, KEY_STOP }, /* ([]) */ 72 - { 0xee29, KEY_PAUSE }, /* ('') */ 73 - { 0xf02b, KEY_PREVIOUS }, /* (<-) */ 74 - { 0xef2a, KEY_NEXT }, /* (>+) */ 75 - { 0xf22d, KEY_INFO }, /* PLAYING */ 76 - { 0xf32e, KEY_HOME }, /* TOP */ 77 - { 0xf42f, KEY_END }, /* END */ 78 - { 0xf530, KEY_SELECT }, /* SELECT */ 47 + { 0x18, KEY_KPENTER }, /* "check" */ 48 + { 0x16, KEY_MENU }, /* "menu" */ 49 + { 0x02, KEY_POWER }, /* Power */ 50 + { 0x03, KEY_TV }, /* TV */ 51 + { 0x04, KEY_DVD }, /* DVD */ 52 + { 0x05, KEY_WWW }, /* WEB */ 53 + { 0x06, KEY_BOOKMARKS }, /* "book" */ 54 + { 0x07, KEY_EDIT }, /* "hand" */ 55 + { 0x1c, KEY_COFFEE }, /* "timer" */ 56 + { 0x20, KEY_FRONT }, /* "max" */ 57 + { 0x1d, KEY_LEFT }, /* left */ 58 + { 0x1f, KEY_RIGHT }, /* right */ 59 + { 0x22, KEY_DOWN }, /* down */ 60 + { 0x1a, KEY_UP }, /* up */ 61 + { 0x1e, KEY_OK }, /* "OK" */ 62 + { 0x09, KEY_VOLUMEDOWN }, /* VOL + */ 63 + { 0x08, KEY_VOLUMEUP }, /* VOL - */ 64 + { 0x0a, KEY_MUTE }, /* MUTE */ 65 + { 0x0b, KEY_CHANNELUP }, /* CH + */ 66 + { 0x0c, KEY_CHANNELDOWN },/* CH - */ 67 + { 0x27, KEY_RECORD }, /* ( o) red */ 68 + { 0x25, KEY_PLAY }, /* ( >) */ 69 + { 0x24, KEY_REWIND }, /* (<<) */ 70 + { 0x26, KEY_FORWARD }, /* (>>) */ 71 + { 0x28, KEY_STOP }, /* ([]) */ 72 + { 0x29, KEY_PAUSE }, /* ('') */ 73 + { 0x2b, KEY_PREVIOUS }, /* (<-) */ 74 + { 0x2a, KEY_NEXT }, /* (>+) */ 75 + { 0x2d, KEY_INFO }, /* PLAYING */ 76 + { 0x2e, KEY_HOME }, /* TOP */ 77 + { 0x2f, KEY_END }, /* END */ 78 + { 0x30, KEY_SELECT }, /* SELECT */ 79 79 }; 80 80 81 81 static struct rc_map_list ati_x10_map = {
+53 -53
drivers/media/rc/keymaps/rc-medion-x10.c
··· 25 25 #include <media/rc-map.h> 26 26 27 27 static struct rc_map_table medion_x10[] = { 28 - { 0xf12c, KEY_TV }, /* TV */ 29 - { 0xf22d, KEY_VCR }, /* VCR */ 30 - { 0xc904, KEY_DVD }, /* DVD */ 31 - { 0xcb06, KEY_AUDIO }, /* MUSIC */ 28 + { 0x2c, KEY_TV }, /* TV */ 29 + { 0x2d, KEY_VCR }, /* VCR */ 30 + { 0x04, KEY_DVD }, /* DVD */ 31 + { 0x06, KEY_AUDIO }, /* MUSIC */ 32 32 33 - { 0xf32e, KEY_RADIO }, /* RADIO */ 34 - { 0xca05, KEY_DIRECTORY }, /* PHOTO */ 35 - { 0xf42f, KEY_INFO }, /* TV-PREVIEW */ 36 - { 0xf530, KEY_LIST }, /* CHANNEL-LST */ 33 + { 0x2e, KEY_RADIO }, /* RADIO */ 34 + { 0x05, KEY_DIRECTORY }, /* PHOTO */ 35 + { 0x2f, KEY_INFO }, /* TV-PREVIEW */ 36 + { 0x30, KEY_LIST }, /* CHANNEL-LST */ 37 37 38 - { 0xe01b, KEY_SETUP }, /* SETUP */ 39 - { 0xf631, KEY_VIDEO }, /* VIDEO DESKTOP */ 38 + { 0x1b, KEY_SETUP }, /* SETUP */ 39 + { 0x31, KEY_VIDEO }, /* VIDEO DESKTOP */ 40 40 41 - { 0xcd08, KEY_VOLUMEDOWN }, /* VOL - */ 42 - { 0xce09, KEY_VOLUMEUP }, /* VOL + */ 43 - { 0xd00b, KEY_CHANNELUP }, /* CHAN + */ 44 - { 0xd10c, KEY_CHANNELDOWN }, /* CHAN - */ 45 - { 0xc500, KEY_MUTE }, /* MUTE */ 41 + { 0x08, KEY_VOLUMEDOWN }, /* VOL - */ 42 + { 0x09, KEY_VOLUMEUP }, /* VOL + */ 43 + { 0x0b, KEY_CHANNELUP }, /* CHAN + */ 44 + { 0x0c, KEY_CHANNELDOWN }, /* CHAN - */ 45 + { 0x00, KEY_MUTE }, /* MUTE */ 46 46 47 - { 0xf732, KEY_RED }, /* red */ 48 - { 0xf833, KEY_GREEN }, /* green */ 49 - { 0xf934, KEY_YELLOW }, /* yellow */ 50 - { 0xfa35, KEY_BLUE }, /* blue */ 51 - { 0xdb16, KEY_TEXT }, /* TXT */ 47 + { 0x32, KEY_RED }, /* red */ 48 + { 0x33, KEY_GREEN }, /* green */ 49 + { 0x34, KEY_YELLOW }, /* yellow */ 50 + { 0x35, KEY_BLUE }, /* blue */ 51 + { 0x16, KEY_TEXT }, /* TXT */ 52 52 53 - { 0xd20d, KEY_1 }, 54 - { 0xd30e, KEY_2 }, 55 - { 0xd40f, KEY_3 }, 56 - { 0xd510, KEY_4 }, 57 - { 0xd611, KEY_5 }, 58 - { 0xd712, KEY_6 }, 59 - { 0xd813, KEY_7 }, 60 - { 0xd914, KEY_8 }, 61 - { 0xda15, KEY_9 }, 62 - { 0xdc17, KEY_0 }, 63 - { 0xe11c, KEY_SEARCH }, /* TV/RAD, CH SRC */ 64 - { 0xe520, KEY_DELETE }, /* DELETE */ 53 + { 0x0d, KEY_1 }, 54 + { 0x0e, KEY_2 }, 55 + { 0x0f, KEY_3 }, 56 + { 0x10, KEY_4 }, 57 + { 0x11, KEY_5 }, 58 + { 0x12, KEY_6 }, 59 + { 0x13, KEY_7 }, 60 + { 0x14, KEY_8 }, 61 + { 0x15, KEY_9 }, 62 + { 0x17, KEY_0 }, 63 + { 0x1c, KEY_SEARCH }, /* TV/RAD, CH SRC */ 64 + { 0x20, KEY_DELETE }, /* DELETE */ 65 65 66 - { 0xfb36, KEY_KEYBOARD }, /* RENAME */ 67 - { 0xdd18, KEY_SCREEN }, /* SNAPSHOT */ 66 + { 0x36, KEY_KEYBOARD }, /* RENAME */ 67 + { 0x18, KEY_SCREEN }, /* SNAPSHOT */ 68 68 69 - { 0xdf1a, KEY_UP }, /* up */ 70 - { 0xe722, KEY_DOWN }, /* down */ 71 - { 0xe21d, KEY_LEFT }, /* left */ 72 - { 0xe41f, KEY_RIGHT }, /* right */ 73 - { 0xe31e, KEY_OK }, /* OK */ 69 + { 0x1a, KEY_UP }, /* up */ 70 + { 0x22, KEY_DOWN }, /* down */ 71 + { 0x1d, KEY_LEFT }, /* left */ 72 + { 0x1f, KEY_RIGHT }, /* right */ 73 + { 0x1e, KEY_OK }, /* OK */ 74 74 75 - { 0xfc37, KEY_SELECT }, /* ACQUIRE IMAGE */ 76 - { 0xfd38, KEY_EDIT }, /* EDIT IMAGE */ 75 + { 0x37, KEY_SELECT }, /* ACQUIRE IMAGE */ 76 + { 0x38, KEY_EDIT }, /* EDIT IMAGE */ 77 77 78 - { 0xe924, KEY_REWIND }, /* rewind (<<) */ 79 - { 0xea25, KEY_PLAY }, /* play ( >) */ 80 - { 0xeb26, KEY_FORWARD }, /* forward (>>) */ 81 - { 0xec27, KEY_RECORD }, /* record ( o) */ 82 - { 0xed28, KEY_STOP }, /* stop ([]) */ 83 - { 0xee29, KEY_PAUSE }, /* pause ('') */ 78 + { 0x24, KEY_REWIND }, /* rewind (<<) */ 79 + { 0x25, KEY_PLAY }, /* play ( >) */ 80 + { 0x26, KEY_FORWARD }, /* forward (>>) */ 81 + { 0x27, KEY_RECORD }, /* record ( o) */ 82 + { 0x28, KEY_STOP }, /* stop ([]) */ 83 + { 0x29, KEY_PAUSE }, /* pause ('') */ 84 84 85 - { 0xe621, KEY_PREVIOUS }, /* prev */ 86 - { 0xfe39, KEY_SWITCHVIDEOMODE }, /* F SCR */ 87 - { 0xe823, KEY_NEXT }, /* next */ 88 - { 0xde19, KEY_MENU }, /* MENU */ 89 - { 0xff3a, KEY_LANGUAGE }, /* AUDIO */ 85 + { 0x21, KEY_PREVIOUS }, /* prev */ 86 + { 0x39, KEY_SWITCHVIDEOMODE }, /* F SCR */ 87 + { 0x23, KEY_NEXT }, /* next */ 88 + { 0x19, KEY_MENU }, /* MENU */ 89 + { 0x3a, KEY_LANGUAGE }, /* AUDIO */ 90 90 91 - { 0xc702, KEY_POWER }, /* POWER */ 91 + { 0x02, KEY_POWER }, /* POWER */ 92 92 }; 93 93 94 94 static struct rc_map_list medion_x10_map = {
+48 -48
drivers/media/rc/keymaps/rc-snapstream-firefly.c
··· 22 22 #include <media/rc-map.h> 23 23 24 24 static struct rc_map_table snapstream_firefly[] = { 25 - { 0xf12c, KEY_ZOOM }, /* Maximize */ 26 - { 0xc702, KEY_CLOSE }, 25 + { 0x2c, KEY_ZOOM }, /* Maximize */ 26 + { 0x02, KEY_CLOSE }, 27 27 28 - { 0xd20d, KEY_1 }, 29 - { 0xd30e, KEY_2 }, 30 - { 0xd40f, KEY_3 }, 31 - { 0xd510, KEY_4 }, 32 - { 0xd611, KEY_5 }, 33 - { 0xd712, KEY_6 }, 34 - { 0xd813, KEY_7 }, 35 - { 0xd914, KEY_8 }, 36 - { 0xda15, KEY_9 }, 37 - { 0xdc17, KEY_0 }, 38 - { 0xdb16, KEY_BACK }, 39 - { 0xdd18, KEY_KPENTER }, /* ent */ 28 + { 0x0d, KEY_1 }, 29 + { 0x0e, KEY_2 }, 30 + { 0x0f, KEY_3 }, 31 + { 0x10, KEY_4 }, 32 + { 0x11, KEY_5 }, 33 + { 0x12, KEY_6 }, 34 + { 0x13, KEY_7 }, 35 + { 0x14, KEY_8 }, 36 + { 0x15, KEY_9 }, 37 + { 0x17, KEY_0 }, 38 + { 0x16, KEY_BACK }, 39 + { 0x18, KEY_KPENTER }, /* ent */ 40 40 41 - { 0xce09, KEY_VOLUMEUP }, 42 - { 0xcd08, KEY_VOLUMEDOWN }, 43 - { 0xcf0a, KEY_MUTE }, 44 - { 0xd00b, KEY_CHANNELUP }, 45 - { 0xd10c, KEY_CHANNELDOWN }, 46 - { 0xc500, KEY_VENDOR }, /* firefly */ 41 + { 0x09, KEY_VOLUMEUP }, 42 + { 0x08, KEY_VOLUMEDOWN }, 43 + { 0x0a, KEY_MUTE }, 44 + { 0x0b, KEY_CHANNELUP }, 45 + { 0x0c, KEY_CHANNELDOWN }, 46 + { 0x00, KEY_VENDOR }, /* firefly */ 47 47 48 - { 0xf32e, KEY_INFO }, 49 - { 0xf42f, KEY_OPTION }, 48 + { 0x2e, KEY_INFO }, 49 + { 0x2f, KEY_OPTION }, 50 50 51 - { 0xe21d, KEY_LEFT }, 52 - { 0xe41f, KEY_RIGHT }, 53 - { 0xe722, KEY_DOWN }, 54 - { 0xdf1a, KEY_UP }, 55 - { 0xe31e, KEY_OK }, 51 + { 0x1d, KEY_LEFT }, 52 + { 0x1f, KEY_RIGHT }, 53 + { 0x22, KEY_DOWN }, 54 + { 0x1a, KEY_UP }, 55 + { 0x1e, KEY_OK }, 56 56 57 - { 0xe11c, KEY_MENU }, 58 - { 0xe520, KEY_EXIT }, 57 + { 0x1c, KEY_MENU }, 58 + { 0x20, KEY_EXIT }, 59 59 60 - { 0xec27, KEY_RECORD }, 61 - { 0xea25, KEY_PLAY }, 62 - { 0xed28, KEY_STOP }, 63 - { 0xe924, KEY_REWIND }, 64 - { 0xeb26, KEY_FORWARD }, 65 - { 0xee29, KEY_PAUSE }, 66 - { 0xf02b, KEY_PREVIOUS }, 67 - { 0xef2a, KEY_NEXT }, 60 + { 0x27, KEY_RECORD }, 61 + { 0x25, KEY_PLAY }, 62 + { 0x28, KEY_STOP }, 63 + { 0x24, KEY_REWIND }, 64 + { 0x26, KEY_FORWARD }, 65 + { 0x29, KEY_PAUSE }, 66 + { 0x2b, KEY_PREVIOUS }, 67 + { 0x2a, KEY_NEXT }, 68 68 69 - { 0xcb06, KEY_AUDIO }, /* Music */ 70 - { 0xca05, KEY_IMAGES }, /* Photos */ 71 - { 0xc904, KEY_DVD }, 72 - { 0xc803, KEY_TV }, 73 - { 0xcc07, KEY_VIDEO }, 69 + { 0x06, KEY_AUDIO }, /* Music */ 70 + { 0x05, KEY_IMAGES }, /* Photos */ 71 + { 0x04, KEY_DVD }, 72 + { 0x03, KEY_TV }, 73 + { 0x07, KEY_VIDEO }, 74 74 75 - { 0xc601, KEY_HELP }, 76 - { 0xf22d, KEY_MODE }, /* Mouse */ 75 + { 0x01, KEY_HELP }, 76 + { 0x2d, KEY_MODE }, /* Mouse */ 77 77 78 - { 0xde19, KEY_A }, 79 - { 0xe01b, KEY_B }, 80 - { 0xe621, KEY_C }, 81 - { 0xe823, KEY_D }, 78 + { 0x19, KEY_A }, 79 + { 0x1b, KEY_B }, 80 + { 0x21, KEY_C }, 81 + { 0x23, KEY_D }, 82 82 }; 83 83 84 84 static struct rc_map_list snapstream_firefly_map = {