omap3530上移植AMT 6000 系列USB型触摸屏+tslib(4)

for (i = 0; i < 3; i++) {
        ret = usb_control_msg(usbtouch->udev, usb_rcvctrlpipe(usbtouch->udev, 0),
                      MTOUCHUSB_ASYNC_REPORT,
                      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
                      1, 1, NULL, 0, USB_CTRL_SET_TIMEOUT);
        dbg("%s - usb_control_msg - MTOUCHUSB_ASYNC_REPORT - bytes|err: %d",
            __func__, ret);
        if (ret >= 0)
            break;
        if (ret != -EPIPE)
            return ret;
    }

/* Default min/max xy are the raw values, override if using hw-calib */
    if (hwcalib_xy) {
        input_set_abs_params(usbtouch->input, ABS_X, 0, 0xffff, 0, 0);
        input_set_abs_params(usbtouch->input, ABS_Y, 0, 0xffff, 0, 0);
    }

return 0;
}
#endif


/*****************************************************************************
 * ITM Part
 */
#ifdef CONFIG_TOUCHSCREEN_USB_ITM
static int itm_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
{
    int touch;
    /*
     * ITM devices report invalid x/y data if not touched.
     * if the screen was touched before but is not touched any more
     * report touch as 0 with the last valid x/y data once. then stop
     * reporting data until touched again.
     */
    dev->press = ((pkt[2] & 0x01) << 7) | (pkt[5] & 0x7F);

touch = ~pkt[7] & 0x20;
    if (!touch) {
        if (dev->touch) {
            dev->touch = 0;
            return 1;
        }

return 0;
    }

dev->x = ((pkt[0] & 0x1F) << 7) | (pkt[3] & 0x7F);
    dev->y = ((pkt[1] & 0x1F) << 7) | (pkt[4] & 0x7F);
    dev->touch = touch;

return 1;
}
#endif


/*****************************************************************************
 * eTurboTouch part
 */
#ifdef CONFIG_TOUCHSCREEN_USB_ETURBO
#ifndef MULTI_PACKET
#define MULTI_PACKET
#endif
static int eturbo_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
{
    unsigned int shift;

/* packets should start with sync */
    if (!(pkt[0] & 0x80))
        return 0;

shift = (6 - (pkt[0] & 0x03));
    dev->x = ((pkt[3] << 7) | pkt[4]) >> shift;
    dev->y = ((pkt[1] << 7) | pkt[2]) >> shift;
    dev->touch = (pkt[0] & 0x10) ? 1 : 0;

return 1;
}

static int eturbo_get_pkt_len(unsigned char *buf, int len)
{
    if (buf[0] & 0x80)
        return 5;
    if (buf[0] == 0x01)
        return 3;
    return 0;
}
#endif


/*****************************************************************************
 * Gunze part
 */
#ifdef CONFIG_TOUCHSCREEN_USB_GUNZE
static int gunze_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
{
    if (!(pkt[0] & 0x80) || ((pkt[1] | pkt[2] | pkt[3]) & 0x80))
        return 0;

dev->x = ((pkt[0] & 0x1F) << 7) | (pkt[2] & 0x7F);
    dev->y = ((pkt[1] & 0x1F) << 7) | (pkt[3] & 0x7F);
    dev->touch = pkt[0] & 0x20;

return 1;
}
#endif

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwxzdz.html