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:
committed by
Mauro Carvalho Chehab
parent
e31f41278f
commit
86ff071cad
@@ -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 @@
|
|||||||
#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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user