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

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

?? serial.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
字號:
/* * QEMU 16450 UART emulation * * Copyright (c) 2003-2004 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 "qemu-char.h"#include "isa.h"#include "pc.h"//#define DEBUG_SERIAL#define UART_LCR_DLAB	0x80	/* Divisor latch access bit */#define UART_IER_MSI	0x08	/* Enable Modem status interrupt */#define UART_IER_RLSI	0x04	/* Enable receiver line status interrupt */#define UART_IER_THRI	0x02	/* Enable Transmitter holding register int. */#define UART_IER_RDI	0x01	/* Enable receiver data interrupt */#define UART_IIR_NO_INT	0x01	/* No interrupts pending */#define UART_IIR_ID	0x06	/* Mask for the interrupt ID */#define UART_IIR_MSI	0x00	/* Modem status interrupt */#define UART_IIR_THRI	0x02	/* Transmitter holding register empty */#define UART_IIR_RDI	0x04	/* Receiver data interrupt */#define UART_IIR_RLSI	0x06	/* Receiver line status interrupt *//* * These are the definitions for the Modem Control Register */#define UART_MCR_LOOP	0x10	/* Enable loopback test mode */#define UART_MCR_OUT2	0x08	/* Out2 complement */#define UART_MCR_OUT1	0x04	/* Out1 complement */#define UART_MCR_RTS	0x02	/* RTS complement */#define UART_MCR_DTR	0x01	/* DTR complement *//* * These are the definitions for the Modem Status Register */#define UART_MSR_DCD	0x80	/* Data Carrier Detect */#define UART_MSR_RI	0x40	/* Ring Indicator */#define UART_MSR_DSR	0x20	/* Data Set Ready */#define UART_MSR_CTS	0x10	/* Clear to Send */#define UART_MSR_DDCD	0x08	/* Delta DCD */#define UART_MSR_TERI	0x04	/* Trailing edge ring indicator */#define UART_MSR_DDSR	0x02	/* Delta DSR */#define UART_MSR_DCTS	0x01	/* Delta CTS */#define UART_MSR_ANY_DELTA 0x0F	/* Any of the delta bits! */#define UART_LSR_TEMT	0x40	/* Transmitter empty */#define UART_LSR_THRE	0x20	/* Transmit-hold-register empty */#define UART_LSR_BI	0x10	/* Break interrupt indicator */#define UART_LSR_FE	0x08	/* Frame error indicator */#define UART_LSR_PE	0x04	/* Parity error indicator */#define UART_LSR_OE	0x02	/* Overrun error indicator */#define UART_LSR_DR	0x01	/* Receiver data ready */struct SerialState {    uint16_t divider;    uint8_t rbr; /* receive register */    uint8_t ier;    uint8_t iir; /* read only */    uint8_t lcr;    uint8_t mcr;    uint8_t lsr; /* read only */    uint8_t msr; /* read only */    uint8_t scr;    /* NOTE: this hidden state is necessary for tx irq generation as       it can be reset while reading iir */    int thr_ipending;    qemu_irq irq;    CharDriverState *chr;    int last_break_enable;    target_phys_addr_t base;    int it_shift;};static void serial_update_irq(SerialState *s){    if ((s->lsr & UART_LSR_DR) && (s->ier & UART_IER_RDI)) {        s->iir = UART_IIR_RDI;    } else if (s->thr_ipending && (s->ier & UART_IER_THRI)) {        s->iir = UART_IIR_THRI;    } else {        s->iir = UART_IIR_NO_INT;    }    if (s->iir != UART_IIR_NO_INT) {        qemu_irq_raise(s->irq);    } else {        qemu_irq_lower(s->irq);    }}static void serial_update_parameters(SerialState *s){    int speed, parity, data_bits, stop_bits;    QEMUSerialSetParams ssp;    if (s->lcr & 0x08) {        if (s->lcr & 0x10)            parity = 'E';        else            parity = 'O';    } else {            parity = 'N';    }    if (s->lcr & 0x04)        stop_bits = 2;    else        stop_bits = 1;    data_bits = (s->lcr & 0x03) + 5;    if (s->divider == 0)        return;    speed = 115200 / s->divider;    ssp.speed = speed;    ssp.parity = parity;    ssp.data_bits = data_bits;    ssp.stop_bits = stop_bits;    qemu_chr_ioctl(s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp);#if 0    printf("speed=%d parity=%c data=%d stop=%d\n",           speed, parity, data_bits, stop_bits);#endif}static void serial_ioport_write(void *opaque, uint32_t addr, uint32_t val){    SerialState *s = opaque;    unsigned char ch;    addr &= 7;#ifdef DEBUG_SERIAL    printf("serial: write addr=0x%02x val=0x%02x\n", addr, val);#endif    switch(addr) {    default:    case 0:        if (s->lcr & UART_LCR_DLAB) {            s->divider = (s->divider & 0xff00) | val;            serial_update_parameters(s);        } else {            s->thr_ipending = 0;            s->lsr &= ~UART_LSR_THRE;            serial_update_irq(s);            ch = val;            qemu_chr_write(s->chr, &ch, 1);            s->thr_ipending = 1;            s->lsr |= UART_LSR_THRE;            s->lsr |= UART_LSR_TEMT;            serial_update_irq(s);        }        break;    case 1:        if (s->lcr & UART_LCR_DLAB) {            s->divider = (s->divider & 0x00ff) | (val << 8);            serial_update_parameters(s);        } else {            s->ier = val & 0x0f;            if (s->lsr & UART_LSR_THRE) {                s->thr_ipending = 1;            }            serial_update_irq(s);        }        break;    case 2:        break;    case 3:        {            int break_enable;            s->lcr = val;            serial_update_parameters(s);            break_enable = (val >> 6) & 1;            if (break_enable != s->last_break_enable) {                s->last_break_enable = break_enable;                qemu_chr_ioctl(s->chr, CHR_IOCTL_SERIAL_SET_BREAK,                               &break_enable);            }        }        break;    case 4:        s->mcr = val & 0x1f;        break;    case 5:        break;    case 6:        break;    case 7:        s->scr = val;        break;    }}static uint32_t serial_ioport_read(void *opaque, uint32_t addr){    SerialState *s = opaque;    uint32_t ret;    addr &= 7;    switch(addr) {    default:    case 0:        if (s->lcr & UART_LCR_DLAB) {            ret = s->divider & 0xff;        } else {            ret = s->rbr;            s->lsr &= ~(UART_LSR_DR | UART_LSR_BI);            serial_update_irq(s);            qemu_chr_accept_input(s->chr);        }        break;    case 1:        if (s->lcr & UART_LCR_DLAB) {            ret = (s->divider >> 8) & 0xff;        } else {            ret = s->ier;        }        break;    case 2:        ret = s->iir;        /* reset THR pending bit */        if ((ret & 0x7) == UART_IIR_THRI)            s->thr_ipending = 0;        serial_update_irq(s);        break;    case 3:        ret = s->lcr;        break;    case 4:        ret = s->mcr;        break;    case 5:        ret = s->lsr;        break;    case 6:        if (s->mcr & UART_MCR_LOOP) {            /* in loopback, the modem output pins are connected to the               inputs */            ret = (s->mcr & 0x0c) << 4;            ret |= (s->mcr & 0x02) << 3;            ret |= (s->mcr & 0x01) << 5;        } else {            ret = s->msr;        }        break;    case 7:        ret = s->scr;        break;    }#ifdef DEBUG_SERIAL    printf("serial: read addr=0x%02x val=0x%02x\n", addr, ret);#endif    return ret;}static int serial_can_receive(SerialState *s){    return !(s->lsr & UART_LSR_DR);}static void serial_receive_byte(SerialState *s, int ch){    s->rbr = ch;    s->lsr |= UART_LSR_DR;    serial_update_irq(s);}static void serial_receive_break(SerialState *s){    s->rbr = 0;    s->lsr |= UART_LSR_BI | UART_LSR_DR;    serial_update_irq(s);}static int serial_can_receive1(void *opaque){    SerialState *s = opaque;    return serial_can_receive(s);}static void serial_receive1(void *opaque, const uint8_t *buf, int size){    SerialState *s = opaque;    serial_receive_byte(s, buf[0]);}static void serial_event(void *opaque, int event){    SerialState *s = opaque;    if (event == CHR_EVENT_BREAK)        serial_receive_break(s);}static void serial_save(QEMUFile *f, void *opaque){    SerialState *s = opaque;    qemu_put_be16s(f,&s->divider);    qemu_put_8s(f,&s->rbr);    qemu_put_8s(f,&s->ier);    qemu_put_8s(f,&s->iir);    qemu_put_8s(f,&s->lcr);    qemu_put_8s(f,&s->mcr);    qemu_put_8s(f,&s->lsr);    qemu_put_8s(f,&s->msr);    qemu_put_8s(f,&s->scr);}static int serial_load(QEMUFile *f, void *opaque, int version_id){    SerialState *s = opaque;    if(version_id > 2)        return -EINVAL;    if (version_id >= 2)        qemu_get_be16s(f, &s->divider);    else        s->divider = qemu_get_byte(f);    qemu_get_8s(f,&s->rbr);    qemu_get_8s(f,&s->ier);    qemu_get_8s(f,&s->iir);    qemu_get_8s(f,&s->lcr);    qemu_get_8s(f,&s->mcr);    qemu_get_8s(f,&s->lsr);    qemu_get_8s(f,&s->msr);    qemu_get_8s(f,&s->scr);    return 0;}/* If fd is zero, it means that the serial device uses the console */SerialState *serial_init(int base, qemu_irq irq, CharDriverState *chr){    SerialState *s;    s = qemu_mallocz(sizeof(SerialState));    if (!s)        return NULL;    s->irq = irq;    s->lsr = UART_LSR_TEMT | UART_LSR_THRE;    s->iir = UART_IIR_NO_INT;    s->msr = UART_MSR_DCD | UART_MSR_DSR | UART_MSR_CTS;    register_savevm("serial", base, 2, serial_save, serial_load, s);    register_ioport_write(base, 8, 1, serial_ioport_write, s);    register_ioport_read(base, 8, 1, serial_ioport_read, s);    s->chr = chr;    qemu_chr_add_handlers(chr, serial_can_receive1, serial_receive1,                          serial_event, s);    return s;}/* Memory mapped interface */uint32_t serial_mm_readb (void *opaque, target_phys_addr_t addr){    SerialState *s = opaque;    return serial_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFF;}void serial_mm_writeb (void *opaque,                       target_phys_addr_t addr, uint32_t value){    SerialState *s = opaque;    serial_ioport_write(s, (addr - s->base) >> s->it_shift, value & 0xFF);}uint32_t serial_mm_readw (void *opaque, target_phys_addr_t addr){    SerialState *s = opaque;    uint32_t val;    val = serial_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFFFF;#ifdef TARGET_WORDS_BIGENDIAN    val = bswap16(val);#endif    return val;}void serial_mm_writew (void *opaque,                       target_phys_addr_t addr, uint32_t value){    SerialState *s = opaque;#ifdef TARGET_WORDS_BIGENDIAN    value = bswap16(value);#endif    serial_ioport_write(s, (addr - s->base) >> s->it_shift, value & 0xFFFF);}uint32_t serial_mm_readl (void *opaque, target_phys_addr_t addr){    SerialState *s = opaque;    uint32_t val;    val = serial_ioport_read(s, (addr - s->base) >> s->it_shift);#ifdef TARGET_WORDS_BIGENDIAN    val = bswap32(val);#endif    return val;}void serial_mm_writel (void *opaque,                       target_phys_addr_t addr, uint32_t value){    SerialState *s = opaque;#ifdef TARGET_WORDS_BIGENDIAN    value = bswap32(value);#endif    serial_ioport_write(s, (addr - s->base) >> s->it_shift, value);}static CPUReadMemoryFunc *serial_mm_read[] = {    &serial_mm_readb,    &serial_mm_readw,    &serial_mm_readl,};static CPUWriteMemoryFunc *serial_mm_write[] = {    &serial_mm_writeb,    &serial_mm_writew,    &serial_mm_writel,};SerialState *serial_mm_init (target_phys_addr_t base, int it_shift,                             qemu_irq irq, CharDriverState *chr,                             int ioregister){    SerialState *s;    int s_io_memory;    s = qemu_mallocz(sizeof(SerialState));    if (!s)        return NULL;    s->irq = irq;    s->lsr = UART_LSR_TEMT | UART_LSR_THRE;    s->iir = UART_IIR_NO_INT;    s->msr = UART_MSR_DCD | UART_MSR_DSR | UART_MSR_CTS;    s->base = base;    s->it_shift = it_shift;    register_savevm("serial", base, 2, serial_save, serial_load, s);    if (ioregister) {        s_io_memory = cpu_register_io_memory(0, serial_mm_read,                                             serial_mm_write, s);        cpu_register_physical_memory(base, 8 << it_shift, s_io_memory);    }    s->chr = chr;    qemu_chr_add_handlers(chr, serial_can_receive1, serial_receive1,                          serial_event, s);    return s;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久亚洲精品一区二区三区| 成人在线视频一区二区| 亚洲欧洲在线观看av| 精品国产麻豆免费人成网站| 欧美精品 国产精品| 欧美性猛交xxxx乱大交退制版| www.爱久久.com| 9l国产精品久久久久麻豆| 不卡视频一二三四| 91国内精品野花午夜精品| 在线观看日韩精品| 精品污污网站免费看| 欧美精品久久一区| 日韩精品一区二区三区四区视频| 9191成人精品久久| 日韩精品中文字幕一区二区三区| 日韩欧美中文一区| 国产日韩综合av| 中文字幕一区二区三区精华液| 国产精品青草久久| 一区二区三区四区精品在线视频 | 亚洲欧美视频一区| 青青草国产成人99久久| 精品国产免费一区二区三区香蕉| 精品美女一区二区三区| 日本一区二区三区电影| 中文字幕在线一区二区三区| 亚洲乱码日产精品bd| 亚洲成人久久影院| 激情小说欧美图片| 91亚洲男人天堂| 欧美精品三级在线观看| 国产亚洲欧美日韩在线一区| 亚洲欧美在线视频| 天天综合网天天综合色| 国产精品一级片| 欧美亚洲国产一区二区三区| 精品少妇一区二区三区在线播放| 中文字幕成人av| 蜜桃视频在线观看一区| 成人avav在线| 日韩精品中文字幕一区| 亚洲免费在线视频一区 二区| 天天色天天操综合| av不卡免费电影| 欧美成人一区二区三区片免费 | 国产在线播精品第三| 91传媒视频在线播放| 精品成人一区二区三区四区| 亚洲美女免费视频| 国v精品久久久网| 欧美一级理论片| 亚洲欧美色图小说| 国产精品996| 欧美大度的电影原声| 午夜久久久久久电影| 91浏览器打开| 国产精品毛片大码女人| 精品影院一区二区久久久| 欧美日韩午夜精品| 最近日韩中文字幕| gogogo免费视频观看亚洲一| 精品国产一区二区三区av性色| 亚洲电影在线播放| 在线一区二区视频| 亚洲美女偷拍久久| 国产99久久久国产精品免费看| 日韩一区二区在线看| 婷婷开心久久网| 欧美猛男男办公室激情| 亚洲成人自拍一区| 欧美男生操女生| 亚洲成人激情av| 欧美亚洲动漫精品| 亚洲永久免费av| 欧美色综合网站| 亚洲一区日韩精品中文字幕| 91同城在线观看| 亚洲免费观看在线观看| 色综合网站在线| 亚洲女同一区二区| 色拍拍在线精品视频8848| 亚洲精品你懂的| 色88888久久久久久影院野外| 亚洲免费观看在线视频| 欧美三级在线看| 偷窥国产亚洲免费视频| 日韩一区二区在线观看| 精品亚洲国产成人av制服丝袜 | 最新欧美精品一区二区三区| 成人深夜视频在线观看| 国产精品女同一区二区三区| 99久久国产综合精品女不卡| 亚洲精品菠萝久久久久久久| 欧美视频一二三区| 秋霞影院一区二区| 久久久99精品久久| 99久久精品一区二区| 亚洲成人精品影院| 久久亚洲综合色一区二区三区| 国产精品77777| 亚洲欧美另类久久久精品2019| 欧美在线小视频| 免费成人在线网站| 欧美国产国产综合| 欧美影院一区二区| 狠狠色丁香婷综合久久| 中文字幕在线不卡国产视频| 欧美日韩1区2区| 成人黄色在线视频| 蜜桃91丨九色丨蝌蚪91桃色| 国产精品沙发午睡系列990531| 欧美日韩美少妇| 成人黄色小视频在线观看| 日韩精品五月天| 亚洲精品水蜜桃| 久久久久国产精品麻豆ai换脸 | 欧美大片日本大片免费观看| eeuss鲁一区二区三区| 日韩av在线免费观看不卡| 国产欧美1区2区3区| 欧美美女一区二区三区| 成人免费观看av| 美国av一区二区| 一区二区三区在线观看国产| 久久―日本道色综合久久| 欧美性猛片aaaaaaa做受| 国产ts人妖一区二区| 美日韩一区二区| 亚洲一区日韩精品中文字幕| 国产欧美久久久精品影院| 欧美日韩在线不卡| 91网站最新网址| 国产黄色91视频| 久久se这里有精品| 性感美女极品91精品| 亚洲天堂精品视频| 国产人伦精品一区二区| 欧美一级片在线| 色94色欧美sute亚洲线路一久| 成人av在线播放网址| 国产一区二区三区电影在线观看 | 欧美一区二区福利视频| 91福利区一区二区三区| 成人性生交大片免费看在线播放| 免费高清视频精品| 另类综合日韩欧美亚洲| 日本美女一区二区| 丝袜美腿亚洲色图| 亚洲高清一区二区三区| 亚洲一区免费视频| 亚洲一区二区三区不卡国产欧美| 亚洲日本va午夜在线电影| 国产精品成人在线观看| 国产精品天干天干在观线| 国产精品久久久久久久久图文区 | 亚洲国产日日夜夜| 亚洲女人****多毛耸耸8| 国产精品嫩草久久久久| 欧美国产丝袜视频| 国产精品乱子久久久久| 国产精品素人一区二区| 国产日韩精品视频一区| 中文字幕巨乱亚洲| 136国产福利精品导航| 欧美精品一区二区久久婷婷| 91精品国产综合久久小美女| 精品国产露脸精彩对白| 国产亚洲一本大道中文在线| 国产亚洲欧美日韩日本| 亚洲欧洲日韩一区二区三区| 一区二区三区.www| 日韩精品五月天| 国产成人99久久亚洲综合精品| av亚洲产国偷v产偷v自拍| 在线精品视频一区二区三四| 91精品国产综合久久久蜜臀图片| 91麻豆精品国产无毒不卡在线观看 | 国产在线精品免费| 成人免费不卡视频| 91美女片黄在线| 欧美高清激情brazzers| 日韩一区和二区| 国产精品美女www爽爽爽| 亚洲黄色性网站| 免费视频一区二区| 成人午夜私人影院| 欧美日韩在线直播| 久久嫩草精品久久久精品| 亚洲欧美日本韩国| 美脚の诱脚舐め脚责91| 丁香另类激情小说| 欧美久久久一区| 国产精品久久久久影院老司| 亚洲sss视频在线视频| 国产高清在线观看免费不卡| 欧美日韩亚洲丝袜制服| 国产日韩欧美精品综合| 亚洲一二三区在线观看| 蓝色福利精品导航|