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