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

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

?? vrc437x_serial.c

?? eCos操作系統源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
    return (scc_read_reg(&port->scc_dat));}inline static voidscc_write_dat(volatile struct serial_port *port, unsigned char val){    scc_write_reg(&port->scc_dat, val);}// Internal function to actually configure the hardware to desired baud rate, etc.static boolvrc437x_serial_config_port(serial_channel *chan, cyg_serial_info_t *new_config, bool init){    vrc437x_serial_info *vrc437x_chan = (vrc437x_serial_info *)chan->dev_priv;    volatile struct serial_port *port = (volatile struct serial_port *)vrc437x_chan->base;    cyg_int32 baud_rate = select_baud[new_config->baud];    cyg_int32 baud_divisor;    unsigned char *regs = &vrc437x_chan->regs[0];    if (baud_rate == 0) return false;    // Compute state of registers.  The register/control state needs to be kept in    // the shadow variable 'regs' because the hardware registers can only be written,    // not read (in general).    if (init) {        // Insert appropriate resets?        if (chan->out_cbuf.len != 0) {            regs[R1] = WR1_IntAllRx;            regs[R9] = WR9_MIE | WR9_NoVector;        } else {            regs[R1] = 0;            regs[R9] = 0;        }        // Clocks are from the baud rate generator        regs[R11] = WR11_TRxCBR | WR11_TRxCOI | WR11_TxCBR | WR11_RxCBR;          regs[R14] = WR14_BRenable | WR14_BRSRC;        regs[R10] = 0;    // Unused in this [async] mode        regs[R15] = 0;    }    regs[R3] = WR3_RxEnable | select_word_length_WR3[new_config->word_length - CYGNUM_SERIAL_WORD_LENGTH_5];    regs[R4] = WR4_X16CLK | select_stop_bits[new_config->stop] | select_parity[new_config->parity];    regs[R5] = WR5_TxEnable  | select_word_length_WR5[new_config->word_length - CYGNUM_SERIAL_WORD_LENGTH_5];    baud_divisor = BRTC(baud_rate);    regs[R12] = baud_divisor & 0xFF;    regs[R13] = baud_divisor >> 8;    // Now load the registers    scc_write_ctl(port, R4, regs[R4]);    scc_write_ctl(port, R10, regs[R10]);    scc_write_ctl(port, R3, regs[R3] & ~WR3_RxEnable);    scc_write_ctl(port, R5, regs[R5] & ~WR5_TxEnable);    scc_write_ctl(port, R1, regs[R1]);    scc_write_ctl(port, R9, regs[R9]);    scc_write_ctl(port, R11, regs[R11]);    scc_write_ctl(port, R12, regs[R12]);    scc_write_ctl(port, R13, regs[R13]);    scc_write_ctl(port, R14, regs[R14]);    scc_write_ctl(port, R15, regs[R15]);    scc_write_ctl(port, R3, regs[R3]);    scc_write_ctl(port, R5, regs[R5]);    // Update configuration    if (new_config != &chan->config) {        chan->config = *new_config;    }    return true;}// Function to initialize the device.  Called at bootstrap time.static bool vrc437x_serial_init(struct cyg_devtab_entry *tab){    serial_channel *chan = (serial_channel *)tab->priv;    vrc437x_serial_info *vrc437x_chan = (vrc437x_serial_info *)chan->dev_priv;    static bool init = false;#ifdef CYGDBG_IO_INIT    diag_printf("VRC437X SERIAL init '%s' - dev: %x\n", tab->name, vrc437x_chan->base);#endif    (chan->callbacks->serial_init)(chan);  // Really only required for interrupt driven devices    if (!init && chan->out_cbuf.len != 0) {        init = true;// Note that the hardware is rather broken.  The interrupt status needs to// be read using only channel A        cyg_drv_interrupt_create(VRC437X_SCC_INT,                                 99,                                                      (cyg_addrword_t)VRC437X_SCC_BASE+SCC_CHANNEL_A,                                 vrc437x_serial_ISR,                                 vrc437x_serial_DSR,                                 &vrc437x_serial_interrupt_handle,                                 &vrc437x_serial_interrupt);        cyg_drv_interrupt_attach(vrc437x_serial_interrupt_handle);        cyg_drv_interrupt_unmask(VRC437X_SCC_INT);    }    vrc437x_serial_config_port(chan, &chan->config, true);    return true;}// This routine is called when the device is "looked" up (i.e. attached)static Cyg_ErrNo vrc437x_serial_lookup(struct cyg_devtab_entry **tab,                   struct cyg_devtab_entry *sub_tab,                  const char *name){    serial_channel *chan = (serial_channel *)(*tab)->priv;    (chan->callbacks->serial_init)(chan);  // Really only required for interrupt driven devices    return ENOERR;}// Send a character to the device output buffer.// Return 'true' if character is sent to devicestatic boolvrc437x_serial_putc(serial_channel *chan, unsigned char c){    vrc437x_serial_info *vrc437x_chan = (vrc437x_serial_info *)chan->dev_priv;    volatile struct serial_port *port = (volatile struct serial_port *)vrc437x_chan->base;    if (scc_read_ctl(port, R0) & RR0_TxEmpty) {// Transmit buffer is empty        scc_write_dat(port, c);        return true;    } else {// No space        return false;    }}// Fetch a character from the device input buffer, waiting if necessarystatic unsigned char vrc437x_serial_getc(serial_channel *chan){    unsigned char c;    vrc437x_serial_info *vrc437x_chan = (vrc437x_serial_info *)chan->dev_priv;    volatile struct serial_port *port = (volatile struct serial_port *)vrc437x_chan->base;    while ((scc_read_ctl(port, R0) & RR0_RxAvail) == 0) ;   // Wait for char    c = scc_read_dat(port);    return c;}// Set up the device characteristics; baud rate, etc.static Cyg_ErrNovrc437x_serial_set_config(serial_channel *chan, cyg_uint32 key,                          const void *xbuf, cyg_uint32 *len){    switch (key) {    case CYG_IO_SET_CONFIG_SERIAL_INFO:      {        cyg_serial_info_t *config = (cyg_serial_info_t *)xbuf;        if ( *len < sizeof(cyg_serial_info_t) ) {            return -EINVAL;        }        *len = sizeof(cyg_serial_info_t);        if ( true != vrc437x_serial_config_port(chan, config, false) )            return -EINVAL;      }      break;    default:        return -EINVAL;    }    return ENOERR;}// Enable the transmitter on the devicestatic voidvrc437x_serial_start_xmit(serial_channel *chan){    vrc437x_serial_info *vrc437x_chan = (vrc437x_serial_info *)chan->dev_priv;    volatile struct serial_port *port = (volatile struct serial_port *)vrc437x_chan->base;    if ((vrc437x_chan->regs[R1] & WR1_TxIntEnab) == 0) {        CYG_INTERRUPT_STATE old;        HAL_DISABLE_INTERRUPTS(old);        vrc437x_chan->regs[R1] |= WR1_TxIntEnab;  // Enable Tx interrupt        scc_write_ctl(port, R1, vrc437x_chan->regs[R1]);        (chan->callbacks->xmt_char)(chan);  // Send first character to start xmitter        HAL_RESTORE_INTERRUPTS(old);    }}// Disable the transmitter on the devicestatic void vrc437x_serial_stop_xmit(serial_channel *chan){    vrc437x_serial_info *vrc437x_chan = (vrc437x_serial_info *)chan->dev_priv;    volatile struct serial_port *port = (volatile struct serial_port *)vrc437x_chan->base;    if ((vrc437x_chan->regs[R1] & WR1_TxIntEnab) != 0) {        CYG_INTERRUPT_STATE old;        HAL_DISABLE_INTERRUPTS(old);        vrc437x_chan->regs[R1] &= ~WR1_TxIntEnab;  // Disable Tx interrupt        scc_write_ctl(port, R1, vrc437x_chan->regs[R1]);        HAL_RESTORE_INTERRUPTS(old);    }}// Serial I/O - low level interrupt handler (ISR)static cyg_uint32 vrc437x_serial_ISR(cyg_vector_t vector, cyg_addrword_t data){    cyg_drv_interrupt_mask(VRC437X_SCC_INT);    cyg_drv_interrupt_acknowledge(VRC437X_SCC_INT);    return CYG_ISR_CALL_DSR;  // Cause DSR to be run}inline static voidvrc437x_int(serial_channel *chan, unsigned char stat){    vrc437x_serial_info *vrc437x_chan = (vrc437x_serial_info *)chan->dev_priv;    volatile struct serial_port *port = (volatile struct serial_port *)vrc437x_chan->base;    // Note: 'stat' value is interrupt status register, shifted into "B" position    if (stat & RR3_BRxIP) {        // Receive interrupt        unsigned char c;        c = scc_read_dat(port);        (chan->callbacks->rcv_char)(chan, c);    }    if (stat & RR3_BTxIP) {        // Transmit interrupt        (chan->callbacks->xmt_char)(chan);    }    if (stat & RR3_BExt) {        // Status interrupt (parity error, framing error, etc)    }}// Serial I/O - high level interrupt handler (DSR)// Note: This device presents a single interrupt for both channels.  Thus the// interrupt handler has to query the device and decide which channel needs service.// Additionally, more than one interrupt condition may be present so this needs to// be done in a loop until all interrupt requests have been handled.// Also note that the hardware is rather broken.  The interrupt status needs to// be read using only channel A (pointed to by 'data')static void       vrc437x_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data){    serial_channel *chan;    volatile struct serial_port *port = (volatile struct serial_port *)data;    unsigned char stat;    while (true) {        stat = scc_read_ctl(port, R3);        if (stat & (RR3_AExt | RR3_ATxIP | RR3_ARxIP)) {            chan = vrc437x_chans[0];  // Hardware channel A            vrc437x_int(chan, stat>>3);  // Handle interrupt        } else if (stat & (RR3_BExt | RR3_BTxIP | RR3_BRxIP)) {            chan = vrc437x_chans[1];  // Hardware channel B            vrc437x_int(chan, stat);  // Handle interrupt        } else {            // No more interrupts, all done            break;        }    }    cyg_drv_interrupt_unmask(VRC437X_SCC_INT);}#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产高清在线精品| 制服丝袜亚洲精品中文字幕| 午夜av一区二区| 中文在线一区二区| 337p日本欧洲亚洲大胆色噜噜| 在线看一区二区| 波多野结衣在线aⅴ中文字幕不卡| 日日摸夜夜添夜夜添亚洲女人| 亚洲日本va午夜在线影院| 国产午夜亚洲精品羞羞网站| 日韩欧美aaaaaa| 日韩欧美一区二区不卡| 在线播放中文一区| 在线观看视频欧美| 国产精品主播直播| 国产美女主播视频一区| 精品一区二区免费看| 日本欧美肥老太交大片| 午夜精品久久久久久久蜜桃app| 亚洲综合小说图片| 夜夜嗨av一区二区三区网页| 国产精品欧美久久久久无广告| 亚洲精品一区二区三区福利| 精品伦理精品一区| 久久久久成人黄色影片| 国产欧美一区二区精品婷婷| 国产精品欧美一级免费| 亚洲欧美偷拍卡通变态| 国产精品久久久久婷婷二区次| 国产精品乱码久久久久久| 国产精品欧美综合在线| 亚洲蜜臀av乱码久久精品| 亚洲午夜激情av| 奇米影视7777精品一区二区| 亚洲国产视频一区| 麻豆精品视频在线观看免费| 成人自拍视频在线观看| 99久久综合国产精品| 国产乱子伦视频一区二区三区 | 久久―日本道色综合久久| 久久久国产精华| 日韩激情在线观看| 国产一区二区三区蝌蚪| www.久久精品| 欧美久久免费观看| 久久综合色鬼综合色| 日韩精品一区二区三区在线观看| 精品国产sm最大网站| 中文字幕一区二区三区在线播放| 亚洲一区二区三区四区不卡| 男女男精品视频| 97aⅴ精品视频一二三区| 欧美日本免费一区二区三区| 欧美夫妻性生活| 久久精品免费在线观看| 亚洲电影一级片| 国产精品一级片| 欧美午夜在线一二页| 国产亚洲婷婷免费| 亚洲一区二区三区小说| 极品少妇xxxx偷拍精品少妇| 在线日韩一区二区| 国产精品污污网站在线观看 | 色综合久久中文综合久久牛| 欧美一区二区三区免费观看视频| 国产拍欧美日韩视频二区| 婷婷中文字幕一区三区| av成人动漫在线观看| 日韩欧美成人一区| 国产69精品久久99不卡| 欧美精品日韩综合在线| 国产精品电影一区二区三区| 久久9热精品视频| 91一区二区在线| 久久久久久久久久久久久女国产乱| 樱花影视一区二区| 成人av免费在线播放| 欧美精品一区二区三区高清aⅴ| 亚洲精品国产第一综合99久久| 韩国一区二区视频| 欧美午夜精品免费| 亚洲午夜精品一区二区三区他趣| 不卡视频在线观看| 国产精品乱子久久久久| 风间由美性色一区二区三区| 精品国产青草久久久久福利| 日韩精品免费视频人成| 欧美日韩精品一区二区三区蜜桃| 国产精品美女久久久久av爽李琼| 国产在线视频不卡二| 精品美女被调教视频大全网站| 日韩精品亚洲专区| 911精品国产一区二区在线| 亚洲一本大道在线| 69av一区二区三区| 一区二区三区四区乱视频| 色域天天综合网| 亚洲一区在线观看免费观看电影高清 | 久久你懂得1024| 精品系列免费在线观看| 欧美成人福利视频| 激情文学综合插| 久久久午夜精品理论片中文字幕| 国内国产精品久久| 久久久久久久综合狠狠综合| 国产精品夜夜爽| 国产精品理伦片| 日本乱人伦aⅴ精品| 亚洲专区一二三| 日韩视频在线一区二区| 国产精品99久久久| 久久久久久久久久久久久女国产乱| 国产精品996| 一区二区三区四区亚洲| 91精品在线麻豆| 国产老妇另类xxxxx| 日本一区二区三区免费乱视频| 国产电影精品久久禁18| 亚洲美腿欧美偷拍| 91精品国产乱| 岛国精品在线播放| 一区二区成人在线| 欧美一区三区二区| 国产精品1区2区3区在线观看| 国产精品美女久久久久高潮| 欧美亚洲日本国产| 久久99精品久久久久久国产越南| 国产精品久久久久久久久果冻传媒| 99久久免费视频.com| 日韩电影在线观看电影| 欧美国产亚洲另类动漫| 色综合色狠狠综合色| 麻豆freexxxx性91精品| 亚洲天堂精品视频| 久久久久高清精品| 亚洲蜜桃精久久久久久久| 国产日本一区二区| 亚洲精品在线观看网站| 在线电影欧美成精品| 欧美日韩高清一区二区不卡| 日本伦理一区二区| 色婷婷av一区二区三区软件| 99精品久久99久久久久| 成人91在线观看| 粉嫩一区二区三区在线看| 精品在线你懂的| 韩国一区二区三区| 国产综合久久久久久鬼色 | 国产一区二区三区免费播放 | 成人av网站免费| 成人高清免费观看| 成人亚洲一区二区一| 国产成人午夜99999| 国产乱码一区二区三区| 国产91精品久久久久久久网曝门| 国产suv精品一区二区6| aaa欧美大片| 欧美亚洲愉拍一区二区| 欧美日韩亚洲丝袜制服| 日韩一区二区三区免费看 | jlzzjlzz亚洲日本少妇| av成人老司机| 欧美日韩日日摸| 欧美不卡一区二区三区四区| 精品久久国产老人久久综合| 久久精品日韩一区二区三区| 中文字幕一区二区三区四区不卡 | 日韩精品三区四区| 精品一区二区在线观看| 国产91精品一区二区| 91极品美女在线| 日韩欧美一区二区免费| 国产蜜臀97一区二区三区| 亚洲精选在线视频| 蜜桃视频免费观看一区| 国产成人精品影视| 91国偷自产一区二区使用方法| 欧美群妇大交群中文字幕| 精品国产免费人成在线观看| 中文字幕乱码日本亚洲一区二区| 亚洲女同一区二区| 日本91福利区| 成人污污视频在线观看| 欧美色爱综合网| 久久精品一区二区| 亚洲老司机在线| 国产一区二区三区久久悠悠色av| 不卡视频在线看| 精品久久久影院| 亚洲精品国产高清久久伦理二区| 久草在线在线精品观看| 99国产精品国产精品久久| 欧美成人伊人久久综合网| 一区在线播放视频| 精品中文字幕一区二区| 欧美亚洲一区二区在线| 日本一区二区三区四区| 蜜桃久久久久久久| 色婷婷综合久久久久中文| 国产日韩成人精品|