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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? usb-uhci.c

?? xen 3.2.2 源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * USB UHCI controller emulation *  * 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 "vl.h"//#define DEBUG//#define DEBUG_PACKET#define UHCI_CMD_GRESET   (1 << 2)#define UHCI_CMD_HCRESET  (1 << 1)#define UHCI_CMD_RS       (1 << 0)#define UHCI_STS_HCHALTED (1 << 5)#define UHCI_STS_HCPERR   (1 << 4)#define UHCI_STS_HSERR    (1 << 3)#define UHCI_STS_RD       (1 << 2)#define UHCI_STS_USBERR   (1 << 1)#define UHCI_STS_USBINT   (1 << 0)#define TD_CTRL_SPD     (1 << 29)#define TD_CTRL_ERROR_SHIFT  27#define TD_CTRL_IOS     (1 << 25)#define TD_CTRL_IOC     (1 << 24)#define TD_CTRL_ACTIVE  (1 << 23)#define TD_CTRL_STALL   (1 << 22)#define TD_CTRL_BUFFER  (1 << 21)#define TD_CTRL_BABBLE  (1 << 20)#define TD_CTRL_NAK     (1 << 19)#define TD_CTRL_TIMEOUT (1 << 18)#define TD_CTRL_BITSTUFF                                 \                        (1 << 17)#define TD_CTRL_MASK                                     \    (TD_CTRL_BITSTUFF | TD_CTRL_TIMEOUT | TD_CTRL_NAK    \     | TD_CTRL_BABBLE | TD_CTRL_BUFFER | TD_CTRL_STALL)#define UHCI_PORT_RESET (1 << 9)#define UHCI_PORT_LSDA  (1 << 8)#define UHCI_PORT_ENC   (1 << 3)#define UHCI_PORT_EN    (1 << 2)#define UHCI_PORT_CSC   (1 << 1)#define UHCI_PORT_CCS   (1 << 0)#define FRAME_TIMER_FREQ 1000#define FRAME_MAX_LOOPS  100#define NB_PORTS 2typedef struct UHCIPort {    USBPort port;    uint16_t ctrl;} UHCIPort;typedef struct UHCIState {    PCIDevice dev;    uint16_t cmd; /* cmd register */    uint16_t status;    uint16_t intr; /* interrupt enable register */    uint16_t frnum; /* frame number */    uint32_t fl_base_addr; /* frame list base address */    uint8_t sof_timing;    uint8_t status2; /* bit 0 and 1 are used to generate UHCI_STS_USBINT */    QEMUTimer *frame_timer;    UHCIPort ports[NB_PORTS];    /* Interrupts that should be raised at the end of the current frame.  */    uint32_t pending_int_mask;    /* For simplicity of implementation we only allow a single pending USB       request.  This means all usb traffic on this controller is effectively       suspended until that transfer completes.  When the transfer completes       the next transfer from that queue will be processed.  However        other queues will not be processed until the next frame.  The solution       is to allow multiple pending requests.  */    uint32_t async_qh;    USBPacket usb_packet;    uint8_t usb_buf[2048];} UHCIState;typedef struct UHCI_TD {    uint32_t link;    uint32_t ctrl; /* see TD_CTRL_xxx */    uint32_t token;    uint32_t buffer;} UHCI_TD;typedef struct UHCI_QH {    uint32_t link;    uint32_t el_link;} UHCI_QH;static void uhci_attach(USBPort *port1, USBDevice *dev);static void uhci_update_irq(UHCIState *s){    int level;    if (((s->status2 & 1) && (s->intr & (1 << 2))) ||        ((s->status2 & 2) && (s->intr & (1 << 3))) ||        ((s->status & UHCI_STS_USBERR) && (s->intr & (1 << 0))) ||        ((s->status & UHCI_STS_RD) && (s->intr & (1 << 1))) ||        (s->status & UHCI_STS_HSERR) ||        (s->status & UHCI_STS_HCPERR)) {        level = 1;    } else {        level = 0;    }    pci_set_irq(&s->dev, 3, level);}static void uhci_reset(UHCIState *s){    uint8_t *pci_conf;    int i;    UHCIPort *port;    pci_conf = s->dev.config;    pci_conf[0x6a] = 0x01; /* usb clock */    pci_conf[0x6b] = 0x00;    s->cmd = 0;    s->status = 0;    s->status2 = 0;    s->intr = 0;    s->fl_base_addr = 0;    s->sof_timing = 64;    for(i = 0; i < NB_PORTS; i++) {        port = &s->ports[i];        port->ctrl = 0x0080;        if (port->port.dev)            uhci_attach(&port->port, port->port.dev);    }}static void uhci_ioport_writeb(void *opaque, uint32_t addr, uint32_t val){    UHCIState *s = opaque;        addr &= 0x1f;    switch(addr) {    case 0x0c:        s->sof_timing = val;        break;    }}static uint32_t uhci_ioport_readb(void *opaque, uint32_t addr){    UHCIState *s = opaque;    uint32_t val;    addr &= 0x1f;    switch(addr) {    case 0x0c:        val = s->sof_timing;        break;    default:        val = 0xff;        break;    }    return val;}static void uhci_ioport_writew(void *opaque, uint32_t addr, uint32_t val){    UHCIState *s = opaque;        addr &= 0x1f;#ifdef DEBUG    printf("uhci writew port=0x%04x val=0x%04x\n", addr, val);#endif    switch(addr) {    case 0x00:        if ((val & UHCI_CMD_RS) && !(s->cmd & UHCI_CMD_RS)) {            /* start frame processing */            qemu_mod_timer(s->frame_timer, qemu_get_clock(vm_clock));            s->status &= ~UHCI_STS_HCHALTED;        } else if (!(val & UHCI_CMD_RS)) {            s->status |= UHCI_STS_HCHALTED;        }        if (val & UHCI_CMD_GRESET) {            UHCIPort *port;            USBDevice *dev;            int i;            /* send reset on the USB bus */            for(i = 0; i < NB_PORTS; i++) {                port = &s->ports[i];                dev = port->port.dev;                if (dev) {                    usb_send_msg(dev, USB_MSG_RESET);                }            }            uhci_reset(s);            return;        }        if (val & UHCI_CMD_HCRESET) {            uhci_reset(s);            return;        }        s->cmd = val;        break;    case 0x02:        s->status &= ~val;        /* XXX: the chip spec is not coherent, so we add a hidden           register to distinguish between IOC and SPD */        if (val & UHCI_STS_USBINT)            s->status2 = 0;        uhci_update_irq(s);        break;    case 0x04:        s->intr = val;        uhci_update_irq(s);        break;    case 0x06:        if (s->status & UHCI_STS_HCHALTED)            s->frnum = val & 0x7ff;        break;    case 0x10 ... 0x1f:        {            UHCIPort *port;            USBDevice *dev;            int n;            n = (addr >> 1) & 7;            if (n >= NB_PORTS)                return;            port = &s->ports[n];            dev = port->port.dev;            if (dev) {                /* port reset */                if ( (val & UHCI_PORT_RESET) &&                      !(port->ctrl & UHCI_PORT_RESET) ) {                    usb_send_msg(dev, USB_MSG_RESET);                }            }            port->ctrl = (port->ctrl & 0x01fb) | (val & ~0x01fb);            /* some bits are reset when a '1' is written to them */            port->ctrl &= ~(val & 0x000a);        }        break;    }}static uint32_t uhci_ioport_readw(void *opaque, uint32_t addr){    UHCIState *s = opaque;    uint32_t val;    addr &= 0x1f;    switch(addr) {    case 0x00:        val = s->cmd;        break;    case 0x02:        val = s->status;        break;    case 0x04:        val = s->intr;        break;    case 0x06:        val = s->frnum;        break;    case 0x10 ... 0x1f:        {            UHCIPort *port;            int n;            n = (addr >> 1) & 7;            if (n >= NB_PORTS)                 goto read_default;            port = &s->ports[n];            val = port->ctrl;        }        break;    default:    read_default:        val = 0xff7f; /* disabled port */        break;    }#ifdef DEBUG    printf("uhci readw port=0x%04x val=0x%04x\n", addr, val);#endif    return val;}static void uhci_ioport_writel(void *opaque, uint32_t addr, uint32_t val){    UHCIState *s = opaque;    addr &= 0x1f;#ifdef DEBUG    printf("uhci writel port=0x%04x val=0x%08x\n", addr, val);#endif    switch(addr) {    case 0x08:        s->fl_base_addr = val & ~0xfff;        break;    }}static uint32_t uhci_ioport_readl(void *opaque, uint32_t addr){    UHCIState *s = opaque;    uint32_t val;    addr &= 0x1f;    switch(addr) {    case 0x08:        val = s->fl_base_addr;        break;    default:        val = 0xffffffff;        break;    }    return val;}static void uhci_attach(USBPort *port1, USBDevice *dev){    UHCIState *s = port1->opaque;    UHCIPort *port = &s->ports[port1->index];    if (dev) {        if (port->port.dev) {            usb_attach(port1, NULL);        }        /* set connect status */        port->ctrl |= UHCI_PORT_CCS | UHCI_PORT_CSC;        /* update speed */        if (dev->speed == USB_SPEED_LOW)            port->ctrl |= UHCI_PORT_LSDA;        else            port->ctrl &= ~UHCI_PORT_LSDA;        port->port.dev = dev;        /* send the attach message */        usb_send_msg(dev, USB_MSG_ATTACH);    } else {        /* set connect status */        if (port->ctrl & UHCI_PORT_CCS) {            port->ctrl &= ~UHCI_PORT_CCS;            port->ctrl |= UHCI_PORT_CSC;        }        /* disable port */        if (port->ctrl & UHCI_PORT_EN) {            port->ctrl &= ~UHCI_PORT_EN;            port->ctrl |= UHCI_PORT_ENC;        }        dev = port->port.dev;        if (dev) {            /* send the detach message */            usb_send_msg(dev, USB_MSG_DETACH);        }        port->port.dev = NULL;    }}static int uhci_broadcast_packet(UHCIState *s, USBPacket *p){    UHCIPort *port;    USBDevice *dev;    int i, ret;#ifdef DEBUG_PACKET    {        const char *pidstr;        switch(p->pid) {        case USB_TOKEN_SETUP: pidstr = "SETUP"; break;        case USB_TOKEN_IN: pidstr = "IN"; break;        case USB_TOKEN_OUT: pidstr = "OUT"; break;        default: pidstr = "?"; break;        }        printf("frame %d: pid=%s addr=0x%02x ep=%d len=%d\n",               s->frnum, pidstr, p->devaddr, p->devep, p->len);        if (p->pid != USB_TOKEN_IN) {            printf("     data_out=");            for(i = 0; i < p->len; i++) {                printf(" %02x", p->data[i]);            }            printf("\n");        }    }#endif    for(i = 0; i < NB_PORTS; i++) {        port = &s->ports[i];        dev = port->port.dev;        if (dev && (port->ctrl & UHCI_PORT_EN)) {            ret = dev->handle_packet(dev, p);            if (ret != USB_RET_NODEV) {#ifdef DEBUG_PACKET                if (ret == USB_RET_ASYNC) {                    printf("usb-uhci: Async packet\n");                } else {                    printf("     ret=%d ", ret);                    if (p->pid == USB_TOKEN_IN && ret > 0) {                        printf("data_in=");                        for(i = 0; i < ret; i++) {                            printf(" %02x", p->data[i]);                        }                    }                    printf("\n");                }#endif                return ret;            }        }    }    return USB_RET_NODEV;}static void uhci_async_complete_packet(USBPacket * packet, void *opaque);/* return -1 if fatal error (frame must be stopped)          0 if TD successful          1 if TD unsuccessful or inactive*/static int uhci_handle_td(UHCIState *s, UHCI_TD *td, int *int_mask){    uint8_t pid;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
2020国产精品| 亚洲欧美激情一区二区| 99久久伊人精品| 蜜臀av一级做a爰片久久| 中文字幕在线观看一区| 精品对白一区国产伦| 在线精品视频免费观看| 国产福利视频一区二区三区| 三级久久三级久久| 亚洲乱码国产乱码精品精的特点| 久久久久9999亚洲精品| 日韩一区二区三免费高清| 在线日韩一区二区| 成人禁用看黄a在线| 国产自产v一区二区三区c| 日本伊人精品一区二区三区观看方式 | 蜜桃一区二区三区在线观看| 亚洲欧美另类图片小说| 国产精品视频第一区| 亚洲精品在线三区| 日韩一区二区三区免费观看| 欧美日韩一二三| 欧美日韩一级片网站| 一本久久综合亚洲鲁鲁五月天| 国产不卡免费视频| 国产电影一区二区三区| 国产一区二区三区黄视频| 另类欧美日韩国产在线| 奇米777欧美一区二区| 午夜日韩在线电影| 亚洲第一电影网| 午夜精品久久久久久久99水蜜桃| 一区二区高清免费观看影视大全| 日韩理论片网站| 亚洲天堂免费看| 亚洲精品国产高清久久伦理二区| 日韩毛片精品高清免费| 亚洲男人天堂av| 亚洲综合色噜噜狠狠| 亚洲成av人影院在线观看网| 午夜欧美视频在线观看 | 日韩国产欧美在线播放| 亚洲第一福利一区| 日韩精品一级中文字幕精品视频免费观看| 亚洲国产人成综合网站| 午夜精品久久久久久久蜜桃app| 亚洲成人在线观看视频| 日本vs亚洲vs韩国一区三区二区 | 99久久伊人精品| 色综合天天综合狠狠| 日本二三区不卡| 欧美视频一区二区| 欧美一区二区三区在线| 欧美成人一区二区三区在线观看 | 欧美一区二区三区电影| 欧美大片一区二区| 久久久99精品免费观看不卡| 国产女同互慰高潮91漫画| 中文一区在线播放| 1区2区3区精品视频| 亚洲一区在线电影| 男男gaygay亚洲| 国产成a人无v码亚洲福利| 99久久国产综合精品女不卡| 欧美日韩国产一区| 久久久三级国产网站| 亚洲欧美在线观看| 天天爽夜夜爽夜夜爽精品视频| 美女尤物国产一区| 成人免费视频播放| 欧美日韩国产免费一区二区| 久久众筹精品私拍模特| 亚洲女同女同女同女同女同69| 午夜精品一区二区三区电影天堂| 精品一区二区在线视频| 91免费看视频| 日韩精品中文字幕一区| 中文字幕一区二区三区视频| 视频一区国产视频| www.亚洲人| 91精品国产一区二区三区蜜臀| 国产欧美一区二区精品仙草咪| 一级做a爱片久久| 国产精品18久久久| 欧美日韩高清一区二区不卡| 国产清纯白嫩初高生在线观看91 | 奇米精品一区二区三区在线观看 | 久久精品视频免费观看| 亚洲最大色网站| 国产精品一区二区三区网站| 欧美三级三级三级| 国产欧美日韩一区二区三区在线观看| 亚洲自拍偷拍网站| 高清不卡在线观看av| 91精品国产高清一区二区三区蜜臀| 国产精品美日韩| 精品一区二区三区在线播放视频| 在线免费一区三区| 中文字幕的久久| 麻豆国产一区二区| 在线精品视频一区二区三四| 国产偷国产偷亚洲高清人白洁 | 久久久精品国产99久久精品芒果 | 精品亚洲国产成人av制服丝袜| 色婷婷亚洲综合| 国产人伦精品一区二区| 蜜臀a∨国产成人精品| 在线观看日韩高清av| 国产精品久久久久国产精品日日| 免费成人av在线| 欧美精品亚洲一区二区在线播放| 日韩久久一区二区| 成人永久aaa| 国产欧美久久久精品影院| 美女诱惑一区二区| 制服丝袜亚洲色图| 午夜精品一区二区三区三上悠亚| 色香蕉成人二区免费| 中文字幕亚洲综合久久菠萝蜜| 国产乱妇无码大片在线观看| 日韩精品一区二区三区中文精品| 三级亚洲高清视频| 欧美日韩二区三区| 亚洲午夜羞羞片| 欧美亚洲综合久久| 亚洲一区二区3| 欧美日韩一区中文字幕| 亚洲一区二区三区四区在线免费观看 | 婷婷综合久久一区二区三区| 在线免费观看日韩欧美| 一区二区在线观看不卡| 91日韩一区二区三区| 亚洲人被黑人高潮完整版| caoporn国产精品| 国产精品久久99| 99久久综合色| 亚洲免费视频中文字幕| 色丁香久综合在线久综合在线观看| 国产精品欧美综合在线| av在线播放不卡| 亚洲精品视频一区二区| 在线免费观看日本欧美| 午夜精品国产更新| 欧美一二三区精品| 久久99精品久久久久久动态图 | 在线观看免费视频综合| 玉米视频成人免费看| 欧美色综合久久| 丝袜亚洲精品中文字幕一区| 在线综合视频播放| 精品夜夜嗨av一区二区三区| 日本一区二区三级电影在线观看| 成人免费av资源| 日韩毛片精品高清免费| 欧美图区在线视频| 男人的j进女人的j一区| 久久久久88色偷偷免费| 不卡影院免费观看| 亚洲五码中文字幕| 日韩欧美国产一二三区| 国产91清纯白嫩初高中在线观看| 成人欧美一区二区三区黑人麻豆 | 国产视频一区二区在线观看| 不卡一卡二卡三乱码免费网站| 亚洲精品亚洲人成人网在线播放| 欧美三级视频在线| 国产一区二区三区综合| 亚洲人成小说网站色在线| 欧美精品日韩一本| 国产91精品精华液一区二区三区| 亚洲精品日产精品乱码不卡| 91精品免费在线| 成人免费不卡视频| 午夜精品久久久久久久| 国产免费观看久久| 欧美精品国产精品| 成人午夜视频在线观看| 丝袜美腿亚洲一区| 国产精品久久久久久久久图文区| 欧美日韩视频在线第一区| 精品亚洲成a人在线观看| 亚洲精品五月天| 久久蜜桃av一区精品变态类天堂 | 麻豆国产精品视频| 国产精品欧美久久久久无广告| 欧美日韩和欧美的一区二区| 国产精品一区免费在线观看| 亚洲小说欧美激情另类| 国产亚洲一区二区三区四区| 精品视频一区二区不卡| 丁香婷婷综合五月| 毛片一区二区三区| 亚洲国产日韩a在线播放性色| 国产欧美va欧美不卡在线| 欧美一区二区三区四区五区| 91浏览器打开| 成人高清视频在线| 国产原创一区二区三区| 视频一区国产视频| 亚洲精品视频在线看|