示例#1
0
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);
}
示例#2
0
/* remote control stuff (does not work with my box) */
static int az6007_rc_query(struct dvb_usb_device *d)
{
	struct az6007_device_state *st = d_to_priv(d);
	unsigned code;

	az6007_read(d, AZ6007_READ_IR, 0, 0, st->data, 10);

	if (st->data[1] == 0x44)
		return 0;

	if ((st->data[3] ^ st->data[4]) == 0xff) {
		if ((st->data[1] ^ st->data[2]) == 0xff)
			code = RC_SCANCODE_NEC(st->data[1], st->data[3]);
		else
			code = RC_SCANCODE_NECX(st->data[1] << 8 | st->data[2],
						st->data[3]);
	} else {
		code = RC_SCANCODE_NEC32(st->data[1] << 24 |
					 st->data[2] << 16 |
					 st->data[3] << 8  |
					 st->data[4]);
	}

	rc_keydown(d->rc_dev, RC_TYPE_NEC, code, st->data[5]);

	return 0;
}
示例#3
0
文件: af9015.c 项目: ChineseDr/linux
static int af9015_rc_query(struct dvb_usb_device *d)
{
    struct af9015_state *state = d_to_priv(d);
    int ret;
    u8 buf[17];

    /* read registers needed to detect remote controller code */
    ret = af9015_read_regs(d, 0x98d9, buf, sizeof(buf));
    if (ret)
        goto error;

    /* If any of these are non-zero, assume invalid data */
    if (buf[1] || buf[2] || buf[3]) {
        dev_dbg(&d->udev->dev, "%s: invalid data\n", __func__);
        return ret;
    }

    /* Check for repeat of previous code */
    if ((state->rc_repeat != buf[6] || buf[0]) &&
            !memcmp(&buf[12], state->rc_last, 4)) {
        dev_dbg(&d->udev->dev, "%s: key repeated\n", __func__);
        rc_repeat(d->rc_dev);
        state->rc_repeat = buf[6];
        return ret;
    }

    /* Only process key if canary killed */
    if (buf[16] != 0xff && buf[0] != 0x01) {
        dev_dbg(&d->udev->dev, "%s: key pressed %*ph\n",
                __func__, 4, buf + 12);

        /* Reset the canary */
        ret = af9015_write_reg(d, 0x98e9, 0xff);
        if (ret)
            goto error;

        /* Remember this key */
        memcpy(state->rc_last, &buf[12], 4);
        if (buf[14] == (u8) ~buf[15]) {
            if (buf[12] == (u8) ~buf[13]) {
                /* NEC */
                state->rc_keycode = RC_SCANCODE_NEC(buf[12],
                                                    buf[14]);
            } else {
                /* NEC extended*/
                state->rc_keycode = RC_SCANCODE_NECX(buf[12] << 8 |
                                                     buf[13],
                                                     buf[14]);
            }
        } else {
            /* 32 bit NEC */
            state->rc_keycode = RC_SCANCODE_NEC32(buf[12] << 24 |
                                                  buf[13] << 16 |
                                                  buf[14] << 8  |
                                                  buf[15]);
        }
        rc_keydown(d->rc_dev, RC_TYPE_NEC, state->rc_keycode, 0);
    } else {
        dev_dbg(&d->udev->dev, "%s: no key press\n", __func__);
        /* Invalidate last keypress */
        /* Not really needed, but helps with debug */
        state->rc_last[2] = state->rc_last[3];
    }

    state->rc_repeat = buf[6];
    state->rc_failed = false;

error:
    if (ret) {
        dev_warn(&d->udev->dev, "%s: rc query failed=%d\n",
                 KBUILD_MODNAME, ret);

        /* allow random errors as dvb-usb will stop polling on error */
        if (!state->rc_failed)
            ret = 0;

        state->rc_failed = true;
    }

    return ret;
}
示例#4
0
static int rtl2831u_rc_query(struct dvb_usb_device *d)
{
	int ret, i;
	struct rtl28xxu_priv *priv = d->priv;
	u8 buf[5];
	u32 rc_code;
	struct rtl28xxu_reg_val rc_nec_tab[] = {
		{ 0x3033, 0x80 },
		{ 0x3020, 0x43 },
		{ 0x3021, 0x16 },
		{ 0x3022, 0x16 },
		{ 0x3023, 0x5a },
		{ 0x3024, 0x2d },
		{ 0x3025, 0x16 },
		{ 0x3026, 0x01 },
		{ 0x3028, 0xb0 },
		{ 0x3029, 0x04 },
		{ 0x302c, 0x88 },
		{ 0x302e, 0x13 },
		{ 0x3030, 0xdf },
		{ 0x3031, 0x05 },
	};

	/* init remote controller */
	if (!priv->rc_active) {
		for (i = 0; i < ARRAY_SIZE(rc_nec_tab); i++) {
			ret = rtl28xx_wr_reg(d, rc_nec_tab[i].reg,
					rc_nec_tab[i].val);
			if (ret)
				goto err;
		}
		priv->rc_active = true;
	}

	ret = rtl2831_rd_regs(d, SYS_IRRC_RP, buf, 5);
	if (ret)
		goto err;

	if (buf[4] & 0x01) {
		if (buf[2] == (u8) ~buf[3]) {
			if (buf[0] == (u8) ~buf[1]) {
				/* NEC standard (16 bit) */
				rc_code = RC_SCANCODE_NEC(buf[0], buf[2]);
			} else {
				/* NEC extended (24 bit) */
				rc_code = RC_SCANCODE_NECX(buf[0] << 8 | buf[1],
							   buf[2]);
			}
		} else {
			/* NEC full (32 bit) */
			rc_code = RC_SCANCODE_NEC32(buf[0] << 24 | buf[1] << 16 |
						    buf[2] << 8  | buf[3]);
		}

		rc_keydown(d->rc_dev, RC_TYPE_NEC, rc_code, 0);

		ret = rtl28xx_wr_reg(d, SYS_IRRC_SR, 1);
		if (ret)
			goto err;

		/* repeated intentionally to avoid extra keypress */
		ret = rtl28xx_wr_reg(d, SYS_IRRC_SR, 1);
		if (ret)
			goto err;
	}

	return ret;
err:
	dev_dbg(&d->udev->dev, "%s: failed=%d\n", __func__, ret);
	return ret;
}