Re: Inconsistent RC5 ir-keytable events

Sean Young
2022-02-08T16:46:39Z

Hi Marko,

On Sat, Jan 29, 2022 at 07:15:57PM +0200, Marko Mäkelä wrote:
> Hi Sean,
>
> Did you have a chance to repeat my findings with a remote control unit that
> uses the RC5 protocol?

Yes, I've reproduced the problem now. It's very weird.

After pressing button 1, waiting for a second or two, and then pressing button
3, the device reports some old IR from button 1 before reporting the IR from
button 3.

The IR is not a copy of old data, it so presumably its IR that was not
reported before. Now I don't know why this IR gets reported so late.

> I tried to understand the code changes. A few observations:
>
> In rtl2831u_get_rc_config(), rc->interval is set to 400 and rc->timeout is
> not set at all. Maybe it is OK, similar chips supported by the same driver.

The timeout won't have an affect on this problem.

> In rtl2832u_rc_query(), the idle_length is being computed from the last two
> bytes of the IR_RX_BUF buffer. The threshold is 0xc0 and thus
> it can only be exceeded if both last 7-bit bytes are included in the sum.
> Side note: the & 0x7f is redundant, because the most significant bit was
> already tested to be clear:
>
> idle_length = 0;
> if (len > 2) {
> if (!(buf[len - 1] & 0x80))
> idle_length += buf[len - 1] & 0x7f;
> if (!(buf[len - 2] & 0x80))
> idle_length += buf[len - 2] & 0x7f;
> }
>
> dev_dbg(&d->intf->dev, "idle_length=%x\n", idle_length);
>
> if (idle_length < 0xbf)
> return 0;

Yes, you are right. Note that I've observed this problem also we did not
enter the early return here (which I introduced).

> However, I spotted a potential problem here. I may of course be mistaken
> because I do not know how the IR_RX_BUF is supposed to work. Could it happen
> that buf[] contains some IR events, then 2 or more consecutive bytes of no
> pulses (with the total time exceeding 0xbf*51µs), and then again some IR
> events until the very end of the buffer, so that in the above check, we
> would return 0?

I have not seen this happen. You can enable debugging for this using:

echo 'file rtl28xxu.c +p' > /sys/kernel/debug/dynamic_debug/control

dmesg -w

I do not know exactly how the buffer works, only some experimentation will
help here. Unless there is a vendor driver/documentation for this device.

> Could we in that case discard some IR events? Could that
> explain the glitch that I observed with the NEC protocol?

I'm not really sure this is the problem, that's what not what I observed.

Sean