Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 357119
b: refs/heads/master
c: 105e368
h: refs/heads/master
i:
  357117: 1da0b1b
  357115: 360a118
  357111: 1778b7e
  357103: e1d0bbf
  357087: a168358
  357055: 17be32e
  356991: 0681023
  356863: f7883c3
v: v3
  • Loading branch information
Mauro Carvalho Chehab committed Dec 21, 2012
1 parent 0a5253f commit 23e2d64
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 21 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: 37285bf2a516a808f1282540badcaf847340a154
refs/heads/master: 105e3687ada4ebe6dfbda7abc3b16106f86a787d
58 changes: 38 additions & 20 deletions trunk/drivers/media/usb/em28xx/em28xx-input.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@ MODULE_PARM_DESC(ir_debug, "enable debug messages [IR]");
struct em28xx_ir_poll_result {
unsigned int toggle_bit:1;
unsigned int read_count:7;
u8 rc_address;
u8 rc_data[4]; /* 1 byte on em2860/2880, 4 on em2874 */

u32 scancode;
};

struct em28xx_IR {
Expand All @@ -72,6 +72,7 @@ struct em28xx_IR {
struct delayed_work work;
unsigned int full_code:1;
unsigned int last_readcount;
u64 rc_type;

int (*get_key)(struct em28xx_IR *, struct em28xx_ir_poll_result *);
};
Expand Down Expand Up @@ -236,11 +237,8 @@ static int default_polling_getkey(struct em28xx_IR *ir,
/* Infrared read count (Reg 0x45[6:0] */
poll_result->read_count = (msg[0] & 0x7f);

/* Remote Control Address (Reg 0x46) */
poll_result->rc_address = msg[1];

/* Remote Control Data (Reg 0x47) */
poll_result->rc_data[0] = msg[2];
/* Remote Control Address/Data (Regs 0x46/0x47) */
poll_result->scancode = msg[1] << 8 | msg[2];

return 0;
}
Expand All @@ -266,13 +264,32 @@ static int em2874_polling_getkey(struct em28xx_IR *ir,
/* Infrared read count (Reg 0x51[6:0] */
poll_result->read_count = (msg[0] & 0x7f);

/* Remote Control Address (Reg 0x52) */
poll_result->rc_address = msg[1];

/* Remote Control Data (Reg 0x53-55) */
poll_result->rc_data[0] = msg[2];
poll_result->rc_data[1] = msg[3];
poll_result->rc_data[2] = msg[4];
/*
* Remote Control Address (Reg 0x52)
* Remote Control Data (Reg 0x53-0x55)
*/
switch (ir->rc_type) {
case RC_BIT_RC5:
poll_result->scancode = msg[1] << 8 | msg[2];
break;
case RC_BIT_NEC:
if ((msg[3] ^ msg[4]) != 0xff) /* 32 bits NEC */
poll_result->scancode = (msg[1] << 24) |
(msg[2] << 16) |
(msg[3] << 8) |
msg[4];
else if ((msg[1] ^ msg[2]) != 0xff) /* 24 bits NEC */
poll_result->scancode = (msg[1] << 16) |
(msg[2] << 8) |
msg[3];
else /* Normal NEC */
poll_result->scancode = msg[1] << 8 | msg[3];
break;
default:
poll_result->scancode = (msg[1] << 24) | (msg[2] << 16) |
(msg[3] << 8) | msg[4];
break;
}

return 0;
}
Expand All @@ -294,17 +311,16 @@ static void em28xx_ir_handle_key(struct em28xx_IR *ir)
}

if (unlikely(poll_result.read_count != ir->last_readcount)) {
dprintk("%s: toggle: %d, count: %d, key 0x%02x%02x\n", __func__,
dprintk("%s: toggle: %d, count: %d, key 0x%04x\n", __func__,
poll_result.toggle_bit, poll_result.read_count,
poll_result.rc_address, poll_result.rc_data[0]);
poll_result.scancode);
if (ir->full_code)
rc_keydown(ir->rc,
poll_result.rc_address << 8 |
poll_result.rc_data[0],
poll_result.scancode,
poll_result.toggle_bit);
else
rc_keydown(ir->rc,
poll_result.rc_data[0],
poll_result.scancode & 0xff,
poll_result.toggle_bit);

if (ir->dev->chip_id == CHIP_ID_EM2874 ||
Expand Down Expand Up @@ -360,12 +376,14 @@ static int em28xx_ir_change_protocol(struct rc_dev *rc_dev, u64 *rc_type)
*rc_type = RC_BIT_RC5;
} else if (*rc_type & RC_BIT_NEC) {
dev->board.xclk &= ~EM28XX_XCLK_IR_RC5_MODE;
ir_config = EM2874_IR_NEC;
ir_config = EM2874_IR_NEC | EM2874_IR_NEC_NO_PARITY;
ir->full_code = 1;
*rc_type = RC_BIT_NEC;
} else if (*rc_type != RC_BIT_UNKNOWN)
rc = -EINVAL;

ir->rc_type = *rc_type;

em28xx_write_reg_bits(dev, EM28XX_R0F_XCLK, dev->board.xclk,
EM28XX_XCLK_IR_RC5_MODE);

Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/media/usb/em28xx/em28xx-reg.h
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@

/* em2874 IR config register (0x50) */
#define EM2874_IR_NEC 0x00
#define EM2874_IR_NEC_NO_PARITY 0x01
#define EM2874_IR_RC5 0x04
#define EM2874_IR_RC6_MODE_0 0x08
#define EM2874_IR_RC6_MODE_6A 0x0b
Expand Down

0 comments on commit 23e2d64

Please sign in to comment.