static void ir_handle_key(struct bttv *btv) { struct bttv_ir *ir = btv->remote; u32 gpio,data; /* read gpio value */ gpio = bttv_gpio_read(&btv->c); if (ir->polling) { if (ir->last_gpio == gpio) return; ir->last_gpio = gpio; } /* extract data */ data = ir_extract_bits(gpio, ir->mask_keycode); dprintk(KERN_INFO DEVNAME ": irq gpio=0x%x code=%d | %s%s%s\n", gpio, data, ir->polling ? "poll" : "irq", (gpio & ir->mask_keydown) ? " down" : "", (gpio & ir->mask_keyup) ? " up" : ""); if ((ir->mask_keydown && (gpio & ir->mask_keydown)) || (ir->mask_keyup && !(gpio & ir->mask_keyup))) { rc_keydown_notimeout(ir->dev, data, 0); } else { /* HACK: Probably, ir->mask_keydown is missing for this board */ if (btv->c.type == BTTV_BOARD_WINFAST2000) rc_keydown_notimeout(ir->dev, data, 0); rc_keyup(ir->dev); } }
static int m920x_rc_core_query(struct dvb_usb_device *d) { int ret = 0; u8 *rc_state; int state; rc_state = kmalloc(2, GFP_KERNEL); if (!rc_state) return -ENOMEM; if ((ret = m920x_read(d->udev, M9206_CORE, 0x0, M9206_RC_STATE, &rc_state[0], 1)) != 0) goto out; if ((ret = m920x_read(d->udev, M9206_CORE, 0x0, M9206_RC_KEY, &rc_state[1], 1)) != 0) goto out; deb("state=0x%02x keycode=0x%02x\n", rc_state[0], rc_state[1]); m920x_parse_rc_state(d, rc_state[0], &state); if (state == REMOTE_NO_KEY_PRESSED) rc_keyup(d->rc_dev); else if (state == REMOTE_KEY_REPEAT) rc_repeat(d->rc_dev); else rc_keydown(d->rc_dev, RC_PROTO_UNKNOWN, rc_state[1], 0); out: kfree(rc_state); return ret; }
static void ir_enltv_handle_key(struct bttv *btv) { struct bttv_ir *ir = btv->remote; u32 gpio, data, keyup; /* read gpio value */ gpio = bttv_gpio_read(&btv->c); /* extract data */ data = ir_extract_bits(gpio, ir->mask_keycode); /* Check if it is keyup */ keyup = (gpio & ir->mask_keyup) ? 1 << 31 : 0; if ((ir->last_gpio & 0x7f) != data) { dprintk("gpio=0x%x code=%d | %s\n", gpio, data, (gpio & ir->mask_keyup) ? " up" : "up/down"); rc_keydown_notimeout(ir->dev, RC_PROTO_UNKNOWN, data, 0); if (keyup) rc_keyup(ir->dev); } else { if ((ir->last_gpio & 1 << 31) == keyup) return; dprintk("(cnt) gpio=0x%x code=%d | %s\n", gpio, data, (gpio & ir->mask_keyup) ? " up" : "down"); if (keyup) rc_keyup(ir->dev); else rc_keydown_notimeout(ir->dev, RC_PROTO_UNKNOWN, data, 0); } ir->last_gpio = data | keyup; }
static ssize_t user_rc_input_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) { int ret; struct user_rc_input_dev *input_dev = file->private_data; __u8 *buf; buf = kmalloc(count * sizeof(__u8), GFP_KERNEL); if (!buf) { dev_err(input_dev->dev, "kmalloc failed...Insufficient memory\n"); ret = -ENOMEM; goto out; } if (copy_from_user(buf, buffer, count)) { dev_err(input_dev->dev, "Copy from user failed\n"); ret = -EFAULT; goto out_free; } switch (buf[0]) { case USER_CONTROL_PRESSED: dev_dbg(input_dev->dev, "user controlled" " pressed 0x%x\n", buf[1]); rc_keydown(input_dev->rcdev, buf[1], 0); break; case USER_CONTROL_REPEATED: dev_dbg(input_dev->dev, "user controlled" " repeated 0x%x\n", buf[1]); rc_repeat(input_dev->rcdev); break; case USER_CONTROL_RELEASED: dev_dbg(input_dev->dev, "user controlled" " released 0x%x\n", buf[1]); rc_keyup(input_dev->rcdev); break; } out_free: kfree(buf); out: return ret; }
/* IR */ static int tt3650_rc_query(struct dvb_usb_device *d) { int ret; u8 rx[9]; /* A CMD_GET_IR_CODE reply is 9 bytes long */ struct ttusb2_state *st = d->priv; ret = ttusb2_msg(d, CMD_GET_IR_CODE, NULL, 0, rx, sizeof(rx)); if (ret != 0) return ret; if (rx[8] & 0x01) { /* got a "press" event */ st->last_rc_key = (rx[3] << 8) | rx[2]; deb_info("%s: cmd=0x%02x sys=0x%02x\n", __func__, rx[2], rx[3]); rc_keydown(d->rc_dev, st->last_rc_key, 0); } else if (st->last_rc_key) { rc_keyup(d->rc_dev); st->last_rc_key = 0; } return 0; }