[vdr] Key-repeat or release magic in RCU drivers

Darren Salt linux at youmustbejoking.demon.co.uk
Wed Feb 8 00:00:23 CET 2006


I demand that Marko Mäkelä may or may not have written...

> On Tue, Feb 07, 2006 at 06:24:02PM +0000, Darren Salt wrote:
>>>> I've altered ir-functions.c:ir_input_keydown() here to make this easier:
>>>> there should no longer any need for other modules to alter
>>>> ir->keypressed.
[snip]
>>> The function should never convert a repeat code to a keypress or vice
>>> versa.  Two examples:

>>> (1) If I press the '1' key two times very quickly, I want VDR to see
>>> '11'. In your scheme, I'm afraid it will produce '1' and '1'|kRepeat, and
>>> VDR will ignore the second keypress.

>> That won't be a problem unless interrupts are being missed. AFAICT
>> (printk), that isn't happening.

> The RC5 repeat rate is 113.8 ms.

That matches what I'm seeing. It seems safe to assume that my remote control
does indeed use RC5.

> If I press the same button twice within that time frame, it does happen.  I
> must admit that this seems to happen with my own patch as well.  I'll have
> to add some debug code to display the RC5 frames to see whether the toggle
> bit really is toggling.

I just stuck in a printk: either it wasn't being toggled or I wasn't properly
releasing the button. (I could probably tell, but I don't plan on opening up
the remote control until I have to for other reasons.)

>>> (2) When I press the '1' button close to the maximum range of the remote
>>> (which is not much with the Hauppauge receiver that is driven out of
>>> spec), the driver should deliver the events 12022020 instead of 12012010,

>> Meaning what?

> 0=key-release
> 1=key-press
> 2=key-repeat

Oh, right: input_event last parameter.

Both are possible, depending on the number of consecutive unreceived frames.

[snip]
>>> so that VDR will switch to channel 1 and not 111.
>> Well... it'll generate a repeat for each received signal (assuming that
>> the key is held down) and it may time out, causing the next received
>> signal to be treated as a key-down event.

> With 240 ms key-release timeout, it will time out if two RC5 frames are
> lost.

Which seems reasonable to me, although this should perhaps be a module
parameter with, at least, a fixed minimum value. The right place for it is in
ir-common, but one step at a time...

> If you hold the RCU in the wrong angle or far away from the receiver and
> press the button longer to ensure that the event will be noticed, you will
> end up getting multiple keypress events instead of one keypress and
> multiple repeat events.

You might get a mixture of both.

>> With the /other/ scheme (using the input layer's own repeat handler), you
>> will get repeats - and maybe a few more 1s (although I'm enforcing lower
>> limits on the repeat/delay times, and the timeout is shorter than the
>> repeat time).

> I tested patch 3326 of the hg/v4l-dvb tree with your patches
> dvb-ir-20060206.patch.tar.gz applied.  I changed the key-release timeout in
> cx88-input.c from 120 to 240 ms.  Few keys were recognized.  Among the
> working keys were the number keys, although they were shifted by 1 (e.g.,
> '6' would be reported as '7').

Oops. The last patch in that series is broken - part of it got lost. It's
attached.

> The input layer's own repeat handler was not disabled, that is, I think
> there were too many repeat events. I couldn't figure out how budget-ci.c
> disables the repeat timer.

If ir->rep[0] and ir->rep[1] are both zero then input_register_device() will
set default delay and repeat values and install its repeat handler.

> I was unable to use this driver, because one of the cx88 modules failed to
> load and the computer crashed after some time.

All that I can say is that budget-ci is fine...

-- 
| Darren Salt | d youmustbejoking,demon,co,uk | nr. Ashington,
| Debian,     | s zap,tartarus,org            | Northumberland
| RISC OS     | @                             | Toon Army
|   Let's keep the pound sterling

Unsuitable media, 0:1
-------------- next part --------------
diff -ur linux/drivers/media/common/ir-keymaps-make.pl~ linux/drivers/media/common/ir-keymaps-make.pl
--- linux/drivers/media/common/ir-keymaps-make.pl~	2006-01-19 16:00:27.000000000 +0000
+++ linux/drivers/media/common/ir-keymaps-make.pl	2006-01-20 16:38:23.000000000 +0000
@@ -5,6 +5,8 @@
 # Written by Darren Salt <linux at youmustbejoking.demon.co.uk>
 # Licence: GPL v2 or later (see below).
 
+use POSIX;
+
 print <<'EOF';
 /*  Keytables for supported remote controls.
     This file is automatically generated.
@@ -82,7 +84,8 @@
     print "\nconst s16 ${label}[] = {";
     my $i = -1;
     my $prev = 0;
-    my $col = 0;
+    # default to 128 entries if the keymap is empty
+    my $col = output (0, $max > 0 ? 1 << ceil (log ($max)/log 2) : 128);
     while (++$i <= $max)
     {
       next unless defined $mapping{$i};


More information about the vdr mailing list