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

/*****************************************************************************
 * DMC TSC-10/25 Part
 *
 * Documentation about the controller and it's protocol can be found at
 *  
 *  
 */
#ifdef CONFIG_TOUCHSCREEN_USB_DMC_TSC10

/* supported data rates. currently using 130 */
#define TSC10_RATE_POINT    0x50
#define TSC10_RATE_30        0x40
#define TSC10_RATE_50        0x41
#define TSC10_RATE_80        0x42
#define TSC10_RATE_100        0x43
#define TSC10_RATE_130        0x44
#define TSC10_RATE_150        0x45

/* commands */
#define TSC10_CMD_RESET        0x55
#define TSC10_CMD_RATE        0x05
#define TSC10_CMD_DATA1        0x01

static int dmc_tsc10_init(struct usbtouch_usb *usbtouch)
{
    struct usb_device *dev = usbtouch->udev;
    int ret = -ENOMEM;
    unsigned char *buf;

buf = kmalloc(2, GFP_KERNEL);
    if (!buf)
        goto err_nobuf;
    /* reset */
    buf[0] = buf[1] = 0xFF;
    ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),
                          TSC10_CMD_RESET,
                          USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
                          0, 0, buf, 2, USB_CTRL_SET_TIMEOUT);
    if (ret < 0)
        goto err_out;
    if (buf[0] != 0x06) {
        ret = -ENODEV;
        goto err_out;
    }

/* set coordinate output rate */
    buf[0] = buf[1] = 0xFF;
    ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),
                          TSC10_CMD_RATE,
                          USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
                          TSC10_RATE_150, 0, buf, 2, USB_CTRL_SET_TIMEOUT);
    if (ret < 0)
        goto err_out;
    if ((buf[0] != 0x06) && (buf[0] != 0x15 || buf[1] != 0x01)) {
        ret = -ENODEV;
        goto err_out;
    }

/* start sending data */
    ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),
                          TSC10_CMD_DATA1,
                          USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
                          0, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);
err_out:
    kfree(buf);
err_nobuf:
    return ret;
}


static int dmc_tsc10_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
{
    dev->x = ((pkt[2] & 0x03) << 8) | pkt[1];
    dev->y = ((pkt[4] & 0x03) << 8) | pkt[3];
    dev->touch = pkt[0] & 0x01;

return 1;
}
#endif


/*****************************************************************************
 * IRTOUCH Part
 */
#ifdef CONFIG_TOUCHSCREEN_USB_IRTOUCH
static int irtouch_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
{
    dev->x = (pkt[3] << 8) | pkt[2];
    dev->y = (pkt[5] << 8) | pkt[4];
    dev->touch = (pkt[1] & 0x03) ? 1 : 0;

return 1;
}
#endif

/*****************************************************************************
 * ET&T TC5UH part
 */
#ifdef CONFIG_TOUCHSCREEN_USB_ETT_TC5UH
static int tc5uh_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
{
    dev->x = ((pkt[2] & 0x0F) << 8) | pkt[1];
    dev->y = ((pkt[4] & 0x0F) << 8) | pkt[3];
    dev->touch = pkt[0] & 0x01;

return 1;
}
#endif

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

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