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

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

?? usb-linux.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
?? 第 1 頁 / 共 2 頁
字號(hào):
/* returns 1 on problem encountered or 0 for success */static int usb_linux_update_endp_table(USBHostDevice *s){    uint8_t *descriptors;    uint8_t devep, type, configuration, alt_interface;    struct usb_ctrltransfer ct;    int interface, ret, length, i;    ct.bRequestType = USB_DIR_IN;    ct.bRequest = USB_REQ_GET_CONFIGURATION;    ct.wValue = 0;    ct.wIndex = 0;    ct.wLength = 1;    ct.data = &configuration;    ct.timeout = 50;    ret = ioctl(s->fd, USBDEVFS_CONTROL, &ct);    if (ret < 0) {        perror("usb_linux_update_endp_table");        return 1;    }    /* in address state */    if (configuration == 0)        return 1;    /* get the desired configuration, interface, and endpoint descriptors     * from device description */    descriptors = &s->descr[18];    length = s->descr_len - 18;    i = 0;    if (descriptors[i + 1] != USB_DT_CONFIG ||        descriptors[i + 5] != configuration) {        printf("invalid descriptor data - configuration\n");        return 1;    }    i += descriptors[i];    while (i < length) {        if (descriptors[i + 1] != USB_DT_INTERFACE ||            (descriptors[i + 1] == USB_DT_INTERFACE &&             descriptors[i + 4] == 0)) {            i += descriptors[i];            continue;        }        interface = descriptors[i + 2];        ct.bRequestType = USB_DIR_IN | USB_RECIP_INTERFACE;        ct.bRequest = USB_REQ_GET_INTERFACE;        ct.wValue = 0;        ct.wIndex = interface;        ct.wLength = 1;        ct.data = &alt_interface;        ct.timeout = 50;        ret = ioctl(s->fd, USBDEVFS_CONTROL, &ct);        if (ret < 0) {            perror("usb_linux_update_endp_table");            return 1;        }        /* the current interface descriptor is the active interface         * and has endpoints */        if (descriptors[i + 3] != alt_interface) {            i += descriptors[i];            continue;        }        /* advance to the endpoints */        while (i < length && descriptors[i +1] != USB_DT_ENDPOINT)            i += descriptors[i];        if (i >= length)            break;        while (i < length) {            if (descriptors[i + 1] != USB_DT_ENDPOINT)                break;            devep = descriptors[i + 2];            switch (descriptors[i + 3] & 0x3) {            case 0x00:                type = USBDEVFS_URB_TYPE_CONTROL;                break;            case 0x01:                type = USBDEVFS_URB_TYPE_ISO;                break;            case 0x02:                type = USBDEVFS_URB_TYPE_BULK;                break;            case 0x03:                type = USBDEVFS_URB_TYPE_INTERRUPT;                break;            default:                printf("usb_host: malformed endpoint type\n");                type = USBDEVFS_URB_TYPE_BULK;            }            s->endp_table[(devep & 0xf) - 1].type = type;            i += descriptors[i];        }    }    return 0;}/* XXX: exclude high speed devices or implement EHCI */USBDevice *usb_host_device_open(const char *devname){    int fd = -1, ret;    USBHostDevice *dev = NULL;    struct usbdevfs_connectinfo ci;    char buf[1024];    int bus_num, addr;    char product_name[PRODUCT_NAME_SZ];    dev = qemu_mallocz(sizeof(USBHostDevice));    if (!dev)        goto fail;#ifdef DEBUG_ISOCH    printf("usb_host_device_open %s\n", devname);#endif    if (usb_host_find_device(&bus_num, &addr,                             product_name, sizeof(product_name),                             devname) < 0)        return NULL;    snprintf(buf, sizeof(buf), USBDEVFS_PATH "/%03d/%03d",             bus_num, addr);    fd = open(buf, O_RDWR | O_NONBLOCK);    if (fd < 0) {        perror(buf);        return NULL;    }    /* read the device description */    dev->descr_len = read(fd, dev->descr, sizeof(dev->descr));    if (dev->descr_len <= 0) {        perror("usb_host_device_open: reading device data failed");        goto fail;    }#ifdef DEBUG    {        int x;        printf("=== begin dumping device descriptor data ===\n");        for (x = 0; x < dev->descr_len; x++)            printf("%02x ", dev->descr[x]);        printf("\n=== end dumping device descriptor data ===\n");    }#endif    dev->fd = fd;    dev->configuration = 1;    /* XXX - do something about initial configuration */    if (!usb_host_update_interfaces(dev, 1))        goto fail;    ret = ioctl(fd, USBDEVFS_CONNECTINFO, &ci);    if (ret < 0) {        perror("usb_host_device_open: USBDEVFS_CONNECTINFO");        goto fail;    }#ifdef DEBUG    printf("host USB device %d.%d grabbed\n", bus_num, addr);#endif    ret = usb_linux_update_endp_table(dev);    if (ret)        goto fail;    if (ci.slow)        dev->dev.speed = USB_SPEED_LOW;    else        dev->dev.speed = USB_SPEED_HIGH;    dev->dev.handle_packet = usb_generic_handle_packet;    dev->dev.handle_reset = usb_host_handle_reset;    dev->dev.handle_control = usb_host_handle_control;    dev->dev.handle_data = usb_host_handle_data;    dev->dev.handle_destroy = usb_host_handle_destroy;    if (product_name[0] == '\0')        snprintf(dev->dev.devname, sizeof(dev->dev.devname),                 "host:%s", devname);    else        pstrcpy(dev->dev.devname, sizeof(dev->dev.devname),                product_name);#ifdef USE_ASYNCIO    /* set up the signal handlers */    sigemptyset(&sigact.sa_mask);    sigact.sa_sigaction = isoch_done;    sigact.sa_flags = SA_SIGINFO;    sigact.sa_restorer = 0;    ret = sigaction(SIG_ISOCOMPLETE, &sigact, NULL);    if (ret < 0) {        perror("usb_host_device_open: sigaction failed");        goto fail;    }    if (pipe(dev->pipe_fds) < 0) {        perror("usb_host_device_open: pipe creation failed");        goto fail;    }    fcntl(dev->pipe_fds[0], F_SETFL, O_NONBLOCK | O_ASYNC);    fcntl(dev->pipe_fds[1], F_SETFL, O_NONBLOCK);    qemu_set_fd_handler(dev->pipe_fds[0], urb_completion_pipe_read, NULL, dev);#endif    dev->urbs_ready = 0;    return (USBDevice *)dev;fail:    if (dev)        qemu_free(dev);    close(fd);    return NULL;}static int get_tag_value(char *buf, int buf_size,                         const char *str, const char *tag,                         const char *stopchars){    const char *p;    char *q;    p = strstr(str, tag);    if (!p)        return -1;    p += strlen(tag);    while (isspace(*p))        p++;    q = buf;    while (*p != '\0' && !strchr(stopchars, *p)) {        if ((q - buf) < (buf_size - 1))            *q++ = *p;        p++;    }    *q = '\0';    return q - buf;}static int usb_host_scan(void *opaque, USBScanFunc *func){    FILE *f;    char line[1024];    char buf[1024];    int bus_num, addr, speed, device_count, class_id, product_id, vendor_id;    int ret;    char product_name[512];    f = fopen(USBDEVFS_PATH "/devices", "r");    if (!f) {        term_printf("Could not open %s\n", USBDEVFS_PATH "/devices");        return 0;    }    device_count = 0;    bus_num = addr = speed = class_id = product_id = vendor_id = 0;    ret = 0;    for(;;) {        if (fgets(line, sizeof(line), f) == NULL)            break;        if (strlen(line) > 0)            line[strlen(line) - 1] = '\0';        if (line[0] == 'T' && line[1] == ':') {            if (device_count && (vendor_id || product_id)) {                /* New device.  Add the previously discovered device.  */                ret = func(opaque, bus_num, addr, class_id, vendor_id,                           product_id, product_name, speed);                if (ret)                    goto the_end;            }            if (get_tag_value(buf, sizeof(buf), line, "Bus=", " ") < 0)                goto fail;            bus_num = atoi(buf);            if (get_tag_value(buf, sizeof(buf), line, "Dev#=", " ") < 0)                goto fail;            addr = atoi(buf);            if (get_tag_value(buf, sizeof(buf), line, "Spd=", " ") < 0)                goto fail;            if (!strcmp(buf, "480"))                speed = USB_SPEED_HIGH;            else if (!strcmp(buf, "1.5"))                speed = USB_SPEED_LOW;            else                speed = USB_SPEED_FULL;            product_name[0] = '\0';            class_id = 0xff;            device_count++;            product_id = 0;            vendor_id = 0;        } else if (line[0] == 'P' && line[1] == ':') {            if (get_tag_value(buf, sizeof(buf), line, "Vendor=", " ") < 0)                goto fail;            vendor_id = strtoul(buf, NULL, 16);            if (get_tag_value(buf, sizeof(buf), line, "ProdID=", " ") < 0)                goto fail;            product_id = strtoul(buf, NULL, 16);        } else if (line[0] == 'S' && line[1] == ':') {            if (get_tag_value(buf, sizeof(buf), line, "Product=", "") < 0)                goto fail;            pstrcpy(product_name, sizeof(product_name), buf);        } else if (line[0] == 'D' && line[1] == ':') {            if (get_tag_value(buf, sizeof(buf), line, "Cls=", " (") < 0)                goto fail;            class_id = strtoul(buf, NULL, 16);        }    fail: ;    }    if (device_count && (vendor_id || product_id)) {        /* Add the last device.  */        ret = func(opaque, bus_num, addr, class_id, vendor_id,                   product_id, product_name, speed);    } the_end:    fclose(f);    return ret;}typedef struct FindDeviceState {    int vendor_id;    int product_id;    int bus_num;    int addr;    char product_name[PRODUCT_NAME_SZ];} FindDeviceState;static int usb_host_find_device_scan(void *opaque, int bus_num, int addr,                                     int class_id,                                     int vendor_id, int product_id,                                     const char *product_name, int speed){    FindDeviceState *s = opaque;    if ((vendor_id == s->vendor_id &&        product_id == s->product_id) ||        (bus_num == s->bus_num &&        addr == s->addr)) {        pstrcpy(s->product_name, PRODUCT_NAME_SZ, product_name);        s->bus_num = bus_num;        s->addr = addr;        return 1;    } else {        return 0;    }}/* the syntax is :   'bus.addr' (decimal numbers) or   'vendor_id:product_id' (hexa numbers) */static int usb_host_find_device(int *pbus_num, int *paddr,                                char *product_name, int product_name_size,                                const char *devname){    const char *p;    int ret;    FindDeviceState fs;    p = strchr(devname, '.');    if (p) {        *pbus_num = strtoul(devname, NULL, 0);        *paddr = strtoul(p + 1, NULL, 0);        fs.bus_num = *pbus_num;        fs.addr = *paddr;        ret = usb_host_scan(&fs, usb_host_find_device_scan);        if (ret)            pstrcpy(product_name, product_name_size, fs.product_name);        return 0;    }    p = strchr(devname, ':');    if (p) {        fs.vendor_id = strtoul(devname, NULL, 16);        fs.product_id = strtoul(p + 1, NULL, 16);        ret = usb_host_scan(&fs, usb_host_find_device_scan);        if (ret) {            *pbus_num = fs.bus_num;            *paddr = fs.addr;            pstrcpy(product_name, product_name_size, fs.product_name);            return 0;        }    }    return -1;}/**********************//* USB host device info */struct usb_class_info {    int class;    const char *class_name;};static const struct usb_class_info usb_class_info[] = {    { USB_CLASS_AUDIO, "Audio"},    { USB_CLASS_COMM, "Communication"},    { USB_CLASS_HID, "HID"},    { USB_CLASS_HUB, "Hub" },    { USB_CLASS_PHYSICAL, "Physical" },    { USB_CLASS_PRINTER, "Printer" },    { USB_CLASS_MASS_STORAGE, "Storage" },    { USB_CLASS_CDC_DATA, "Data" },    { USB_CLASS_APP_SPEC, "Application Specific" },    { USB_CLASS_VENDOR_SPEC, "Vendor Specific" },    { USB_CLASS_STILL_IMAGE, "Still Image" },    { USB_CLASS_CSCID, "Smart Card" },    { USB_CLASS_CONTENT_SEC, "Content Security" },    { -1, NULL }};static const char *usb_class_str(uint8_t class){    const struct usb_class_info *p;    for(p = usb_class_info; p->class != -1; p++) {        if (p->class == class)            break;    }    return p->class_name;}static void usb_info_device(int bus_num, int addr, int class_id,                            int vendor_id, int product_id,                            const char *product_name,                            int speed){    const char *class_str, *speed_str;    switch(speed) {    case USB_SPEED_LOW:        speed_str = "1.5";        break;    case USB_SPEED_FULL:        speed_str = "12";        break;    case USB_SPEED_HIGH:        speed_str = "480";        break;    default:        speed_str = "?";        break;    }    term_printf("  Device %d.%d, speed %s Mb/s\n",                bus_num, addr, speed_str);    class_str = usb_class_str(class_id);    if (class_str)        term_printf("    %s:", class_str);    else        term_printf("    Class %02x:", class_id);    term_printf(" USB device %04x:%04x", vendor_id, product_id);    if (product_name[0] != '\0')        term_printf(", %s", product_name);    term_printf("\n");}static int usb_host_info_device(void *opaque, int bus_num, int addr,                                int class_id,                                int vendor_id, int product_id,                                const char *product_name,                                int speed){    usb_info_device(bus_num, addr, class_id, vendor_id, product_id,                    product_name, speed);    return 0;}void usb_host_info(void){    usb_host_scan(NULL, usb_host_info_device);}#elsevoid usb_host_info(void){    term_printf("USB host devices not supported\n");}/* XXX: modify configure to compile the right host driver */USBDevice *usb_host_device_open(const char *devname){    return NULL;}#endif

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品一区二区三区swag| 成人免费看黄yyy456| 欧美日精品一区视频| 亚洲小少妇裸体bbw| 欧美高清www午色夜在线视频| 亚洲午夜三级在线| 日韩精品专区在线影院重磅| 国产主播一区二区| 国产精品美女一区二区| 日本韩国欧美在线| 日韩av在线播放中文字幕| 精品91自产拍在线观看一区| 国产盗摄精品一区二区三区在线 | 久久久久久免费网| 国产丶欧美丶日本不卡视频| 亚洲欧洲av一区二区三区久久| 91色婷婷久久久久合中文| 天天影视色香欲综合网老头| 国产喂奶挤奶一区二区三区| 91丨porny丨中文| 日韩中文字幕1| 国产亚洲欧美在线| 在线观看不卡视频| 激情综合色综合久久| 中文字幕亚洲视频| 欧美一区二区三区系列电影| 福利电影一区二区| 亚洲成人手机在线| 久久免费偷拍视频| 欧美主播一区二区三区美女| 九九久久精品视频| 一级特黄大欧美久久久| 精品国产一区二区三区忘忧草| 99久久久无码国产精品| 日本亚洲天堂网| 国产精品私人影院| 欧美videossexotv100| 91麻豆精品视频| 久久精品国产**网站演员| 综合精品久久久| 精品久久久久一区| 欧美日韩在线播放三区| 成人免费毛片片v| 美女国产一区二区三区| 亚洲精品中文在线观看| 久久久久久99久久久精品网站| 欧美自拍丝袜亚洲| 99re视频精品| 国产乱码精品一区二区三区五月婷| 亚洲一区二区三区四区五区黄 | 欧美激情在线一区二区三区| 精品视频123区在线观看| 波多野结衣亚洲| 激情久久五月天| 人妖欧美一区二区| 国产电影精品久久禁18| 日韩精品电影在线| 亚洲一二三四久久| 亚洲人快播电影网| 中文字幕欧美国产| 久久久亚洲精品石原莉奈| 91.com在线观看| 欧美视频一二三区| 日本乱码高清不卡字幕| 91伊人久久大香线蕉| 成人一区二区在线观看| 国产一区二区三区最好精华液| 天堂午夜影视日韩欧美一区二区| 一区二区免费在线| 亚洲一区二区三区视频在线 | 久久毛片高清国产| 日韩一区二区三区免费看| 欧美久久久久久蜜桃| 欧美妇女性影城| 欧美三区在线视频| 欧美日韩一卡二卡三卡| 欧美日韩成人综合| 欧美一区二区精品在线| 51精品国自产在线| 日韩美女主播在线视频一区二区三区| 欧美日本乱大交xxxxx| 欧美日韩精品欧美日韩精品一综合| 在线视频一区二区三区| 在线亚洲精品福利网址导航| 欧洲亚洲国产日韩| 3d动漫精品啪啪一区二区竹菊 | 亚洲男人的天堂一区二区 | 久久久久久一二三区| 久久久亚洲精品一区二区三区| 久久亚洲欧美国产精品乐播| 精品国产一区二区国模嫣然| 欧美精品一区二区三区蜜桃视频| 精品国产乱码久久久久久1区2区| 2024国产精品| 18成人在线观看| 亚洲图片有声小说| 男人的天堂久久精品| 国产揄拍国内精品对白| 不卡欧美aaaaa| 欧亚一区二区三区| 日韩免费视频一区二区| 国产欧美久久久精品影院| 国产精品成人一区二区艾草| 亚洲一区免费在线观看| 蜜臀a∨国产成人精品| 国产一区二区按摩在线观看| 成人av在线网| 在线播放视频一区| 久久精品一级爱片| 亚洲精品中文在线观看| 久久精品国产77777蜜臀| 北条麻妃一区二区三区| 国产精品欧美久久久久一区二区| 国产精品高清亚洲| 日韩在线卡一卡二| 不卡一区在线观看| 51午夜精品国产| 国产精品久久久久久久浪潮网站| 亚洲成人午夜影院| 懂色av中文字幕一区二区三区| 欧美三级视频在线播放| 久久久久久免费网| 五月天网站亚洲| 丁香天五香天堂综合| 91精品黄色片免费大全| 中文字幕精品在线不卡| 日韩精品亚洲专区| 91在线精品一区二区| 精品久久久久久无| 亚洲国产精品久久艾草纯爱| 粉嫩欧美一区二区三区高清影视 | 99国产精品久久久久久久久久久| 欧美妇女性影城| 亚洲日韩欧美一区二区在线| 极品少妇一区二区| 欧美日韩在线三级| 亚洲人一二三区| 成人一区二区三区中文字幕| 日韩欧美一级二级| 亚洲福利电影网| 色综合天天视频在线观看| 久久久亚洲精品石原莉奈| 免费三级欧美电影| 欧美午夜精品一区二区三区| 亚洲国产精品av| 久久精品国产亚洲一区二区三区| 在线观看www91| 亚洲欧美一区二区三区国产精品| 国产精品123| 久久综合一区二区| 日本一不卡视频| 欧美肥妇毛茸茸| 亚洲成人在线免费| 欧美曰成人黄网| 亚洲精品国产a久久久久久| 成人动漫视频在线| 日本一二三不卡| 国产精品996| 久久天天做天天爱综合色| 精油按摩中文字幕久久| 欧美一级精品在线| 日本va欧美va精品| 日韩精品一区二区三区三区免费| 肉色丝袜一区二区| 欧美人妇做爰xxxⅹ性高电影| 亚洲一卡二卡三卡四卡无卡久久| 91小视频在线| 一区二区日韩av| 欧美午夜寂寞影院| 亚洲h在线观看| 91精品国产91久久久久久一区二区 | 国产精品综合视频| 欧美激情一二三区| www.亚洲精品| 亚洲日韩欧美一区二区在线| 色av一区二区| 日韩中文字幕一区二区三区| 91麻豆精品国产综合久久久久久 | 狠狠色丁香婷婷综合| 久久综合视频网| 成人影视亚洲图片在线| 亚洲天堂免费看| 欧美日韩精品是欧美日韩精品| 日韩国产高清影视| 久久久久久麻豆| 99久久99久久综合| 亚洲成人免费在线| 精品久久久久久久一区二区蜜臀| 国产精品正在播放| 亚洲蜜臀av乱码久久精品| 欧美视频中文字幕| 美女脱光内衣内裤视频久久网站 | 欧美精品一区二区久久婷婷| 国产成人在线免费| 一区二区三区色| 欧美www视频| 91免费观看视频在线| 日韩高清在线一区| 国产精品午夜免费| 在线不卡a资源高清|