static void tm6000_ir_keydown(struct tm6000_IR *ir, const char *buf, unsigned int len) { u8 device, command; u32 scancode; enum rc_proto protocol; if (len < 1) return; command = buf[0]; device = (len > 1 ? buf[1] : 0x0); switch (ir->rc_proto) { case RC_PROTO_BIT_RC5: protocol = RC_PROTO_RC5; scancode = RC_SCANCODE_RC5(device, command); break; case RC_PROTO_BIT_NEC: protocol = RC_PROTO_NEC; scancode = RC_SCANCODE_NEC(device, command); break; default: protocol = RC_PROTO_OTHER; scancode = RC_SCANCODE_OTHER(device << 8 | command); break; } dprintk(1, "%s, protocol: 0x%04x, scancode: 0x%08x\n", __func__, protocol, scancode); rc_keydown(ir->rc, protocol, scancode, 0); }
static void bttv_rc5_timer_end(unsigned long data) { struct bttv_ir *ir = (struct bttv_ir *)data; ktime_t tv; u32 gap, rc5, scancode; u8 toggle, command, system; /* get time */ tv = ktime_get(); gap = ktime_to_us(ktime_sub(tv, ir->base_time)); /* avoid overflow with gap >1s */ if (gap > USEC_PER_SEC) { gap = 200000; } /* signal we're ready to start a new code */ ir->active = false; /* Allow some timer jitter (RC5 is ~24ms anyway so this is ok) */ if (gap < 28000) { dprintk("spurious timer_end\n"); return; } if (ir->last_bit < 20) { /* ignore spurious codes (caused by light/other remotes) */ dprintk("short code: %x\n", ir->code); return; } ir->code = (ir->code << ir->shift_by) | 1; rc5 = bttv_rc5_decode(ir->code); toggle = RC5_TOGGLE(rc5); system = RC5_ADDR(rc5); command = RC5_INSTR(rc5); switch (RC5_START(rc5)) { case 0x3: break; case 0x2: command += 0x40; break; default: return; } scancode = RC_SCANCODE_RC5(system, command); rc_keydown(ir->dev, RC_TYPE_RC5, scancode, toggle); dprintk("scancode %x, toggle %x\n", scancode, toggle); }