V4L/DVB: IR: NECX: support repeat
This adds support for repeat detecting for NECX variant Tested with uneversal remote Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
e31f41278f
commit
86ff071cad
2 changed files with 23 additions and 2 deletions
|
@ -45,6 +45,8 @@ struct ir_raw_event_ctrl {
|
|||
int state;
|
||||
unsigned count;
|
||||
u32 bits;
|
||||
bool is_nec_x;
|
||||
bool necx_repeat;
|
||||
} nec;
|
||||
struct rc5_dec {
|
||||
int state;
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#define NEC_BIT_1_SPACE (3 * NEC_UNIT)
|
||||
#define NEC_TRAILER_PULSE (1 * NEC_UNIT)
|
||||
#define NEC_TRAILER_SPACE (10 * NEC_UNIT) /* even longer in reality */
|
||||
#define NECX_REPEAT_BITS 1
|
||||
|
||||
enum nec_state {
|
||||
STATE_INACTIVE,
|
||||
|
@ -67,8 +68,12 @@ static int ir_nec_decode(struct input_dev *input_dev, struct ir_raw_event ev)
|
|||
if (!ev.pulse)
|
||||
break;
|
||||
|
||||
if (!eq_margin(ev.duration, NEC_HEADER_PULSE, NEC_UNIT / 2) &&
|
||||
!eq_margin(ev.duration, NECX_HEADER_PULSE, NEC_UNIT / 2))
|
||||
if (eq_margin(ev.duration, NEC_HEADER_PULSE, NEC_UNIT / 2)) {
|
||||
data->is_nec_x = false;
|
||||
data->necx_repeat = false;
|
||||
} else if (eq_margin(ev.duration, NECX_HEADER_PULSE, NEC_UNIT / 2))
|
||||
data->is_nec_x = true;
|
||||
else
|
||||
break;
|
||||
|
||||
data->count = 0;
|
||||
|
@ -105,6 +110,17 @@ static int ir_nec_decode(struct input_dev *input_dev, struct ir_raw_event ev)
|
|||
if (ev.pulse)
|
||||
break;
|
||||
|
||||
if (data->necx_repeat && data->count == NECX_REPEAT_BITS &&
|
||||
geq_margin(ev.duration,
|
||||
NEC_TRAILER_SPACE, NEC_UNIT / 2)) {
|
||||
IR_dprintk(1, "Repeat last key\n");
|
||||
ir_repeat(input_dev);
|
||||
data->state = STATE_INACTIVE;
|
||||
return 0;
|
||||
|
||||
} else if (data->count > NECX_REPEAT_BITS)
|
||||
data->necx_repeat = false;
|
||||
|
||||
data->bits <<= 1;
|
||||
if (eq_margin(ev.duration, NEC_BIT_1_SPACE, NEC_UNIT / 2))
|
||||
data->bits |= 1;
|
||||
|
@ -159,6 +175,9 @@ static int ir_nec_decode(struct input_dev *input_dev, struct ir_raw_event ev)
|
|||
IR_dprintk(1, "NEC scancode 0x%04x\n", scancode);
|
||||
}
|
||||
|
||||
if (data->is_nec_x)
|
||||
data->necx_repeat = true;
|
||||
|
||||
ir_keydown(input_dev, scancode, 0);
|
||||
data->state = STATE_INACTIVE;
|
||||
return 0;
|
||||
|
|
Reference in a new issue