亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? usb-wacom.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
字號:
/* * Wacom PenPartner USB tablet emulation. * * Copyright (c) 2006 Openedhand Ltd. * Author: Andrzej Zaborowski <balrog@zabor.org> * * Based on hw/usb-hid.c: * Copyright (c) 2005 Fabrice Bellard * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */#include "hw.h"#include "console.h"#include "usb.h"/* Interface requests */#define WACOM_GET_REPORT	0x2101#define WACOM_SET_REPORT	0x2109/* HID interface requests */#define HID_GET_REPORT		0xa101#define HID_GET_IDLE		0xa102#define HID_GET_PROTOCOL	0xa103#define HID_SET_IDLE		0x210a#define HID_SET_PROTOCOL	0x210btypedef struct USBWacomState {    USBDevice dev;    QEMUPutMouseEntry *eh_entry;    int dx, dy, dz, buttons_state;    int x, y;    int mouse_grabbed;    enum {        WACOM_MODE_HID = 1,        WACOM_MODE_WACOM = 2,    } mode;} USBWacomState;static const uint8_t qemu_wacom_dev_descriptor[] = {    0x12,	/*  u8 bLength; */    0x01,	/*  u8 bDescriptorType; Device */    0x10, 0x10,	/*  u16 bcdUSB; v1.10 */    0x00,	/*  u8  bDeviceClass; */    0x00,	/*  u8  bDeviceSubClass; */    0x00,	/*  u8  bDeviceProtocol; [ low/full speeds only ] */    0x08,	/*  u8  bMaxPacketSize0; 8 Bytes */    0x6a, 0x05,	/*  u16 idVendor; */    0x00, 0x00,	/*  u16 idProduct; */    0x10, 0x42,	/*  u16 bcdDevice */    0x01,	/*  u8  iManufacturer; */    0x02,	/*  u8  iProduct; */    0x00,	/*  u8  iSerialNumber; */    0x01,	/*  u8  bNumConfigurations; */};static const uint8_t qemu_wacom_config_descriptor[] = {    /* one configuration */    0x09,	/*  u8  bLength; */    0x02,	/*  u8  bDescriptorType; Configuration */    0x22, 0x00,	/*  u16 wTotalLength; */    0x01,	/*  u8  bNumInterfaces; (1) */    0x01,	/*  u8  bConfigurationValue; */    0x00,	/*  u8  iConfiguration; */    0x80,	/*  u8  bmAttributes;				 Bit 7: must be set,				     6: Self-powered,				     5: Remote wakeup,				     4..0: resvd */    40,		/*  u8  MaxPower; */    /* one interface */    0x09,	/*  u8  if_bLength; */    0x04,	/*  u8  if_bDescriptorType; Interface */    0x00,	/*  u8  if_bInterfaceNumber; */    0x00,	/*  u8  if_bAlternateSetting; */    0x01,	/*  u8  if_bNumEndpoints; */    0x03,	/*  u8  if_bInterfaceClass; HID */    0x01,	/*  u8  if_bInterfaceSubClass; Boot */    0x02,	/*  u8  if_bInterfaceProtocol; [usb1.1 or single tt] */    0x00,	/*  u8  if_iInterface; */    /* HID descriptor */    0x09,	/*  u8  bLength; */    0x21,	/*  u8  bDescriptorType; */    0x01, 0x10,	/*  u16 HID_class */    0x00,	/*  u8  country_code */    0x01,	/*  u8  num_descriptors */    0x22,	/*  u8  type; Report */    0x6e, 0x00,	/*  u16 len */    /* one endpoint (status change endpoint) */    0x07,	/*  u8  ep_bLength; */    0x05,	/*  u8  ep_bDescriptorType; Endpoint */    0x81,	/*  u8  ep_bEndpointAddress; IN Endpoint 1 */    0x03,	/*  u8  ep_bmAttributes; Interrupt */    0x08, 0x00,	/*  u16 ep_wMaxPacketSize; */    0x0a,	/*  u8  ep_bInterval; */};static void usb_mouse_event(void *opaque,                            int dx1, int dy1, int dz1, int buttons_state){    USBWacomState *s = opaque;    s->dx += dx1;    s->dy += dy1;    s->dz += dz1;    s->buttons_state = buttons_state;}static void usb_wacom_event(void *opaque,                            int x, int y, int dz, int buttons_state){    USBWacomState *s = opaque;    s->x = x;    s->y = y;    s->dz += dz;    s->buttons_state = buttons_state;}static inline int int_clamp(int val, int vmin, int vmax){    if (val < vmin)        return vmin;    else if (val > vmax)        return vmax;    else        return val;}static int usb_mouse_poll(USBWacomState *s, uint8_t *buf, int len){    int dx, dy, dz, b, l;    if (!s->mouse_grabbed) {        s->eh_entry = qemu_add_mouse_event_handler(usb_mouse_event, s, 0,                        "QEMU PenPartner tablet");        s->mouse_grabbed = 1;    }    dx = int_clamp(s->dx, -128, 127);    dy = int_clamp(s->dy, -128, 127);    dz = int_clamp(s->dz, -128, 127);    s->dx -= dx;    s->dy -= dy;    s->dz -= dz;    b = 0;    if (s->buttons_state & MOUSE_EVENT_LBUTTON)        b |= 0x01;    if (s->buttons_state & MOUSE_EVENT_RBUTTON)        b |= 0x02;    if (s->buttons_state & MOUSE_EVENT_MBUTTON)        b |= 0x04;    buf[0] = b;    buf[1] = dx;    buf[2] = dy;    l = 3;    if (len >= 4) {        buf[3] = dz;        l = 4;    }    return l;}static int usb_wacom_poll(USBWacomState *s, uint8_t *buf, int len){    int b;    if (!s->mouse_grabbed) {        s->eh_entry = qemu_add_mouse_event_handler(usb_wacom_event, s, 1,                        "QEMU PenPartner tablet");        s->mouse_grabbed = 1;    }    b = 0;    if (s->buttons_state & MOUSE_EVENT_LBUTTON)        b |= 0x01;    if (s->buttons_state & MOUSE_EVENT_RBUTTON)        b |= 0x02;    if (s->buttons_state & MOUSE_EVENT_MBUTTON)        b |= 0x04;    if (len < 7)        return 0;    buf[0] = s->mode;    buf[5] = 0x00;    if (b) {        buf[1] = s->x & 0xff;        buf[2] = s->x >> 8;        buf[3] = s->y & 0xff;        buf[4] = s->y >> 8;        buf[6] = 0;    } else {        buf[1] = 0;        buf[2] = 0;        buf[3] = 0;        buf[4] = 0;        buf[6] = (unsigned char) -127;    }    return 7;}static void usb_wacom_handle_reset(USBDevice *dev){    USBWacomState *s = (USBWacomState *) dev;    s->dx = 0;    s->dy = 0;    s->dz = 0;    s->x = 0;    s->y = 0;    s->buttons_state = 0;    s->mode = WACOM_MODE_HID;}static int usb_wacom_handle_control(USBDevice *dev, int request, int value,                                    int index, int length, uint8_t *data){    USBWacomState *s = (USBWacomState *) dev;    int ret = 0;    switch (request) {    case DeviceRequest | USB_REQ_GET_STATUS:        data[0] = (1 << USB_DEVICE_SELF_POWERED) |            (dev->remote_wakeup << USB_DEVICE_REMOTE_WAKEUP);        data[1] = 0x00;        ret = 2;        break;    case DeviceOutRequest | USB_REQ_CLEAR_FEATURE:        if (value == USB_DEVICE_REMOTE_WAKEUP) {            dev->remote_wakeup = 0;        } else {            goto fail;        }        ret = 0;        break;    case DeviceOutRequest | USB_REQ_SET_FEATURE:        if (value == USB_DEVICE_REMOTE_WAKEUP) {            dev->remote_wakeup = 1;        } else {            goto fail;        }        ret = 0;        break;    case DeviceOutRequest | USB_REQ_SET_ADDRESS:        dev->addr = value;        ret = 0;        break;    case DeviceRequest | USB_REQ_GET_DESCRIPTOR:        switch (value >> 8) {        case USB_DT_DEVICE:            memcpy(data, qemu_wacom_dev_descriptor,                   sizeof(qemu_wacom_dev_descriptor));            ret = sizeof(qemu_wacom_dev_descriptor);            break;        case USB_DT_CONFIG:       	    memcpy(data, qemu_wacom_config_descriptor,                   sizeof(qemu_wacom_config_descriptor));            ret = sizeof(qemu_wacom_config_descriptor);            break;        case USB_DT_STRING:            switch (value & 0xff) {            case 0:                /* language ids */                data[0] = 4;                data[1] = 3;                data[2] = 0x09;                data[3] = 0x04;                ret = 4;                break;            case 1:                /* serial number */                ret = set_usb_string(data, "1");                break;            case 2:		ret = set_usb_string(data, "Wacom PenPartner");                break;            case 3:                /* vendor description */                ret = set_usb_string(data, "QEMU " QEMU_VERSION);                break;            case 4:                ret = set_usb_string(data, "Wacom Tablet");                break;            case 5:                ret = set_usb_string(data, "Endpoint1 Interrupt Pipe");                break;            default:                goto fail;            }            break;        default:            goto fail;        }        break;    case DeviceRequest | USB_REQ_GET_CONFIGURATION:        data[0] = 1;        ret = 1;        break;    case DeviceOutRequest | USB_REQ_SET_CONFIGURATION:        ret = 0;        break;    case DeviceRequest | USB_REQ_GET_INTERFACE:        data[0] = 0;        ret = 1;        break;    case DeviceOutRequest | USB_REQ_SET_INTERFACE:        ret = 0;        break;    case WACOM_SET_REPORT:        qemu_remove_mouse_event_handler(s->eh_entry);        s->mouse_grabbed = 0;        s->mode = data[0];        ret = 0;        break;    case WACOM_GET_REPORT:        data[0] = 0;        data[1] = s->mode;        ret = 2;        break;    /* USB HID requests */    case HID_GET_REPORT:        if (s->mode == WACOM_MODE_HID)            ret = usb_mouse_poll(s, data, length);        else if (s->mode == WACOM_MODE_WACOM)            ret = usb_wacom_poll(s, data, length);        break;    case HID_SET_IDLE:        ret = 0;        break;    default:    fail:        ret = USB_RET_STALL;        break;    }    return ret;}static int usb_wacom_handle_data(USBDevice *dev, USBPacket *p){    USBWacomState *s = (USBWacomState *) dev;    int ret = 0;    switch (p->pid) {    case USB_TOKEN_IN:        if (p->devep == 1) {            if (s->mode == WACOM_MODE_HID)                ret = usb_mouse_poll(s, p->data, p->len);            else if (s->mode == WACOM_MODE_WACOM)                ret = usb_wacom_poll(s, p->data, p->len);            break;        }        /* Fall through.  */    case USB_TOKEN_OUT:    default:        ret = USB_RET_STALL;        break;    }    return ret;}static void usb_wacom_handle_destroy(USBDevice *dev){    USBWacomState *s = (USBWacomState *) dev;    qemu_remove_mouse_event_handler(s->eh_entry);    qemu_free(s);}USBDevice *usb_wacom_init(void){    USBWacomState *s;    s = qemu_mallocz(sizeof(USBWacomState));    if (!s)        return NULL;    s->dev.speed = USB_SPEED_FULL;    s->dev.handle_packet = usb_generic_handle_packet;    s->dev.handle_reset = usb_wacom_handle_reset;    s->dev.handle_control = usb_wacom_handle_control;    s->dev.handle_data = usb_wacom_handle_data;    s->dev.handle_destroy = usb_wacom_handle_destroy;    pstrcpy(s->dev.devname, sizeof(s->dev.devname),            "QEMU PenPartner Tablet");    return (USBDevice *) s;}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美电影一区二区| 亚洲线精品一区二区三区| 国产成人综合网站| 一区二区三区在线观看网站| 91精品国产品国语在线不卡| 国产99精品视频| 免费成人在线视频观看| 一区二区三区欧美激情| 国产午夜精品久久久久久免费视| 成人午夜视频网站| 毛片av一区二区三区| 亚洲在线中文字幕| 中文字幕一区二区三区视频| 91精品国产综合久久香蕉麻豆 | 国产精品看片你懂得| 欧美亚洲国产一区二区三区va | 亚洲天堂a在线| 久久伊人蜜桃av一区二区| 欧美日本精品一区二区三区| 99视频在线精品| 成人午夜精品在线| 国产成人av一区二区三区在线观看| 久久99国产精品尤物| 免费不卡在线视频| 看电视剧不卡顿的网站| 日本不卡在线视频| 国产一区二区三区日韩| 国产成人综合精品三级| 国产成人一区在线| 91香蕉视频污| 欧美日韩另类国产亚洲欧美一级| 欧美日韩亚洲不卡| 精品国产区一区| 国产欧美日韩一区二区三区在线观看| 久久久www成人免费毛片麻豆 | 麻豆国产精品官网| 国产不卡在线播放| 欧美色手机在线观看| 精品国内片67194| 国产精品美女久久久久久久网站| 一区在线观看免费| 久久99在线观看| 91成人国产精品| 国产三级一区二区三区| 亚洲一级二级三级| 成人夜色视频网站在线观看| 欧美午夜不卡在线观看免费| 久久久精品2019中文字幕之3| 亚洲一区在线视频观看| 国产成人午夜视频| 日韩欧美的一区| 婷婷成人综合网| 欧美天堂一区二区三区| 亚洲欧洲无码一区二区三区| 免费欧美日韩国产三级电影| 色狠狠一区二区| 国产人成亚洲第一网站在线播放| 亚洲观看高清完整版在线观看| av电影天堂一区二区在线 | 欧美三级视频在线播放| 中文字幕色av一区二区三区| 成人综合日日夜夜| 国产亚洲精品aa午夜观看| 国产精品白丝jk白祙喷水网站 | 国产欧美中文在线| 国产精品1区2区3区| 欧美va亚洲va国产综合| 精品一区二区三区久久| 666欧美在线视频| 久久精品噜噜噜成人av农村| 欧美精品在线观看播放| 毛片av一区二区三区| 欧美大胆人体bbbb| 国产·精品毛片| 一卡二卡三卡日韩欧美| 欧美一区二区三区男人的天堂| 老司机午夜精品99久久| xfplay精品久久| 日本高清免费不卡视频| 日韩av一区二区三区四区| 久久综合一区二区| 91丝袜呻吟高潮美腿白嫩在线观看| 亚洲一区二区不卡免费| 欧美国产禁国产网站cc| 欧美放荡的少妇| 成人免费高清在线观看| 午夜婷婷国产麻豆精品| 国产色综合一区| 欧美成人午夜电影| 在线视频综合导航| 国产91精品在线观看| 日本成人在线视频网站| 亚洲国产精品影院| 中文字幕一区在线观看| 精品国产乱码久久久久久牛牛 | 国产精品久久久久久福利一牛影视| 色天使色偷偷av一区二区| 久久丁香综合五月国产三级网站| 18欧美乱大交hd1984| 国产亚洲一本大道中文在线| 欧美日韩免费电影| 91福利资源站| 91美女福利视频| av在线综合网| 99国产一区二区三精品乱码| 成人免费高清在线观看| 不卡欧美aaaaa| av福利精品导航| 91高清视频免费看| 欧美日本一道本| 91精品国产综合久久香蕉麻豆| 欧美日韩一级片在线观看| 69堂亚洲精品首页| 欧美精品一区二区久久婷婷| 日韩女优av电影在线观看| 精品少妇一区二区三区| 国产欧美精品日韩区二区麻豆天美| 久久久久久毛片| 亚洲伦在线观看| 天堂午夜影视日韩欧美一区二区| 日韩精品乱码av一区二区| 国模无码大尺度一区二区三区| 99久久精品久久久久久清纯| 色综合欧美在线| 久久久久久亚洲综合影院红桃| 亚洲人一二三区| 韩国视频一区二区| 色噜噜狠狠色综合中国| 欧美日韩一区二区电影| 国产欧美日韩一区二区三区在线观看| 亚洲视频中文字幕| 日韩午夜电影在线观看| 国产精品看片你懂得 | 99久久久精品| 日韩免费观看高清完整版在线观看| 26uuu欧美| 免费在线视频一区| jlzzjlzz亚洲女人18| 精品粉嫩超白一线天av| 亚洲成在人线在线播放| 欧美日韩精品系列| 专区另类欧美日韩| 99精品国产视频| 亚洲va中文字幕| 欧美手机在线视频| 亚洲一区二区三区视频在线| youjizz久久| 亚洲视频在线一区观看| 97se亚洲国产综合自在线观| 一区二区三区国产精品| 91国产福利在线| 美日韩一区二区| 成人手机在线视频| 3d动漫精品啪啪一区二区竹菊| 偷偷要91色婷婷| 国产精品久久久久桃色tv| av在线不卡免费看| 首页亚洲欧美制服丝腿| 日本一二三不卡| 欧美在线免费视屏| 免费久久99精品国产| 久久久精品免费网站| 欧美三级在线看| 国产精品69毛片高清亚洲| 亚洲免费电影在线| 国产午夜精品一区二区| 色综合婷婷久久| 美女视频免费一区| 一二三区精品福利视频| 精品美女在线播放| 在线播放一区二区三区| 国产黄色精品视频| 日本不卡一区二区三区高清视频| 久久奇米777| 26uuuu精品一区二区| 欧美一区二区黄| 欧美日韩在线播放一区| 在线亚洲欧美专区二区| 成人高清在线视频| 日韩电影在线免费| 午夜精品福利久久久| 亚洲成人动漫一区| 日韩av一区二区在线影视| 欧美日韩精品一区二区三区四区| 亚洲一区二区三区四区五区中文 | 中文字幕电影一区| 欧美人牲a欧美精品| 色成人在线视频| 94-欧美-setu| 色欧美乱欧美15图片| 成人v精品蜜桃久久一区| 久久精品国产秦先生| 日韩av中文在线观看| 婷婷久久综合九色综合伊人色| 亚洲福利电影网| 日韩av电影免费观看高清完整版 | 国产日产欧美一区二区视频| 欧美一级黄色大片| 欧美日韩国产天堂| av电影一区二区|