Mailing List archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[linux-dvb] Re: cinergyT2 remote, repeat handling, keycodes WAS:(Re: Re: cinergyT2: which kernel/usb module to use?)
On Dienstag, 14. Dezember 2004 16:07, Johannes Stezenbach wrote:
> Stefan Lucke wrote:
> > Quoting Holger Waechtler:
> > > The linux input infrastructure handles this properly for you by
> > > setting/modifying/canceling a repeat timer -- please have a look in the
> > > input and event implementation in the kernel (you would now have to send
> > > repeat events instead of repeating key up/downs...)
> >
> > At the moment I won't dig that deep into driver programming.
>
> linux/Documentation/input/input-programming.txt has just 281 lines.
Could it be such simple ? Repeat rate is now faster but with an initial delay
as desired.
--
stefan lucke
? cinergyT2.c.test01
? cinergy_key_repeat_handling-02.diff
? cinergy_key_repeat_handling.diff
? event_fake.diff
? loop.diff
Index: cinergyT2.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/cinergyT2/cinergyT2.c,v
retrieving revision 1.15.2.5
diff -p -U3 -r1.15.2.5 cinergyT2.c
--- cinergyT2.c 3 Dec 2004 09:13:29 -0000 1.15.2.5
+++ cinergyT2.c 14 Dec 2004 18:56:08 -0000
@@ -186,6 +186,7 @@ struct cinergyt2 {
struct input_dev rc_input_dev;
struct work_struct rc_query_work;
int rc_input_event;
+ int rc_key_state;
#endif
};
@@ -760,7 +761,7 @@ static void cinergyt2_query_rc (void *da
for (n=0; len>0 && n<(len/sizeof(rc_events[0])); n++) {
int i;
-printk("got key (type %d, value 0x%08x\n", rc_events[n].type, rc_events[n].value);
+printk("got key (type %d, value 0x%08x)\n", rc_events[n].type, rc_events[n].value);
if (rc_events[n].type == CINERGYT2_RC_EVENT_TYPE_NEC &&
rc_events[n].value == ~0)
{
@@ -772,6 +773,11 @@ printk("got key (type %d, value 0x%08x\n
* and no other driver does this, so we simply
* emit the last key up/down sequence again.
*/
+
+ /**
+ * ignore repeat events input system handles these
+ */
+ continue;
} else {
cinergyt2->rc_input_event = KEY_MAX;
for (i=0; i<sizeof(rc_keys)/sizeof(rc_keys[0]); i+=3) {
@@ -785,12 +791,27 @@ printk("got key (type %d, value 0x%08x\n
}
if (cinergyt2->rc_input_event != KEY_MAX) {
+ /**
+ * new keypress: so report key release if previous was key press
+ */
+ if (cinergyt2->rc_key_state)
+ input_report_key(&cinergyt2->rc_input_dev, cinergyt2->rc_input_event, 0);
+
input_report_key(&cinergyt2->rc_input_dev, cinergyt2->rc_input_event, 1);
- input_report_key(&cinergyt2->rc_input_dev, cinergyt2->rc_input_event, 0);
+ cinergyt2->rc_key_state = 1;
input_sync(&cinergyt2->rc_input_dev);
}
}
+ /**
+ * no key was pressed in this intervall, but key press was previously set
+ * so report key release
+ */
+ if (!len && cinergyt2->rc_key_state) {
+ input_report_key(&cinergyt2->rc_input_dev, cinergyt2->rc_input_event, 0);
+ cinergyt2->rc_key_state = 0;
+ input_sync(&cinergyt2->rc_input_dev);
+ }
schedule_delayed_work(&cinergyt2->rc_query_work,
msecs_to_jiffies(RC_QUERY_INTERVAL));
@@ -892,7 +913,10 @@ void* cinergyt2_probe (struct usb_device
#ifdef ENABLE_RC
init_input_dev(&cinergyt2->rc_input_dev);
- cinergyt2->rc_input_dev.evbit[0] = BIT(EV_KEY);
+ /**
+ * let the input system handle keyrepeat
+ */
+ cinergyt2->rc_input_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
cinergyt2->rc_input_dev.keycodesize = sizeof(unsigned char);
cinergyt2->rc_input_dev.keycodemax = KEY_MAX;
cinergyt2->rc_input_dev.name = DRIVER_NAME " remote control";
@@ -903,6 +927,7 @@ void* cinergyt2_probe (struct usb_device
input_register_device(&cinergyt2->rc_input_dev);
cinergyt2->rc_input_event = KEY_MAX;
+ cinergyt2->rc_key_state = 0;
INIT_WORK(&cinergyt2->rc_query_work, cinergyt2_query_rc, cinergyt2);
schedule_delayed_work(&cinergyt2->rc_query_work, HZ/2);
Home |
Main Index |
Thread Index