media/rc/ir-nec-decode : phantom keypress
Subsystems (2)
PATCH 1/1 media/rc/ir-nec-decode : phantom keypress
Hi,
I believe I've found a bug in the NEC decoder for InfraRed remote controls. The problem manifests itself as an extra keypress that happens when pushing different buttons in "rapid" succession.
I can reproduce the problem easily (but not always) by pushing DOWN, DOWN, UP in "rapid" succession. I put "rapid" in quotes, because I don't have to hurry in any way, it happens when I use it normally. Depending on the duration of the presses, I get a number of repeats of DOWN. The bug is that an additional DOWN keypress happens at the time that I press the UP key (or so it seams).
Attached is kernel-debug.log, which contains the redacted and annotated dmesg output, illustrating the problem described above. Especially note lines 31-36 and 54-59, where more than 200ms pass between the end of the IR-code and the actual emit of the keydown event.
I've debugged this issue, and believe I've found the cause: The keypress is only emitted in state 5 (STATE_TRAILER_SPACE). This state is only executed when the space after the message is received, i.e. when the next pulse (of the next message) starts. It is only then that the length of the space is known, and that ir_raw_event will fire an event.
The patch below addresses this issue. This is my first kernel patch. I've tried to follow all guidelines that I could find, but might have missed a few.
I've tested this patch with the out-of-tree TBS drivers (which seem to be based on 3.13), and it solves the bug.
I've compared this TBS-version with the current master (1487385). There are 8 (non-comment) lines that differ, none affect this patch. This patch applies cleanly to the current master.
Regards,
Niels
Quoted 1 line
From
071c316e9315f22a055d6713cc8cdcdc73642193Mon Sep 17 00:00:00 2001
From: Niels Laukens <[email protected]>
Date: Sat, 31 May 2014 10:30:18 +0200
Subject: [PATCH] drivers/media/rc/ir-nec-decode: fix phantom detect
The IR NEC decoder waited until the TRAILER_SPACE state to emit a keypress. Since the triggering 'space' event will only be sent at the beginning of the *next* IR-code, this is way to late.
This patch moves the processing to the TRAILER_PULSE state. Since we arrived here with a 'pulse' event, we know that the pulse has ended and thus that the space is there (as of yet with unknown length).
--- drivers/media/rc/ir-nec-decoder.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
drivers/media/rc/ir-nec-decoder.c +10 -10
@@ -148,16 +148,6 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev)if (!eq_margin (ev.duration,NEC_TRAILER_PULSE ,NEC_UNIT /2 ))break ; - data->state =STATE_TRAILER_SPACE ; -return 0 ; - -case STATE_TRAILER_SPACE : -if (ev.pulse) -break ; - -if (!geq_margin (ev.duration,NEC_TRAILER_SPACE ,NEC_UNIT /2 )) -break ; - address =bitrev8 ((data->bits >>24 ) &0xff ); not_address =bitrev8 ((data->bits >>16 ) &0xff ); command =bitrev8 ((data->bits >>8 ) &0xff );
@@ -190,6 +180,16 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev) data->necx_repeat = true;rc_keydown (dev, scancode,0 ); + data->state =STATE_TRAILER_SPACE ; +return 0 ; + +case STATE_TRAILER_SPACE : +if (ev.pulse) +break ; + +if (!geq_margin (ev.duration,NEC_TRAILER_SPACE ,NEC_UNIT /2 )) +break ; + data->state =STATE_INACTIVE ;return 0 ; }
Signature · 1 line
1.8.5.2 (Apple Git-48)
[ 587.936293] ir_nec_decode: NEC decode started at state 0 (9078us pulse)
[ 587.936298] ir_nec_decode: NEC decode started at state 1 (4441us space)
[ 587.952299] ir_nec_decode: NEC decode started at state 2 (627us pulse)
[ 587.952304] ir_nec_decode: NEC decode started at state 3 (504us space)
... more states 2||3 ...
[ 588.000351] ir_nec_decode: NEC decode started at state 2 (625us pulse)
[ 588.000353] ir_nec_decode: NEC decode started at state 3 (503us space)
[ 588.000355] ir_nec_decode: NEC decode started at state 4 (623us pulse)
[ 588.044379] ir_nec_decode: NEC decode started at state 5 (39684us space)
[ 588.044383] ir_nec_decode: NEC scancode 0x0088
[ 588.044386] rc_g_keycode_from_table: saa716x IR (TurboSight TBS 6281): scancode 0x0088 keycode 0x6c
[ 588.044394] ir_do_keydown: saa716x IR (TurboSight TBS 6281): key down event, key 0x006c, scancode 0x0088[ 588.044420] ir_nec_decode: NEC decode started at state 0 (9080us pulse) [ 588.044422] ir_nec_decode: NEC decode started at state 1 (2184us space) [ 588.044426] ir_nec_decode: Repeat last key [ 588.044428] ir_nec_decode: NEC decode started at state 4 (625us pulse) [ 588.152556] ir_nec_decode: NEC decode started at state 5 (96421us space) [ 588.152559] ir_nec_decode: NEC scancode 0x0088 [ 588.152561] rc_g_keycode_from_table: saa716x IR (TurboSight TBS 6281): scancode 0x0088 keycode 0x6c
[ 588.260571] ir_nec_decode: NEC decode started at state 0 (9078us pulse)
[ 588.276577] ir_nec_decode: NEC decode started at state 1 (4440us space)
[ 588.276583] ir_nec_decode: NEC decode started at state 2 (627us pulse)
[ 588.276587] ir_nec_decode: NEC decode started at state 3 (504us space)
... more states 2||3 ...
[ 588.324632] ir_nec_decode: NEC decode started at state 2 (625us pulse)
[ 588.324634] ir_nec_decode: NEC decode started at state 3 (505us space)
[ 588.324636] ir_nec_decode: NEC decode started at state 4 (624us pulse)
[ 588.404656] ir_do_keyup: keyup key 0x006c
[ 588.568833] ir_nec_decode: NEC decode started at state 5 (240550us space)
[ 588.568837] ir_nec_decode: NEC scancode 0x0088
[ 588.568840] rc_g_keycode_from_table: saa716x IR (TurboSight TBS 6281): scancode 0x0088 keycode 0x6c
[ 588.568843] ir_do_keydown: saa716x IR (TurboSight TBS 6281): key down event, key 0x006c, scancode 0x0088[ 588.568863] ir_nec_decode: NEC decode started at state 0 (9076us pulse)
[ 588.584848] ir_nec_decode: NEC decode started at state 1 (4445us space)
[ 588.584853] ir_nec_decode: NEC decode started at state 2 (621us pulse)
[ 588.584855] ir_nec_decode: NEC decode started at state 3 (507us space)
... more states 2||3 ...
[ 588.632927] ir_nec_decode: NEC decode started at state 2 (621us pulse)
[ 588.632928] ir_nec_decode: NEC decode started at state 3 (509us space)
[ 588.632930] ir_nec_decode: NEC decode started at state 4 (620us pulse)
[ 588.676927] ir_nec_decode: NEC decode started at state 5 (39683us space)
[ 588.676931] ir_nec_decode: NEC scancode 0x0088
[ 588.676938] rc_g_keycode_from_table: saa716x IR (TurboSight TBS 6281): scancode 0x0088 keycode 0x6c[ 588.676963] ir_nec_decode: NEC decode started at state 0 (9048us pulse) [ 588.676966] ir_nec_decode: NEC decode started at state 1 (2212us space) [ 588.676970] ir_nec_decode: Repeat last key [ 588.676972] ir_nec_decode: NEC decode started at state 4 (597us pulse) [ 588.929112] ir_do_keyup: keyup key 0x006c [ 588.949162] ir_nec_decode: NEC decode started at state 5 (260338us space) [ 588.949166] ir_nec_decode: NEC scancode 0x0088 [ 588.949169] rc_g_keycode_from_table: saa716x IR (TurboSight TBS 6281): scancode 0x0088 keycode 0x6c [ 588.949172] ir_do_keydown: saa716x IR (TurboSight TBS 6281): key down event, key 0x006c, scancode 0x0088
[ 588.949192] ir_nec_decode: NEC decode started at state 0 (9014us pulse)
[ 588.965177] ir_nec_decode: NEC decode started at state 1 (4509us space)
[ 588.965183] ir_nec_decode: NEC decode started at state 2 (582us pulse)
[ 588.965187] ir_nec_decode: NEC decode started at state 3 (571us space)
... more states 2||3 ...
[ 589.013261] ir_nec_decode: NEC decode started at state 2 (594us pulse)
[ 589.013263] ir_nec_decode: NEC decode started at state 3 (534us space)
[ 589.013265] ir_nec_decode: NEC decode started at state 4 (596us pulse)
[ 589.201348] ir_do_keyup: keyup key 0x006cI have not received any response on this email... so I hope to bump this thread back to the more active region in most people's in-boxes.
Quoted 98 lines · Niels Laukens
Hi,
I believe I've found a bug in the NEC decoder for InfraRed remote controls. The problem manifests itself as an extra keypress that happens when pushing different buttons in "rapid" succession.
I can reproduce the problem easily (but not always) by pushing DOWN, DOWN, UP in "rapid" succession. I put "rapid" in quotes, because I don't have to hurry in any way, it happens when I use it normally. Depending on the duration of the presses, I get a number of repeats of DOWN. The bug is that an additional DOWN keypress happens at the time that I press the UP key (or so it seams).
Attached is kernel-debug.log, which contains the redacted and annotated dmesg output, illustrating the problem described above. Especially note lines 31-36 and 54-59, where more than 200ms pass between the end of the IR-code and the actual emit of the keydown event.
I've debugged this issue, and believe I've found the cause: The keypress is only emitted in state 5 (
STATE_TRAILER_SPACE). This state is only executed when the space after the message is received, i.e. when the next pulse (of the next message) starts. It is only then that the length of the space is known, and thatir_raw_eventwill fire an event.The patch below addresses this issue. This is my first kernel patch. I've tried to follow all guidelines that I could find, but might have missed a few.
I've tested this patch with the out-of-tree TBS drivers (which seem to be based on 3.13), and it solves the bug.
I've compared this TBS-version with the current master (1487385). There are 8 (non-comment) lines that differ, none affect this patch. This patch applies cleanly to the current master.Regards,
NielsFrom
071c316e9315f22a055d6713cc8cdcdc73642193Mon Sep 17 00:00:00 2001
From: Niels Laukens <[email protected]>
Date: Sat, 31 May 2014 10:30:18 +0200
Subject: [PATCH]drivers/media/rc/ir-nec-decode: fix phantom detectThe IR NEC decoder waited until the
TRAILER_SPACEstate to emit a keypress. Since the triggering 'space' event will only be sent at the beginning of the *next* IR-code, this is way to late.This patch moves the processing to the
TRAILER_PULSEstate. Since we arrived here with a 'pulse' event, we know that the pulse has ended and thus that the space is there (as of yet with unknown length).Signed-off-by Niels Laukens <[email protected]>--- drivers/media/rc/ir-nec-decoder.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)drivers/media/rc/ir-nec-decoder.c +10
-10@@ -148,16 +148,6 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev)if (!eq_margin (ev.duration,NEC_TRAILER_PULSE ,NEC_UNIT /2 ))break ; - data->state =STATE_TRAILER_SPACE ; -return 0 ; - -case STATE_TRAILER_SPACE : -if (ev.pulse) -break ; - -if (!geq_margin (ev.duration,NEC_TRAILER_SPACE ,NEC_UNIT /2 )) -break ; - address =bitrev8 ((data->bits >>24 ) &0xff ); not_address =bitrev8 ((data->bits >>16 ) &0xff ); command =bitrev8 ((data->bits >>8 ) &0xff );@@ -190,6 +180,16 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev) data->necx_repeat = true;rc_keydown (dev, scancode,0 ); + data->state =STATE_TRAILER_SPACE ; +return 0 ; + +case STATE_TRAILER_SPACE : +if (ev.pulse) +break ; + +if (!geq_margin (ev.duration,NEC_TRAILER_SPACE ,NEC_UNIT /2 )) +break ; + data->state =STATE_INACTIVE ;return 0 ; }
Hi,
the problem with triggering a keypress as soon as 32 bits have been received (i.e. before the trailing silence is detected) is that it would cause phantom keypresses on some other protocols (I'm thinking of NEC48, which does exist in the wild).
Now, the question is why the trailing silence isn't generated within a reasonable time. Which hardware decoder do you use?
//David
Quoted 105 lines · Niels Laukens
I have not received any response on this email... so I hope to bump this thread back to the more active region in most people's in-boxes.
Quoted 100 lines · Niels Laukens
Hi,
I believe I've found a bug in the NEC decoder for InfraRed remote controls. The problem manifests itself as an extra keypress that happens when pushing different buttons in "rapid" succession.
I can reproduce the problem easily (but not always) by pushing DOWN, DOWN, UP in "rapid" succession. I put "rapid" in quotes, because I don't have to hurry in any way, it happens when I use it normally. Depending on the duration of the presses, I get a number of repeats of DOWN. The bug is that an additional DOWN keypress happens at the time that I press the UP key (or so it seams).
Attached is kernel-debug.log, which contains the redacted and annotated dmesg output, illustrating the problem described above. Especially note lines 31-36 and 54-59, where more than 200ms pass between the end of the IR-code and the actual emit of the keydown event.
I've debugged this issue, and believe I've found the cause: The keypress is only emitted in state 5 (
STATE_TRAILER_SPACE). This state is only executed when the space after the message is received, i.e. when the next pulse (of the next message) starts. It is only then that the length of the space is known, and thatir_raw_eventwill fire an event.The patch below addresses this issue. This is my first kernel patch. I've tried to follow all guidelines that I could find, but might have missed a few.
I've tested this patch with the out-of-tree TBS drivers (which seem to be based on 3.13), and it solves the bug.
I've compared this TBS-version with the current master (1487385). There are 8 (non-comment) lines that differ, none affect this patch. This patch applies cleanly to the current master.Regards,
NielsFrom
071c316e9315f22a055d6713cc8cdcdc73642193Mon Sep 17 00:00:00 2001
From: Niels Laukens <[email protected]>
Date: Sat, 31 May 2014 10:30:18 +0200
Subject: [PATCH]drivers/media/rc/ir-nec-decode: fix phantom detectThe IR NEC decoder waited until the
TRAILER_SPACEstate to emit a keypress. Since the triggering 'space' event will only be sent at the beginning of the *next* IR-code, this is way to late.This patch moves the processing to the
TRAILER_PULSEstate. Since we arrived here with a 'pulse' event, we know that the pulse has ended and thus that the space is there (as of yet with unknown length).Signed-off-by Niels Laukens <[email protected]>--- drivers/media/rc/ir-nec-decoder.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)drivers/media/rc/ir-nec-decoder.c +0
-10@@ -148,16 +148,6 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev)if (!eq_margin (ev.duration,NEC_TRAILER_PULSE ,NEC_UNIT /2 ))break ; - data->state =STATE_TRAILER_SPACE ; -return 0 ; - -case STATE_TRAILER_SPACE : -if (ev.pulse) -break ; - -if (!geq_margin (ev.duration,NEC_TRAILER_SPACE ,NEC_UNIT /2 )) -break ; - address =bitrev8 ((data->bits >>24 ) &0xff ); not_address =bitrev8 ((data->bits >>16 ) &0xff );drivers/media/rc/ir-nec-decoder.c +10
-0command =bitrev8 ((data->bits >>8 ) &0xff );@@ -190,6 +180,16 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev) data->necx_repeat = true;rc_keydown (dev, scancode,0 ); + data->state =STATE_TRAILER_SPACE ; +return 0 ; + +case STATE_TRAILER_SPACE : +if (ev.pulse) +break ; + +if (!geq_margin (ev.duration,NEC_TRAILER_SPACE ,NEC_UNIT /2 )) +break ; + data->state =STATE_INACTIVE ;return 0 ;}
Quoted 1 line · David Härdeman
Hi,
Hi, thanks for the response
Quoted 2 lines
the problem with triggering a keypress as soon as 32 bits have been received (i.e. before the trailing silence is detected)
Just for clarity: this patch does wait for the trailing silence. It does NOT wait for the trailing silence to have (at least) a specific length. (The pulse event is only fired after the pulse has ended, because the length of the pulse needs to be known)
Quoted 3 lines
is that it would
cause phantom keypresses on some other protocols (I'm thinking of NEC48, which does exist in the wild).
I don't think the current code is able to decode NEC48. Is NEC48 recognizable in some other way than just being longer?
In that case, the alternative would be to start a timer when the TRAILING_SPACE is entered, and trigger the key-event after, say 2 bit-times.
Quoted 2 lines
Now, the question is why the trailing silence isn't generated within a reasonable time. Which hardware decoder do you use?
I use the IR receiver built in to the TBS6281 DVB-T tuner card. I also have a TBS6982 DVB-S card, but I guess it's the same hardware.
It also depends on what "reasonable" means. I've found 300+ms, which is unusable long.
Niels
Quoted 109 lines · Niels Laukens
Quoted 108 lines
I have not received any response on this email... so I hope to bump this thread back to the more active region in most people's in-boxes.
Quoted 103 lines · Niels Laukens
Hi,
I believe I've found a bug in the NEC decoder for InfraRed remote controls. The problem manifests itself as an extra keypress that happens when pushing different buttons in "rapid" succession.
I can reproduce the problem easily (but not always) by pushing DOWN, DOWN,
UP in "rapid" succession. I put "rapid" in quotes, because I don't have to
hurry in any way, it happens when I use it normally. Depending on the duration of the presses, I get a number of repeats of DOWN. The bug is that an additional DOWN keypress happens at the time that I press the UP key (or so it seams).Attached is kernel-debug.log, which contains the redacted and annotated dmesg output, illustrating the problem described above. Especially note lines 31-36 and 54-59, where more than 200ms pass between the end of the IR-code and the actual emit of the keydown event.
I've debugged this issue, and believe I've found the cause: The keypress is only emitted in state 5 (
STATE_TRAILER_SPACE). This state is only executed when the space after the message is received, i.e. when the next pulse (of the next message) starts. It is only then that the length of the space is known, and thatir_raw_eventwill fire an event.The patch below addresses this issue. This is my first kernel patch. I've tried to follow all guidelines that I could find, but might have missed a few.
I've tested this patch with the out-of-tree TBS drivers (which seem to be based on 3.13), and it solves the bug.
I've compared this TBS-version with the current master (1487385). There are 8 (non-comment) lines that differ, none affect this patch. This patch applies cleanly to the current master.Regards,
NielsFrom
071c316e9315f22a055d6713cc8cdcdc73642193Mon Sep 17 00:00:00 2001
From: Niels Laukens <[email protected]>
Date: Sat, 31 May 2014 10:30:18 +0200
Subject: [PATCH]drivers/media/rc/ir-nec-decode: fix phantom detectThe IR NEC decoder waited until the
TRAILER_SPACEstate to emit a keypress. Since the triggering 'space' event will only be sent at the beginning of the *next* IR-code, this is way to late.This patch moves the processing to the
TRAILER_PULSEstate. Since we arrived here with a 'pulse' event, we know that the pulse has ended and thus that the space is there (as of yet with unknown length).Signed-off-by Niels Laukens <[email protected]>--- drivers/media/rc/ir-nec-decoder.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)drivers/media/rc/ir-nec-decoder.c +0
-10@@ -148,16 +148,6 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev)if (!eq_margin (ev.duration,NEC_TRAILER_PULSE ,NEC_UNIT /2 ))break ; - data->state =STATE_TRAILER_SPACE ; -return 0 ; - -case STATE_TRAILER_SPACE : -if (ev.pulse) -break ; - -if (!geq_margin (ev.duration,NEC_TRAILER_SPACE ,NEC_UNIT /2 )) -break ; - address =bitrev8 ((data->bits >>24 ) &0xff ); not_address =bitrev8 ((data->bits >>16 ) &0xff );command = bitrev8((data->bits >> 8) & 0xff);drivers/media/rc/ir-nec-decoder.c +10
-0@@ -190,6 +180,16 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev) data->necx_repeat = true;rc_keydown (dev, scancode,0 ); + data->state =STATE_TRAILER_SPACE ; +return 0 ; + +case STATE_TRAILER_SPACE : +if (ev.pulse) +break ; + +if (!geq_margin (ev.duration,NEC_TRAILER_SPACE ,NEC_UNIT /2 )) +break ; + data->state =STATE_INACTIVE ;return 0 ;}
Quoted 6 lines · Niels Laukens
Quoted 1 line · David Härdeman
Hi,
Hi, thanks for the response
Quoted 7 lines
Quoted 2 lines
the problem with triggering a keypress as soon as 32 bits have been received (i.e. before the trailing silence is detected)
Just for clarity: this patch does wait for the trailing silence. It does NOT wait for the trailing silence to have (at least) a specific length. (The pulse event is only fired after the pulse has ended, because the length of the pulse needs to be known)
True.
Interpret "trailing silence" above as "silence long enough to indicate end of message" :)
Quoted 5 lines
Quoted 3 lines
is that it would
cause phantom keypresses on some other protocols (I'm thinking of NEC48, which does exist in the wild).I don't think the current code is able to decode NEC48.
No, but it would still be nice not to interpret a NEC48 signal as NEC32.
Quoted 1 line
Is NEC48 recognizable in some other way than just being longer?
IIRC, no.
Quoted 2 lines
In that case, the alternative would be to start a timer when the
TRAILING_SPACEis entered, and trigger the key-event after, say 2 bit-times.
Another alternative is fix the driver to implement a timeout so that "unreasonable" values are not generated (I saw a 240550us space in your log).
That's basically what the filtering version of the raw interface does (cf. the use of dev->timeout in ir_raw_event_store_with_filter()).
And it's what most of the popular hardware does. For instance, the mceusb hardware will send a USB packet with timings including that trailing silence. And the decoder can only do their work once a packet has arrived (which will contain a number of samples). That also demonstrates a potential problem with your suggested approach (i.e. timings can be buffered so calls to the decoders are not necessarily "real-time").
Quoted 5 lines
Quoted 2 lines
Now, the question is why the trailing silence isn't generated within a reasonable time. Which hardware decoder do you use?
I use the IR receiver built in to the TBS6281 DVB-T tuner card. I also have a TBS6982 DVB-S card, but I guess it's the same hardware.
Which driver?
Quoted 2 lines
It also depends on what "reasonable" means. I've found 300+ms, which is unusable long.
Agreed...
//David
Quoted 8 lines · David Härdeman
Quoted 3 lines · Niels Laukens
In that case, the alternative would be to start a timer when the
TRAILING_SPACEis entered, and trigger the key-event after, say 2 bit-times.Another alternative is fix the driver to implement a timeout so that "unreasonable" values are not generated (I saw a 240550us space in your log).
OK, that sounds like a good way to solve this as well. I'm very new to this subsystem, so I don't know what layer should perform what function.
Quoted 7 lines
Quoted 5 lines
Quoted 2 lines
Now, the question is why the trailing silence isn't generated within a reasonable time. Which hardware decoder do you use?
I use the IR receiver built in to the TBS6281 DVB-T tuner card. I also have a TBS6982 DVB-S card, but I guess it's the same hardware.
Which driver?
I think it's the out-of-tree saa716x_tbs_dvb driver:
[ 7.670565] input: saa716x IR (TurboSight TBS 6281) as /devices/pci0000:00/0000:00:1c.0/0000:02:00.0/rc/rc0/input6 [ 7.671156] rc0: saa716x IR (TurboSight TBS 6281) as
/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/rc/rc0
Quoted 1 line
And it's what most of the popular hardware does.
So I'll have to rework this patch to function at this lower level, and try to upstream it to TBS. Thank you for your time!
Quoted 7 lines
For instance, the
mceusb hardware will send a USB packet with timings including that trailing silence. And the decoder can only do their work once a packet has arrived (which will contain a number of samples). That also demonstrates a potential problem with your suggested approach (i.e. timings can be buffered so calls to the decoders are not necessarily "real-time").
I see what you mean, but I don't see how the proposed patch fails in this sense. Or were you referring to the proposal of adding a timer at the ir-nec-decoder level?
Niels
Quoted 6 lines · Niels Laukens
Quoted 5 lines · David Härdeman
Quoted 3 lines · Niels Laukens
In that case, the alternative would be to start a timer when the
TRAILING_SPACEis entered, and trigger the key-event after, say 2 bit-times.
Quoted 7 lines
Quoted 3 lines
Another alternative is fix the driver to implement a timeout so that "unreasonable" values are not generated (I saw a 240550us space in your log).
OK, that sounds like a good way to solve this as well. I'm very new to this subsystem, so I don't know what layer should perform what function.
I'm not 100% sure that would be the right fix, but I think so. Haven't looked at the driver.
Quoted 6 lines
Quoted 6 lines
Quoted 5 lines
Quoted 2 lines
Now, the question is why the trailing silence isn't generated within a reasonable time. Which hardware decoder do you use?
I use the IR receiver built in to the TBS6281 DVB-T tuner card. I also have a TBS6982 DVB-S card, but I guess it's the same hardware.
Quoted 8 lines
Quoted 1 line
Which driver?
I think it's the out-of-tree
saa716x_tbs_dvbdriver:[ 7.670565] input: saa716x IR (TurboSight TBS 6281) as /devices/pci0000:00/0000:00:1c.0/0000:02:00.0/rc/rc0/input6 [ 7.671156] rc0: saa716x IR (TurboSight TBS 6281) as/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/rc/rc0
Could you paste the output from lsmod?
Where did you get the driver? Is it this one?
http://www.tbsdtv.com/download/document/common/tbs-linux-drivers_v140425.zip
Quoted 14 lines
Quoted 1 line
And it's what most of the popular hardware does.
So I'll have to rework this patch to function at this lower level, and try to upstream it to TBS. Thank you for your time!
Quoted 7 lines
For instance, the
mceusb hardware will send a USB packet with timings including that trailing silence. And the decoder can only do their work once a packet has arrived (which will contain a number of samples). That also demonstrates a potential problem with your suggested approach (i.e. timings can be buffered so calls to the decoders are not necessarily "real-time").
Quoted 3 lines
I see what you mean, but I don't see how the proposed patch fails in this sense. Or were you referring to the proposal of adding a timer at the ir-nec-decoder level?
Yes. The ir-nec-decoder timer doesn't know what the hardware is up to so it could timeout because it didn't get more data in time while at the same time the driver is buffering data...
Quoted 1 line · David Härdeman
Could you paste the output from lsmod?
At the end of this mail.
Quoted 2 lines
Where did you get the driver? Is it this one?
http://www.tbsdtv.com/download/document/common/tbs-linux-drivers_v140425.zip
Yes, inside the zip is linux-tbs-drivers.tar.bz2, where the actual drivers live. I believe we should be looking at linux-tbs-drivers/linux/drivers/media/common/saa716x/saa716x_input.c
I think the interesting parts are at the end of the file, where the two IRQ-handling functions are.
I don't understand why there is a 15ms timer before ir_raw_event_handle() is called (the comment just says what the code does, not why it does it). I assume this throttles the decoders a bit. Does that make sense?
Quoted 1 line
From what I understand from the code, the hardware fires an interrupt
every time there is an edge, so I need to start a timer myself to call ir_raw_event_set_idle() some time in the future. (And possible re-schedule the ir_raw_event_handle() call as well). Does that sound right?
I've been reading ir-raw.c, but I don't see any timers there. I see the timeout-check in ir_raw_event_store_with_filter(), but that will only fire when called, and won't trigger by itself.
Thanks again for your time,
Niels
# lsmod Module Size Used by rpcsec_gss_krb5 35573 1 nfsv4 465643 2 tbsfe 13023 2 nfsd 280297 2 auth_rpcgss 59338 3 nfsd,rpcsec_gss_krb5 nfs_acl 12837 1 nfsd nfs 236636 2 nfsv4 lockd 93977 2 nfs,nfsd sunrpc 284404 10 nfs,nfsd,rpcsec_gss_krb5,auth_rpcgss,lockd,nfsv4,nfs_acl fscache 63988 2 nfs,nfsv4 hid_generic 12548 0 usbhid 52616 0 hid 106148 2 hid_generic,usbhid tbs62x1fe 55345 2 snd_hda_codec_hdmi 46207 2 snd_hda_codec_realtek 61438 1 ir_lirc_codec 12898 0 lirc_dev 19166 1 ir_lirc_codec snd_seq_midi 13324 0 snd_seq_midi_event 14899 1 snd_seq_midi snd_rawmidi 30144 1 snd_seq_midi ir_mce_kbd_decoder 12845 0 ir_sony_decoder 12549 0 ir_jvc_decoder 12546 0 intel_rapl 18773 0 x86_pkg_temp_thermal 14205 0 ir_rc6_decoder 12546 0 intel_powerclamp 14705 0 kvm_intel 143060 0 kvm 451511 1 kvm_intel ir_rc5_decoder 12546 0 crct10dif_pclmul 14289 0 ir_nec_decoder 12546 0 crc32_pclmul 13113 0 ghash_clmulni_intel 13259 0 rc_tbs_nec 12502 0 aesni_intel 55624 0 snd_seq 61560 2 snd_seq_midi_event,snd_seq_midi aes_x86_64 17131 1 aesni_intel lrw 13286 1 aesni_intel gf128mul 14951 1 lrw glue_helper 13990 1 aesni_intel snd_hda_intel 52355 5 ablk_helper 13597 1 aesni_intel cryptd 20359 3 ghash_clmulni_intel,aesni_intel,ablk_helper snd_hda_codec 192906 3 snd_hda_codec_realtek,snd_hda_codec_hdmi,snd_hda_intel snd_hwdep 13602 1 snd_hda_codec i915 783485 1 serio_raw 13462 0 snd_pcm 102099 3 snd_hda_codec_hdmi,snd_hda_codec,snd_hda_intel saa716x_tbs_dvb 76784 0 tbs6982fe 22408 1 saa716x_tbs_dvb tbs6680fe 17791 1 saa716x_tbs_dvb tbs6923fe 22408 1 saa716x_tbs_dvb tbs6985se 17882 1 saa716x_tbs_dvb tbs6928se 17884 1 saa716x_tbs_dvb tbs6982se 22408 1 saa716x_tbs_dvb tbs6991fe 17785 1 saa716x_tbs_dvb tbs6618fe 17791 1 saa716x_tbs_dvb saa716x_core 50899 1 saa716x_tbs_dvb tbs6922fe 22478 1 saa716x_tbs_dvb tbs6928fe 17785 1 saa716x_tbs_dvb tbs6991se 17882 1 saa716x_tbs_dvb tbs6290fe 50747 1 saa716x_tbs_dvb stv090x 70414 1 saa716x_tbs_dvb dvb_core 109932 2 saa716x_core,saa716x_tbs_dvb rc_core 26933 11 ir_lirc_codec,ir_rc5_decoder,ir_nec_decoder,ir_sony_decoder,rc_tbs_nec,saa716x_tbs_dvb,ir_mce_kbd_decoder,ir_jvc_decoder,ir_rc6_decoder snd_seq_device 14497 3 snd_seq,snd_rawmidi,snd_seq_midi snd_page_alloc 18710 2 snd_pcm,snd_hda_intel lpc_ich 21080 0 snd_timer 29482 2 snd_pcm,snd_seq snd 69238 21 snd_hda_codec_realtek,snd_hwdep,snd_timer,snd_hda_codec_hdmi,snd_pcm,snd_seq,snd_rawmidi,snd_hda_codec,snd_hda_intel,snd_seq_device,snd_seq_midi nvidia 10675249 29 mei_me 18627 0 mei 82274 1 mei_me soundcore 12680 1 snd video 19476 1 i915 drm_kms_helper 52758 1 i915 mac_hid 13205 0 drm 302817 4 i915,drm_kms_helper,nvidia i2c_algo_bit 13413 2 i915,saa716x_tbs_dvb nct6775 55222 0 hwmon_vid 12783 1 nct6775 coretemp 13435 0 lp 17759 0 parport 42348 1 lp psmouse 102222 0 ahci 25819 4 r8169 67581 0 libahci 32168 1 ahci mii 13934 1 r8169