Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 208159
b: refs/heads/master
c: 86ff071
h: refs/heads/master
i:
  208157: 2ea8935
  208155: 6057cc8
  208151: f17c008
  208143: 2a25ed5
  208127: f2c2be7
v: v3
  • Loading branch information
Maxim Levitsky authored and Mauro Carvalho Chehab committed Aug 9, 2010
1 parent a8ac3e7 commit 4167b06
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 3 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e31f41278f0bed38ee16b55d09b49bed2f1b2085
refs/heads/master: 86ff071cad3e7e4c7469b3941bfced6fe9b04b5f
2 changes: 2 additions & 0 deletions trunk/drivers/media/IR/ir-core-priv.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
23 changes: 21 additions & 2 deletions trunk/drivers/media/IR/ir-nec-decoder.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 4167b06

Please sign in to comment.