Re: IR code autorepeat issue?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



How about a keycode sensitive repeat delay?
A short delay for vol+/-, ch+/-, etc.
A medium delay for digits, fast forward, rewind, pause, play, stop, etc.
A long delay for power, mute, etc.

Regards,
Andy

Mauro Carvalho Chehab <mchehab@xxxxxxxxxxxxx> wrote:

>Em 29-08-2010 03:40, Anton Blanchard escreveu:
>> 
>> I'm seeing double IR events on 2.6.36-rc2 and a DViCO FusionHDTV DVB-T Dual
>> Express. I enabled some debug and it looks like we are only getting one IR
>> event from the device as expected:
>> 
>> [ 1351.032084] ir_keydown: i2c IR (FusionHDTV): key down event, key 0x0067, scancode 0x0051
>> [ 1351.281284] ir_keyup: keyup key 0x0067
>> 
>> ie one key down event and one key up event 250ms later. I wonder if the input
>> layer software autorepeat is the culprit. It seems to set autorepeat to start
>> at 250ms:
>> 
>>         /*
>>          * If delay and period are pre-set by the driver, then autorepeating
>>          * is handled by the driver itself and we don't do it in input.c.
>>          */
>>         init_timer(&dev->timer);
>>         if (!dev->rep[REP_DELAY] && !dev->rep[REP_PERIOD]) {
>>                 dev->timer.data = (long) dev;
>>                 dev->timer.function = input_repeat_key;
>>                 dev->rep[REP_DELAY] = 250;
>>                 dev->rep[REP_PERIOD] = 33;
>>         }
>> 
>> If I shorten the IR key up events to 100ms via the patch below the problem
>> goes away. I guess the other option would be to initialise REP_DELAY and
>> REP_PERIOD so the input layer autorepeat doesn't cut in at all. Thoughts?
>
>> Anton
>> --
>> 
>> diff --git a/drivers/media/IR/ir-keytable.c b/drivers/media/IR/ir-keytable.c
>> index 7e82a9d..cf44d5a 100644
>> --- a/drivers/media/IR/ir-keytable.c
>> +++ b/drivers/media/IR/ir-keytable.c
>> @@ -22,7 +22,7 @@
>>  #define IR_TAB_MAX_SIZE	8192
>>  
>>  /* FIXME: IR_KEYPRESS_TIMEOUT should be protocol specific */
>> -#define IR_KEYPRESS_TIMEOUT 250
>> +#define IR_KEYPRESS_TIMEOUT 100
>
>Yes, 250ms is too high, if we want to use REP_DELAY = 250ms.
>
>There's one issue on touching on this constant: it is currently just one global 
>timeout value that will be used by all protocols. This timeout should be enough to
>retrieve and proccess the repeat key event on all protocols, and on all devices, or 
>we'll need to do a per-protocol (and eventually per device) timeout init. From 
>http://www.sbprojects.com/knowledge/ir/ir.htm, we see that NEC prococol uses 110 ms
>for repeat code, and we need some aditional time to wake up the decoding task. I'd
>say that anything lower than 150-180ms would risk to not decode repeat events with
>NEC.
>
>I got exactly the same problem when adding RC CORE support at the dib0700 driver. At
>that driver, there's an additional time of sending/receiving URB's from USB. So, we
>probably need a higher timeout. Even so, I tried to reduce the timeout to 200ms or 150ms 
>(not sure), but it didn't work. So, I ended by just patching the dibcom driver to do 
>dev->rep[REP_DELAY] = 500:
>
>commit 8dc09004978538d211ccc36b5046919489e30a55
>Author: Mauro Carvalho Chehab <mchehab@xxxxxxxxxx>
>Date:   Sat Jul 31 23:37:19 2010 -0300
>
>    V4L/DVB: dib0700: avoid bad repeat
>    
>    a 250ms delay is too low for this device. It ends by producing false
>    repeat events. Increase the delay time to 500 ms to avoid troubles.
>    
>    Signed-off-by: Mauro Carvalho Chehab <mchehab@xxxxxxxxxx>
>
>diff --git a/drivers/media/dvb/dvb-usb/dib0700_core.c b/drivers/media/dvb/dvb-usb/dib0700_core.c
>index 164fa9c..a05d955 100644
>--- a/drivers/media/dvb/dvb-usb/dib0700_core.c
>+++ b/drivers/media/dvb/dvb-usb/dib0700_core.c
>@@ -648,6 +648,9 @@ static int dib0700_probe(struct usb_interface *intf,
>                        else
>                                dev->props.rc.core.bulk_mode = false;
> 
>+                 /* Need a higher delay, to avoid wrong repeat */
>+                 dev->rc_input_dev->rep[REP_DELAY] = 500;
>+
>                        dib0700_rc_setup(dev);
>
>Maybe the better solution is to use, by default:
>	rc_input_dev->rep[REP_DELAY] = 500;
>	#define IR_KEYPRESS_TIMEOUT 250
>
>And, eventually, adding a patch to allow changing it per device.
>
>That's said, IMHO, 500ms is a very reasonable time for starting repeat with remotes. 
>Opinions?
>
>Cheers,
>Mauro.
>--
>To unsubscribe from this list: send the line "unsubscribe linux-media" in
>the body of a message to majordomo@xxxxxxxxxxxxxxx
>More majordomo info at  http://vger.kernel.org/majordomo-info.html
��.n��������+%������w��{.n�����{��g����^n�r������&��z�ޗ�zf���h���~����������_��+v���)ߣ�

[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux