|
@@ -445,6 +445,9 @@ static int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap)
|
|
|
|
|
|
static u8 rc_request[] = { REQUEST_POLL_RC, 0 };
|
|
|
|
|
|
+/* Number of keypresses to ignore before start repeating */
|
|
|
+#define RC_REPEAT_DELAY 2
|
|
|
+
|
|
|
static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
|
|
|
{
|
|
|
u8 key[4];
|
|
@@ -458,18 +461,67 @@ static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
|
|
|
err("RC Query Failed");
|
|
|
return -1;
|
|
|
}
|
|
|
+
|
|
|
+ /* losing half of KEY_0 events from Philipps rc5 remotes.. */
|
|
|
if (key[0]==0 && key[1]==0 && key[2]==0 && key[3]==0) return 0;
|
|
|
- if (key[3-1]!=st->rc_toggle) {
|
|
|
+
|
|
|
+ /* info("%d: %2X %2X %2X %2X",dvb_usb_dib0700_ir_proto,(int)key[3-2],(int)key[3-3],(int)key[3-1],(int)key[3]); */
|
|
|
+
|
|
|
+ dib0700_rc_setup(d); /* reset ir sensor data to prevent false events */
|
|
|
+
|
|
|
+ switch (dvb_usb_dib0700_ir_proto) {
|
|
|
+ case 0: {
|
|
|
+ /* NEC protocol sends repeat code as 0 0 0 FF */
|
|
|
+ if ((key[3-2] == 0x00) && (key[3-3] == 0x00) &&
|
|
|
+ (key[3] == 0xFF)) {
|
|
|
+ st->rc_counter++;
|
|
|
+ if (st->rc_counter > RC_REPEAT_DELAY) {
|
|
|
+ *event = d->last_event;
|
|
|
+ *state = REMOTE_KEY_PRESSED;
|
|
|
+ st->rc_counter = RC_REPEAT_DELAY;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
for (i=0;i<d->props.rc_key_map_size; i++) {
|
|
|
if (keymap[i].custom == key[3-2] && keymap[i].data == key[3-3]) {
|
|
|
+ st->rc_counter = 0;
|
|
|
+ *event = keymap[i].event;
|
|
|
+ *state = REMOTE_KEY_PRESSED;
|
|
|
+ d->last_event = keymap[i].event;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default: {
|
|
|
+ /* RC-5 protocol changes toggle bit on new keypress */
|
|
|
+ for (i = 0; i < d->props.rc_key_map_size; i++) {
|
|
|
+ if (keymap[i].custom == key[3-2] && keymap[i].data == key[3-3]) {
|
|
|
+ if (d->last_event == keymap[i].event &&
|
|
|
+ key[3-1] == st->rc_toggle) {
|
|
|
+ st->rc_counter++;
|
|
|
+ /* prevents unwanted double hits */
|
|
|
+ if (st->rc_counter > RC_REPEAT_DELAY) {
|
|
|
+ *event = d->last_event;
|
|
|
+ *state = REMOTE_KEY_PRESSED;
|
|
|
+ st->rc_counter = RC_REPEAT_DELAY;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ st->rc_counter = 0;
|
|
|
*event = keymap[i].event;
|
|
|
*state = REMOTE_KEY_PRESSED;
|
|
|
- st->rc_toggle=key[3-1];
|
|
|
+ st->rc_toggle = key[3-1];
|
|
|
+ d->last_event = keymap[i].event;
|
|
|
return 0;
|
|
|
}
|
|
|
}
|
|
|
- err("Unknown remote controller key : %2X %2X",(int)key[3-2],(int)key[3-3]);
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
+ err("Unknown remote controller key: %2X %2X %2X %2X", (int) key[3-2], (int) key[3-3], (int) key[3-1], (int) key[3]);
|
|
|
+ d->last_event = 0;
|
|
|
return 0;
|
|
|
}
|
|
|
|