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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? usb-uhci.c.svn-base

?? 我們自己開(kāi)發(fā)的一個(gè)OSEK操作系統(tǒng)!不知道可不可以?
?? SVN-BASE
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/* * 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 "hw.h"#include "usb.h"#include "pci.h"#include "qemu-timer.h"//#define DEBUG//#define DEBUG_PACKET//#define DEBUG_ISOCH#define UHCI_CMD_FGR      (1 << 4)#define UHCI_CMD_EGSM     (1 << 3)#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_BABBLE  (1 << 20)#define TD_CTRL_NAK     (1 << 19)#define TD_CTRL_TIMEOUT (1 << 18)#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;    uint32_t async_frame_addr;    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;    }    qemu_set_irq(s->dev.irq[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);    }}#if 0static void uhci_save(QEMUFile *f, void *opaque){    UHCIState *s = opaque;    uint8_t num_ports = NB_PORTS;    int i;    pci_device_save(&s->dev, f);    qemu_put_8s(f, &num_ports);    for (i = 0; i < num_ports; ++i)        qemu_put_be16s(f, &s->ports[i].ctrl);    qemu_put_be16s(f, &s->cmd);    qemu_put_be16s(f, &s->status);    qemu_put_be16s(f, &s->intr);    qemu_put_be16s(f, &s->frnum);    qemu_put_be32s(f, &s->fl_base_addr);    qemu_put_8s(f, &s->sof_timing);    qemu_put_8s(f, &s->status2);    qemu_put_timer(f, s->frame_timer);}static int uhci_load(QEMUFile *f, void *opaque, int version_id){    UHCIState *s = opaque;    uint8_t num_ports;    int i, ret;    if (version_id > 1)        return -EINVAL;    ret = pci_device_load(&s->dev, f);    if (ret < 0)        return ret;    qemu_get_8s(f, &num_ports);    if (num_ports != NB_PORTS)        return -EINVAL;    for (i = 0; i < num_ports; ++i)        qemu_get_be16s(f, &s->ports[i].ctrl);    qemu_get_be16s(f, &s->cmd);    qemu_get_be16s(f, &s->status);    qemu_get_be16s(f, &s->intr);    qemu_get_be16s(f, &s->frnum);    qemu_get_be32s(f, &s->fl_base_addr);    qemu_get_8s(f, &s->sof_timing);    qemu_get_8s(f, &s->status2);    qemu_get_timer(f, s->frame_timer);    return 0;}#endifstatic 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;}/* signal resume if controller suspended */static void uhci_resume (void *opaque){    UHCIState *s = (UHCIState *)opaque;    if (!s)        return;    if (s->cmd & UHCI_CMD_EGSM) {        s->cmd |= UHCI_CMD_FGR;        s->status |= UHCI_STS_RD;        uhci_update_irq(s);    }}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;        uhci_resume(s);        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;        }        uhci_resume(s);        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

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品tushy高清| 亚洲综合一区二区三区| 精品国产亚洲在线| 在线不卡免费av| 日韩视频免费直播| 91精品国产乱码| 日韩欧美国产三级电影视频| 精品国产污网站| 精品成人一区二区三区| 国产午夜精品美女毛片视频| 国产免费成人在线视频| 国产三级三级三级精品8ⅰ区| 亚洲自拍都市欧美小说| 色噜噜久久综合| 国产一区二区三区| 国产一区二区在线看| 国产一区二区中文字幕| 成人在线视频首页| 色综合久久88色综合天天免费| 91一区在线观看| 欧美日韩高清一区二区| 欧美一级电影网站| 国产午夜精品久久久久久免费视 | 捆绑变态av一区二区三区| 麻豆国产精品视频| 成人一区二区三区中文字幕| 97se亚洲国产综合自在线不卡| 欧美三级日韩三级国产三级| 日韩免费性生活视频播放| 欧美国产日产图区| 亚洲资源中文字幕| 蜜桃视频在线观看一区二区| 国产乱国产乱300精品| 99久久综合精品| 欧美日韩国产一区二区三区地区| 日韩视频在线观看一区二区| 国产精品每日更新| 亚洲成人一区在线| 国产精品亚洲第一区在线暖暖韩国| av成人免费在线观看| 欧美日韩国产123区| 国产亚洲精品中文字幕| 亚洲综合色丁香婷婷六月图片| 蜜臀久久久久久久| 成年人午夜久久久| 在线电影国产精品| 国产精品久久久久久久久图文区 | 精品欧美乱码久久久久久| 欧美激情一区二区三区蜜桃视频| 亚洲国产精品久久久久婷婷884| 九一久久久久久| 一本在线高清不卡dvd| 欧美一区二区三区男人的天堂| 国产精品天美传媒沈樵| 强制捆绑调教一区二区| 97久久精品人人爽人人爽蜜臀| 欧美一区欧美二区| 亚洲欧美日韩久久| 国内精品在线播放| 欧美老肥妇做.爰bbww视频| 中文字幕一区二区在线观看| 蜜臀av一区二区三区| 在线免费观看日韩欧美| 国产夜色精品一区二区av| 香蕉乱码成人久久天堂爱免费| 不卡的av网站| 久久人人97超碰com| 同产精品九九九| 色综合久久久久综合99| 国产欧美久久久精品影院| 麻豆国产91在线播放| 欧美日韩aaaaa| 亚洲欧美日韩国产另类专区| 国产一区二区久久| 日韩亚洲欧美在线| 亚洲国产欧美日韩另类综合| jizzjizzjizz欧美| 国产欧美日韩不卡免费| 精品午夜久久福利影院| 欧美美女黄视频| 一个色妞综合视频在线观看| a4yy欧美一区二区三区| 欧美激情一区三区| 国产一区二区三区av电影| 91精品国产手机| 丝瓜av网站精品一区二区| 欧亚洲嫩模精品一区三区| 一区在线观看免费| 波多野结衣中文字幕一区二区三区| 精品乱人伦小说| 久久9热精品视频| 日韩小视频在线观看专区| 香蕉乱码成人久久天堂爱免费| 91久久精品国产91性色tv| 亚洲免费在线看| 99久久精品国产麻豆演员表| 亚洲欧洲av另类| 成人午夜电影小说| 中文字幕在线不卡视频| 成人激情免费网站| 国产精品色一区二区三区| 成人ar影院免费观看视频| 国产欧美视频一区二区| 国产传媒欧美日韩成人| 国产日韩一级二级三级| 国产福利一区二区| 国产精品丝袜91| 不卡区在线中文字幕| 亚洲日本一区二区| 91久久久免费一区二区| 亚洲成人免费影院| 欧美一级黄色录像| 激情六月婷婷综合| 中文字幕乱码一区二区免费| 99国内精品久久| 亚洲综合一区二区三区| 69久久99精品久久久久婷婷| 免费成人你懂的| 欧美精品一区二区在线播放| 国产精品亚洲成人| 亚洲天堂免费在线观看视频| 欧美亚日韩国产aⅴ精品中极品| 午夜日韩在线电影| 精品国产伦一区二区三区观看方式| 国产美女娇喘av呻吟久久| 中文字幕av一区 二区| 在线免费精品视频| 麻豆免费精品视频| 国产欧美视频一区二区| 在线视频欧美精品| 久久精品国产精品亚洲综合| 国产精品色眯眯| 欧美日韩一区 二区 三区 久久精品| 日韩影院精彩在线| 久久久精品国产99久久精品芒果| 99精品欧美一区| 日本午夜精品一区二区三区电影| 精品盗摄一区二区三区| 99国产欧美久久久精品| 日本一不卡视频| 国产精品女人毛片| 欧美区在线观看| 懂色av中文一区二区三区| 亚洲aaa精品| 国产精品视频九色porn| 欧美日韩国产片| 国产成人免费视频精品含羞草妖精| 亚洲精品欧美激情| 久久在线免费观看| 欧美综合色免费| 国产美女精品人人做人人爽| 亚洲综合成人在线| 久久精品一区二区| 欧美精品日日鲁夜夜添| 成人一二三区视频| 日韩经典中文字幕一区| 欧美激情一区在线| 欧美一级欧美三级| 色综合色狠狠综合色| 韩国女主播成人在线| 亚洲精品成人精品456| 久久综合九色综合97婷婷女人| 欧美午夜精品久久久久久孕妇| 高清国产一区二区| 日本91福利区| 亚洲一区二区成人在线观看| 国产亚洲欧美日韩俺去了| 欧美一区三区四区| 欧洲国内综合视频| 成人精品一区二区三区四区| 美女尤物国产一区| 亚洲成人免费在线| 亚洲免费在线视频| 国产精品久久久久久户外露出 | av一区二区久久| 极品尤物av久久免费看| 偷拍日韩校园综合在线| 亚洲精品国产精华液| 日本一区二区三区久久久久久久久不 | 精彩视频一区二区三区| 天堂蜜桃91精品| 亚洲美女在线国产| 国产精品天干天干在线综合| xnxx国产精品| 日韩精品最新网址| 欧美日韩成人激情| 欧美三级电影网| 一本一道波多野结衣一区二区 | 国产欧美精品日韩区二区麻豆天美| 欧美精品乱码久久久久久| 色综合天天做天天爱| 盗摄精品av一区二区三区| 久草热8精品视频在线观看| 日韩制服丝袜av| 婷婷综合五月天| 午夜精品福利在线| 亚洲高清免费观看高清完整版在线观看| 成人欧美一区二区三区黑人麻豆 | 自拍偷拍欧美激情| 国产精品国模大尺度视频|