Commit 86ff071c authored by Maxim Levitsky's avatar Maxim Levitsky Committed by Mauro Carvalho Chehab

V4L/DVB: IR: NECX: support repeat

This adds support for repeat detecting for NECX variant
Tested with uneversal remote
Signed-off-by: default avatarMaxim Levitsky <maximlevitsky@gmail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent e31f4127
...@@ -45,6 +45,8 @@ struct ir_raw_event_ctrl { ...@@ -45,6 +45,8 @@ struct ir_raw_event_ctrl {
int state; int state;
unsigned count; unsigned count;
u32 bits; u32 bits;
bool is_nec_x;
bool necx_repeat;
} nec; } nec;
struct rc5_dec { struct rc5_dec {
int state; int state;
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#define NEC_BIT_1_SPACE (3 * NEC_UNIT) #define NEC_BIT_1_SPACE (3 * NEC_UNIT)
#define NEC_TRAILER_PULSE (1 * NEC_UNIT) #define NEC_TRAILER_PULSE (1 * NEC_UNIT)
#define NEC_TRAILER_SPACE (10 * NEC_UNIT) /* even longer in reality */ #define NEC_TRAILER_SPACE (10 * NEC_UNIT) /* even longer in reality */
#define NECX_REPEAT_BITS 1
enum nec_state { enum nec_state {
STATE_INACTIVE, STATE_INACTIVE,
...@@ -67,8 +68,12 @@ static int ir_nec_decode(struct input_dev *input_dev, struct ir_raw_event ev) ...@@ -67,8 +68,12 @@ static int ir_nec_decode(struct input_dev *input_dev, struct ir_raw_event ev)
if (!ev.pulse) if (!ev.pulse)
break; break;
if (!eq_margin(ev.duration, NEC_HEADER_PULSE, NEC_UNIT / 2) && if (eq_margin(ev.duration, NEC_HEADER_PULSE, NEC_UNIT / 2)) {
!eq_margin(ev.duration, NECX_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; break;
data->count = 0; data->count = 0;
...@@ -105,6 +110,17 @@ static int ir_nec_decode(struct input_dev *input_dev, struct ir_raw_event ev) ...@@ -105,6 +110,17 @@ static int ir_nec_decode(struct input_dev *input_dev, struct ir_raw_event ev)
if (ev.pulse) if (ev.pulse)
break; 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; data->bits <<= 1;
if (eq_margin(ev.duration, NEC_BIT_1_SPACE, NEC_UNIT / 2)) if (eq_margin(ev.duration, NEC_BIT_1_SPACE, NEC_UNIT / 2))
data->bits |= 1; data->bits |= 1;
...@@ -159,6 +175,9 @@ static int ir_nec_decode(struct input_dev *input_dev, struct ir_raw_event ev) ...@@ -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); IR_dprintk(1, "NEC scancode 0x%04x\n", scancode);
} }
if (data->is_nec_x)
data->necx_repeat = true;
ir_keydown(input_dev, scancode, 0); ir_keydown(input_dev, scancode, 0);
data->state = STATE_INACTIVE; data->state = STATE_INACTIVE;
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment