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

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

?? slavio_serial.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * QEMU Sparc SLAVIO serial port emulation * * Copyright (c) 2003-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 "sun4m.h"#include "qemu-char.h"#include "console.h"/* debug serial *///#define DEBUG_SERIAL/* debug keyboard *///#define DEBUG_KBD/* debug mouse *///#define DEBUG_MOUSE/* * This is the serial port, mouse and keyboard part of chip STP2001 * (Slave I/O), also produced as NCR89C105. See * http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR89C105.txt * * The serial ports implement full AMD AM8530 or Zilog Z8530 chips, * mouse and keyboard ports don't implement all functions and they are * only asynchronous. There is no DMA. * *//* * Modifications: *  2006-Aug-10  Igor Kovalenko :   Renamed KBDQueue to SERIOQueue, implemented *                                  serial mouse queue. *                                  Implemented serial mouse protocol. */#ifdef DEBUG_SERIAL#define SER_DPRINTF(fmt, args...) \do { printf("SER: " fmt , ##args); } while (0)#else#define SER_DPRINTF(fmt, args...)#endif#ifdef DEBUG_KBD#define KBD_DPRINTF(fmt, args...) \do { printf("KBD: " fmt , ##args); } while (0)#else#define KBD_DPRINTF(fmt, args...)#endif#ifdef DEBUG_MOUSE#define MS_DPRINTF(fmt, args...) \do { printf("MSC: " fmt , ##args); } while (0)#else#define MS_DPRINTF(fmt, args...)#endiftypedef enum {    chn_a, chn_b,} chn_id_t;#define CHN_C(s) ((s)->chn == chn_b? 'b' : 'a')typedef enum {    ser, kbd, mouse,} chn_type_t;#define SERIO_QUEUE_SIZE 256typedef struct {    uint8_t data[SERIO_QUEUE_SIZE];    int rptr, wptr, count;} SERIOQueue;#define SERIAL_REGS 16typedef struct ChannelState {    qemu_irq irq;    int reg;    int rxint, txint, rxint_under_svc, txint_under_svc;    chn_id_t chn; // this channel, A (base+4) or B (base+0)    chn_type_t type;    struct ChannelState *otherchn;    uint8_t rx, tx, wregs[SERIAL_REGS], rregs[SERIAL_REGS];    SERIOQueue queue;    CharDriverState *chr;    int e0_mode, led_mode, caps_lock_mode, num_lock_mode;    int disabled;} ChannelState;struct SerialState {    struct ChannelState chn[2];};#define SERIAL_MAXADDR 7#define SERIAL_SIZE (SERIAL_MAXADDR + 1)#define SERIAL_CTRL 0#define SERIAL_DATA 1#define W_CMD     0#define CMD_PTR_MASK   0x07#define CMD_CMD_MASK   0x38#define CMD_HI         0x08#define CMD_CLR_TXINT  0x28#define CMD_CLR_IUS    0x38#define W_INTR    1#define INTR_INTALL    0x01#define INTR_TXINT     0x02#define INTR_RXMODEMSK 0x18#define INTR_RXINT1ST  0x08#define INTR_RXINTALL  0x10#define W_IVEC    2#define W_RXCTRL  3#define RXCTRL_RXEN    0x01#define W_TXCTRL1 4#define TXCTRL1_PAREN  0x01#define TXCTRL1_PAREV  0x02#define TXCTRL1_1STOP  0x04#define TXCTRL1_1HSTOP 0x08#define TXCTRL1_2STOP  0x0c#define TXCTRL1_STPMSK 0x0c#define TXCTRL1_CLK1X  0x00#define TXCTRL1_CLK16X 0x40#define TXCTRL1_CLK32X 0x80#define TXCTRL1_CLK64X 0xc0#define TXCTRL1_CLKMSK 0xc0#define W_TXCTRL2 5#define TXCTRL2_TXEN   0x08#define TXCTRL2_BITMSK 0x60#define TXCTRL2_5BITS  0x00#define TXCTRL2_7BITS  0x20#define TXCTRL2_6BITS  0x40#define TXCTRL2_8BITS  0x60#define W_SYNC1   6#define W_SYNC2   7#define W_TXBUF   8#define W_MINTR   9#define MINTR_STATUSHI 0x10#define MINTR_RST_MASK 0xc0#define MINTR_RST_B    0x40#define MINTR_RST_A    0x80#define MINTR_RST_ALL  0xc0#define W_MISC1  10#define W_CLOCK  11#define CLOCK_TRXC     0x08#define W_BRGLO  12#define W_BRGHI  13#define W_MISC2  14#define MISC2_PLLDIS   0x30#define W_EXTINT 15#define EXTINT_DCD     0x08#define EXTINT_SYNCINT 0x10#define EXTINT_CTSINT  0x20#define EXTINT_TXUNDRN 0x40#define EXTINT_BRKINT  0x80#define R_STATUS  0#define STATUS_RXAV    0x01#define STATUS_ZERO    0x02#define STATUS_TXEMPTY 0x04#define STATUS_DCD     0x08#define STATUS_SYNC    0x10#define STATUS_CTS     0x20#define STATUS_TXUNDRN 0x40#define STATUS_BRK     0x80#define R_SPEC    1#define SPEC_ALLSENT   0x01#define SPEC_BITS8     0x06#define R_IVEC    2#define IVEC_TXINTB    0x00#define IVEC_LONOINT   0x06#define IVEC_LORXINTA  0x0c#define IVEC_LORXINTB  0x04#define IVEC_LOTXINTA  0x08#define IVEC_HINOINT   0x60#define IVEC_HIRXINTA  0x30#define IVEC_HIRXINTB  0x20#define IVEC_HITXINTA  0x10#define R_INTR    3#define INTR_EXTINTB   0x01#define INTR_TXINTB    0x02#define INTR_RXINTB    0x04#define INTR_EXTINTA   0x08#define INTR_TXINTA    0x10#define INTR_RXINTA    0x20#define R_IPEN    4#define R_TXCTRL1 5#define R_TXCTRL2 6#define R_BC      7#define R_RXBUF   8#define R_RXCTRL  9#define R_MISC   10#define R_MISC1  11#define R_BRGLO  12#define R_BRGHI  13#define R_MISC1I 14#define R_EXTINT 15static void handle_kbd_command(ChannelState *s, int val);static int serial_can_receive(void *opaque);static void serial_receive_byte(ChannelState *s, int ch);static inline void set_txint(ChannelState *s);static void clear_queue(void *opaque){    ChannelState *s = opaque;    SERIOQueue *q = &s->queue;    q->rptr = q->wptr = q->count = 0;}static void put_queue(void *opaque, int b){    ChannelState *s = opaque;    SERIOQueue *q = &s->queue;    SER_DPRINTF("channel %c put: 0x%02x\n", CHN_C(s), b);    if (q->count >= SERIO_QUEUE_SIZE)        return;    q->data[q->wptr] = b;    if (++q->wptr == SERIO_QUEUE_SIZE)        q->wptr = 0;    q->count++;    serial_receive_byte(s, 0);}static uint32_t get_queue(void *opaque){    ChannelState *s = opaque;    SERIOQueue *q = &s->queue;    int val;    if (q->count == 0) {        return 0;    } else {        val = q->data[q->rptr];        if (++q->rptr == SERIO_QUEUE_SIZE)            q->rptr = 0;        q->count--;    }    SER_DPRINTF("channel %c get 0x%02x\n", CHN_C(s), val);    if (q->count > 0)        serial_receive_byte(s, 0);    return val;}static int slavio_serial_update_irq_chn(ChannelState *s){    if ((s->wregs[W_INTR] & INTR_INTALL) && // interrupts enabled        (((s->wregs[W_INTR] & INTR_TXINT) && s->txint == 1) ||         // tx ints enabled, pending         ((((s->wregs[W_INTR] & INTR_RXMODEMSK) == INTR_RXINT1ST) ||           ((s->wregs[W_INTR] & INTR_RXMODEMSK) == INTR_RXINTALL)) &&          s->rxint == 1) || // rx ints enabled, pending         ((s->wregs[W_EXTINT] & EXTINT_BRKINT) &&          (s->rregs[R_STATUS] & STATUS_BRK)))) { // break int e&p        return 1;    }    return 0;}static void slavio_serial_update_irq(ChannelState *s){    int irq;    irq = slavio_serial_update_irq_chn(s);    irq |= slavio_serial_update_irq_chn(s->otherchn);    SER_DPRINTF("IRQ = %d\n", irq);    qemu_set_irq(s->irq, irq);}static void slavio_serial_reset_chn(ChannelState *s){    int i;    s->reg = 0;    for (i = 0; i < SERIAL_SIZE; i++) {        s->rregs[i] = 0;        s->wregs[i] = 0;    }    s->wregs[W_TXCTRL1] = TXCTRL1_1STOP; // 1X divisor, 1 stop bit, no parity    s->wregs[W_MINTR] = MINTR_RST_ALL;    s->wregs[W_CLOCK] = CLOCK_TRXC; // Synch mode tx clock = TRxC    s->wregs[W_MISC2] = MISC2_PLLDIS; // PLL disabled    s->wregs[W_EXTINT] = EXTINT_DCD | EXTINT_SYNCINT | EXTINT_CTSINT |        EXTINT_TXUNDRN | EXTINT_BRKINT; // Enable most interrupts    if (s->disabled)        s->rregs[R_STATUS] = STATUS_TXEMPTY | STATUS_DCD | STATUS_SYNC |            STATUS_CTS | STATUS_TXUNDRN;    else        s->rregs[R_STATUS] = STATUS_TXEMPTY | STATUS_TXUNDRN;    s->rregs[R_SPEC] = SPEC_BITS8 | SPEC_ALLSENT;    s->rx = s->tx = 0;    s->rxint = s->txint = 0;    s->rxint_under_svc = s->txint_under_svc = 0;    s->e0_mode = s->led_mode = s->caps_lock_mode = s->num_lock_mode = 0;    clear_queue(s);}static void slavio_serial_reset(void *opaque){    SerialState *s = opaque;    slavio_serial_reset_chn(&s->chn[0]);    slavio_serial_reset_chn(&s->chn[1]);}static inline void clr_rxint(ChannelState *s){    s->rxint = 0;    s->rxint_under_svc = 0;    if (s->chn == chn_a) {        if (s->wregs[W_MINTR] & MINTR_STATUSHI)            s->otherchn->rregs[R_IVEC] = IVEC_HINOINT;        else            s->otherchn->rregs[R_IVEC] = IVEC_LONOINT;        s->rregs[R_INTR] &= ~INTR_RXINTA;    } else {        if (s->wregs[W_MINTR] & MINTR_STATUSHI)            s->rregs[R_IVEC] = IVEC_HINOINT;        else            s->rregs[R_IVEC] = IVEC_LONOINT;        s->otherchn->rregs[R_INTR] &= ~INTR_RXINTB;    }    if (s->txint)        set_txint(s);    slavio_serial_update_irq(s);}static inline void set_rxint(ChannelState *s){    s->rxint = 1;    if (!s->txint_under_svc) {        s->rxint_under_svc = 1;        if (s->chn == chn_a) {            if (s->wregs[W_MINTR] & MINTR_STATUSHI)                s->otherchn->rregs[R_IVEC] = IVEC_HIRXINTA;            else                s->otherchn->rregs[R_IVEC] = IVEC_LORXINTA;        } else {            if (s->wregs[W_MINTR] & MINTR_STATUSHI)                s->rregs[R_IVEC] = IVEC_HIRXINTB;            else                s->rregs[R_IVEC] = IVEC_LORXINTB;        }    }    if (s->chn == chn_a)        s->rregs[R_INTR] |= INTR_RXINTA;    else        s->otherchn->rregs[R_INTR] |= INTR_RXINTB;    slavio_serial_update_irq(s);}static inline void clr_txint(ChannelState *s){    s->txint = 0;    s->txint_under_svc = 0;    if (s->chn == chn_a) {        if (s->wregs[W_MINTR] & MINTR_STATUSHI)            s->otherchn->rregs[R_IVEC] = IVEC_HINOINT;        else            s->otherchn->rregs[R_IVEC] = IVEC_LONOINT;        s->rregs[R_INTR] &= ~INTR_TXINTA;    } else {        if (s->wregs[W_MINTR] & MINTR_STATUSHI)            s->rregs[R_IVEC] = IVEC_HINOINT;        else            s->rregs[R_IVEC] = IVEC_LONOINT;        s->otherchn->rregs[R_INTR] &= ~INTR_TXINTB;    }    if (s->rxint)        set_rxint(s);    slavio_serial_update_irq(s);}static inline void set_txint(ChannelState *s){    s->txint = 1;    if (!s->rxint_under_svc) {        s->txint_under_svc = 1;        if (s->chn == chn_a) {            if (s->wregs[W_MINTR] & MINTR_STATUSHI)                s->otherchn->rregs[R_IVEC] = IVEC_HITXINTA;            else                s->otherchn->rregs[R_IVEC] = IVEC_LOTXINTA;        } else {            s->rregs[R_IVEC] = IVEC_TXINTB;        }    }    if (s->chn == chn_a)        s->rregs[R_INTR] |= INTR_TXINTA;    else        s->otherchn->rregs[R_INTR] |= INTR_TXINTB;    slavio_serial_update_irq(s);}static void slavio_serial_update_parameters(ChannelState *s){    int speed, parity, data_bits, stop_bits;    QEMUSerialSetParams ssp;    if (!s->chr || s->type != ser)        return;    if (s->wregs[W_TXCTRL1] & TXCTRL1_PAREN) {        if (s->wregs[W_TXCTRL1] & TXCTRL1_PAREV)            parity = 'E';        else            parity = 'O';    } else {        parity = 'N';    }    if ((s->wregs[W_TXCTRL1] & TXCTRL1_STPMSK) == TXCTRL1_2STOP)        stop_bits = 2;    else        stop_bits = 1;    switch (s->wregs[W_TXCTRL2] & TXCTRL2_BITMSK) {    case TXCTRL2_5BITS:        data_bits = 5;        break;    case TXCTRL2_7BITS:        data_bits = 7;        break;    case TXCTRL2_6BITS:        data_bits = 6;        break;    default:    case TXCTRL2_8BITS:        data_bits = 8;        break;    }    speed = 2457600 / ((s->wregs[W_BRGLO] | (s->wregs[W_BRGHI] << 8)) + 2);    switch (s->wregs[W_TXCTRL1] & TXCTRL1_CLKMSK) {    case TXCTRL1_CLK1X:        break;    case TXCTRL1_CLK16X:        speed /= 16;        break;    case TXCTRL1_CLK32X:        speed /= 32;        break;    default:    case TXCTRL1_CLK64X:        speed /= 64;        break;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本高清成人免费播放| 精品久久人人做人人爱| 中文字幕一区不卡| 成人黄色软件下载| 亚洲视频一二三| 99久久国产免费看| 亚洲人成伊人成综合网小说| 91日韩在线专区| 依依成人精品视频| 51久久夜色精品国产麻豆| 日韩精品高清不卡| 精品嫩草影院久久| 国产精品亚洲а∨天堂免在线| 中文字幕第一页久久| 一本一道波多野结衣一区二区| 亚洲激情图片qvod| 777午夜精品视频在线播放| 午夜电影网亚洲视频| 日韩欧美黄色影院| 成人小视频在线| 色婷婷av一区| 成人免费高清在线观看| 国产精品国产三级国产aⅴ入口| 99视频国产精品| 亚洲一卡二卡三卡四卡五卡| 欧美一级片在线| 国产成人免费视频一区| 一区二区三区国产| 日韩精品一区二区三区swag| 99在线视频精品| 三级成人在线视频| 国产欧美一区二区精品性色 | 成人av资源下载| 亚洲国产精品久久艾草纯爱| 久久久久久久久久久99999| 色悠久久久久综合欧美99| 蜜臀久久久久久久| 亚洲欧洲美洲综合色网| 欧美一二三在线| 色八戒一区二区三区| 国产在线精品免费av| 国内精品在线播放| 国产美女久久久久| 一区二区国产视频| 久久亚洲二区三区| 欧美日韩国产首页| av日韩在线网站| 久久99精品久久久久久动态图 | 中文字幕在线一区二区三区| 91精品免费在线| 91麻豆免费在线观看| 国产在线视视频有精品| 日韩精品一级二级| 亚洲色图第一区| 国产亚洲人成网站| 国产精品国产三级国产普通话99| 91精品国产一区二区三区| 91在线播放网址| 国产精品1024| 久久精品国产亚洲aⅴ| 亚洲国产视频a| 亚洲天堂a在线| 中文字幕av资源一区| 亚洲靠逼com| 国产精品午夜在线| 精品国产网站在线观看| 欧美一区二区在线免费观看| 在线观看三级视频欧美| 色综合久久六月婷婷中文字幕| 国产成人av一区二区三区在线| 久久精品国产精品亚洲综合| 日韩成人精品在线| 午夜国产不卡在线观看视频| 国产乱人伦偷精品视频免下载| 欧美日韩国产影片| 99r精品视频| 99热精品国产| 成人激情视频网站| 粉嫩av一区二区三区在线播放 | 91一区二区在线| 成人高清伦理免费影院在线观看| 国产成+人+日韩+欧美+亚洲| 国产麻豆精品久久一二三| 国产真实乱偷精品视频免| 国产一区二区影院| 粗大黑人巨茎大战欧美成人| 国产白丝精品91爽爽久久| 成人黄页在线观看| 91色综合久久久久婷婷| 色一情一乱一乱一91av| 在线观看网站黄不卡| 欧美日韩精品免费观看视频| 91精品中文字幕一区二区三区| 日韩一区二区三区视频| 欧美大片日本大片免费观看| 久久综合av免费| 中文字幕第一区| 久久久国产午夜精品| 国产精品免费看片| 亚洲男女一区二区三区| 亚洲国产精品视频| 日韩高清在线电影| 国内精品久久久久影院色| 成人精品gif动图一区| 95精品视频在线| 91精品国产一区二区| 精品国产在天天线2019| 亚洲欧洲日韩av| 国产不卡在线视频| 色综合久久九月婷婷色综合| 欧美绝品在线观看成人午夜影视| 日韩一级二级三级| 国产精品视频免费看| 亚洲一区二区成人在线观看| 精品在线播放免费| 91美女片黄在线观看| 欧美一级午夜免费电影| 国产精品日日摸夜夜摸av| 午夜欧美电影在线观看| 成人在线一区二区三区| 欧美日韩国产综合视频在线观看| 欧美sm美女调教| 18成人在线视频| 午夜电影一区二区| 国内精品嫩模私拍在线| 在线一区二区视频| 日韩午夜中文字幕| 国产精品日日摸夜夜摸av| 久久亚洲综合色| 亚洲成人在线免费| 国产久卡久卡久卡久卡视频精品| 成人成人成人在线视频| 欧美高清视频一二三区| 精品对白一区国产伦| 亚洲欧美在线另类| 午夜精品久久久久久久蜜桃app| 国产在线播放一区三区四| www.亚洲色图.com| 久久这里只有精品首页| 亚洲欧美成人一区二区三区| 九一九一国产精品| 欧美在线一区二区三区| 欧美一区二区精品在线| 一区二区三区精品视频| 国产酒店精品激情| 欧美乱熟臀69xxxxxx| 中文字幕第一区二区| 免费的成人av| 成人午夜免费av| 精品国产乱码久久久久久久| 亚洲免费毛片网站| 国产福利电影一区二区三区| 欧美乱妇15p| 亚洲午夜久久久久久久久电影院| 韩国三级在线一区| 欧美日韩国产影片| 最新日韩在线视频| 成人一区二区视频| 日韩精品在线一区二区| 夜夜揉揉日日人人青青一国产精品| 国产成人av网站| 51午夜精品国产| 日产欧产美韩系列久久99| 在线一区二区视频| 国产精品护士白丝一区av| 精品一区二区三区影院在线午夜| 欧美一区二区三区在线视频| 亚洲制服欧美中文字幕中文字幕| 久久精品国产成人一区二区三区| 欧美老年两性高潮| 亚洲综合久久久| 99国产精品99久久久久久| 国产日本欧洲亚洲| 国产精品资源在线观看| 精品久久久久久无| 精品综合久久久久久8888| 欧美伦理影视网| 久久激情综合网| 日韩午夜激情电影| 蜜桃精品视频在线观看| 日韩三级视频在线看| 黄页视频在线91| 久久综合色一综合色88| 精品一区二区在线视频| 欧美不卡一区二区| 国产成人在线看| 国产亚洲一区二区三区在线观看| 国产精品123| 国产精品乱人伦| 欧美在线免费观看亚洲| 亚洲乱码国产乱码精品精可以看 | 欧美亚洲综合久久| 一区二区三区四区亚洲| 91传媒视频在线播放| 亚洲激情成人在线| 4438成人网| 国产在线视频一区二区| 国产午夜精品在线观看| 成人av第一页| 日韩av电影免费观看高清完整版 |