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

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

?? vrc4373_serial.c

?? eCos1.31版
?? C
?? 第 1 頁 / 共 2 頁
字號:
inline static unsigned charscc_read_dat(volatile struct serial_port *port){    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 boolvrc4373_serial_config_port(serial_channel *chan, cyg_serial_info_t *new_config, bool init){    vrc4373_serial_info *vrc4373_chan = (vrc4373_serial_info *)chan->dev_priv;    volatile struct serial_port *port = (volatile struct serial_port *)vrc4373_chan->base;    cyg_int32 baud_rate = select_baud[new_config->baud];    cyg_int32 baud_divisor;    unsigned char *regs = &vrc4373_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 vrc4373_serial_init(struct cyg_devtab_entry *tab){    serial_channel *chan = (serial_channel *)tab->priv;    vrc4373_serial_info *vrc4373_chan = (vrc4373_serial_info *)chan->dev_priv;    static bool init = false;#ifdef CYGDBG_IO_INIT    diag_printf("VRC4373 SERIAL init '%s' - dev: %x\n", tab->name, vrc4373_chan->base);#endif    (chan->callbacks->serial_init)(chan);  // Really only required for interrupt driven devices    if (!init && chan->out_cbuf.len != 0) {        init = true;        cyg_drv_interrupt_create(VRC4373_SCC_INT,                                 99,                                                      (cyg_addrword_t)VRC4373_SCC_BASE+SCC_CHANNEL_A,                                 vrc4373_serial_ISR,                                 vrc4373_serial_DSR,                                 &vrc4373_serial_interrupt_handle,                                 &vrc4373_serial_interrupt);        cyg_drv_interrupt_attach(vrc4373_serial_interrupt_handle);        cyg_drv_interrupt_unmask(VRC4373_SCC_INT);    }    vrc4373_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 vrc4373_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 boolvrc4373_serial_putc(serial_channel *chan, unsigned char c){    vrc4373_serial_info *vrc4373_chan = (vrc4373_serial_info *)chan->dev_priv;    volatile struct serial_port *port = (volatile struct serial_port *)vrc4373_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 vrc4373_serial_getc(serial_channel *chan){    unsigned char c;    vrc4373_serial_info *vrc4373_chan = (vrc4373_serial_info *)chan->dev_priv;    volatile struct serial_port *port = (volatile struct serial_port *)vrc4373_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 bool vrc4373_serial_set_config(serial_channel *chan, cyg_serial_info_t *config){    return vrc4373_serial_config_port(chan, config, false);}// Enable the transmitter on the devicestatic voidvrc4373_serial_start_xmit(serial_channel *chan){    vrc4373_serial_info *vrc4373_chan = (vrc4373_serial_info *)chan->dev_priv;    volatile struct serial_port *port = (volatile struct serial_port *)vrc4373_chan->base;    if ((vrc4373_chan->regs[R1] & WR1_TxIntEnab) == 0) {        CYG_INTERRUPT_STATE old;        HAL_DISABLE_INTERRUPTS(old);        vrc4373_chan->regs[R1] |= WR1_TxIntEnab;  // Enable Tx interrupt        scc_write_ctl(port, R1, vrc4373_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 vrc4373_serial_stop_xmit(serial_channel *chan){    vrc4373_serial_info *vrc4373_chan = (vrc4373_serial_info *)chan->dev_priv;    volatile struct serial_port *port = (volatile struct serial_port *)vrc4373_chan->base;    if ((vrc4373_chan->regs[R1] & WR1_TxIntEnab) != 0) {        CYG_INTERRUPT_STATE old;        HAL_DISABLE_INTERRUPTS(old);        vrc4373_chan->regs[R1] &= ~WR1_TxIntEnab;  // Disable Tx interrupt        scc_write_ctl(port, R1, vrc4373_chan->regs[R1]);        HAL_RESTORE_INTERRUPTS(old);    }}// Serial I/O - low level interrupt handler (ISR)static cyg_uint32 vrc4373_serial_ISR(cyg_vector_t vector, cyg_addrword_t data){    cyg_drv_interrupt_mask(VRC4373_SCC_INT);    cyg_drv_interrupt_acknowledge(VRC4373_SCC_INT);    return CYG_ISR_CALL_DSR;  // Cause DSR to be run}inline static voidvrc4373_int(serial_channel *chan, unsigned char stat){    vrc4373_serial_info *vrc4373_chan = (vrc4373_serial_info *)chan->dev_priv;    volatile struct serial_port *port = (volatile struct serial_port *)vrc4373_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       vrc4373_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 = vrc4373_chans[0];  // Hardware channel A            vrc4373_int(chan, stat>>3);  // Handle interrupt        } else if (stat & (RR3_BExt | RR3_BTxIP | RR3_BRxIP)) {            chan = vrc4373_chans[1];  // Hardware channel A            vrc4373_int(chan, stat);  // Handle interrupt        } else {            // No more interrupts, all done            break;        }    }    cyg_drv_interrupt_unmask(VRC4373_SCC_INT);}#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品77777| 99视频国产精品| 亚洲欧洲av色图| 日韩精品一区二区三区视频播放| 国内精品嫩模私拍在线| 亚洲一区二区偷拍精品| 中文字幕第一区综合| 91精品国产入口| 日本大香伊一区二区三区| 国产一区二区免费在线| 日韩精品免费专区| 亚洲一区二区影院| 亚洲激情图片一区| 国产精品乱人伦一区二区| 久久男人中文字幕资源站| 91精品福利在线一区二区三区| 99精品1区2区| 不卡的看片网站| 国产麻豆日韩欧美久久| 男人操女人的视频在线观看欧美| 一区二区三区在线观看欧美| 国产欧美精品一区二区色综合 | 日本人妖一区二区| 日韩理论片在线| 国产亚洲精品bt天堂精选| 欧美成人猛片aaaaaaa| 欧美高清视频一二三区| 精品美女一区二区| 51精品秘密在线观看| 欧美自拍偷拍一区| 欧美视频在线播放| 欧美性感一类影片在线播放| 91蝌蚪porny| 99久久久国产精品免费蜜臀| 99久久婷婷国产综合精品电影| 福利一区福利二区| 不卡av电影在线播放| 福利一区二区在线观看| 成人久久18免费网站麻豆| 成人免费看的视频| av电影在线不卡| 91一区二区在线观看| 色综合天天在线| 91丨九色porny丨蝌蚪| 91麻豆蜜桃一区二区三区| 91视频xxxx| 色噜噜狠狠色综合中国| 欧美视频日韩视频在线观看| 欧美电影在线免费观看| 欧美一区二区三区日韩视频| 日韩三级在线观看| 久久亚洲二区三区| 日本一二三四高清不卡| 亚洲区小说区图片区qvod| 亚洲一二三四在线观看| 日日噜噜夜夜狠狠视频欧美人 | 日韩精品综合一本久道在线视频| 欧美va天堂va视频va在线| 2021国产精品久久精品| 中文字幕不卡的av| 亚洲免费观看高清完整版在线观看| 亚洲免费观看在线观看| 三级久久三级久久| 国产精品一线二线三线| 色呦呦国产精品| 欧美精品aⅴ在线视频| 精品av久久707| 亚洲丝袜另类动漫二区| 99久久夜色精品国产网站| 欧洲精品在线观看| 欧美精品一区二区久久久| 亚洲人吸女人奶水| 免费一级片91| 成人手机电影网| 欧美男人的天堂一二区| 欧美精品一区二区三区高清aⅴ | 亚洲一级二级三级在线免费观看| 蜜乳av一区二区三区| 成人精品小蝌蚪| 欧美精品1区2区3区| 欧美激情综合五月色丁香| 一区二区三区不卡视频| 国产一区二区在线观看免费| 99精品在线观看视频| 91精品国产手机| 亚洲视频在线一区二区| 捆绑调教一区二区三区| 91麻豆视频网站| 久久―日本道色综合久久| 亚洲国产成人av好男人在线观看| 国产成人小视频| 777xxx欧美| 亚洲精品第1页| 国产成人av电影在线观看| 欧美日韩国产成人在线91| 国产精品视频观看| 美女免费视频一区二区| 日本高清不卡在线观看| 亚洲国产精品精华液ab| 久久精品国产亚洲高清剧情介绍| 色综合视频一区二区三区高清| 欧美成人女星排名| 午夜精品视频一区| 99re在线视频这里只有精品| 精品国产伦理网| 日韩精品亚洲专区| 欧美三级日本三级少妇99| 中文字幕在线观看不卡| 国产电影一区二区三区| 日韩精品中文字幕一区二区三区 | 国产精品污www在线观看| 欧美aaa在线| 在线不卡中文字幕| 一区二区三区在线不卡| 成人99免费视频| 久久综合久久99| 另类小说综合欧美亚洲| 91精品久久久久久蜜臀| 黄色日韩网站视频| 91精品国产麻豆| 亚洲成av人在线观看| 日本精品一区二区三区高清 | eeuss影院一区二区三区| 久久久欧美精品sm网站| 另类的小说在线视频另类成人小视频在线 | 亚洲影院在线观看| 99re热视频这里只精品| 国产三级欧美三级| 国产丶欧美丶日本不卡视频| 久久影院午夜片一区| 国产综合色在线| 久久―日本道色综合久久| 国产一区在线不卡| 国产亚洲综合性久久久影院| 国产精品综合二区| 中文字幕国产一区二区| fc2成人免费人成在线观看播放| 国产女同性恋一区二区| 成人av综合在线| 中文字幕日韩av资源站| 日本韩国欧美国产| 丝袜亚洲另类丝袜在线| 91精品国产全国免费观看| 久久se精品一区二区| 久久综合网色—综合色88| 国产成人免费9x9x人网站视频| 久久综合色综合88| 国产成人精品免费| 国产精品欧美极品| 日本韩国欧美一区| 日韩成人午夜精品| 久久久99精品久久| 91在线精品一区二区| 亚洲国产精品影院| 日韩一级精品视频在线观看| 国产一区二区免费看| 亚洲欧洲日产国码二区| 欧美日韩美女一区二区| 精品中文av资源站在线观看| 国产精品色一区二区三区| 色偷偷久久一区二区三区| 亚洲第一精品在线| 久久影院午夜论| 久久免费精品国产久精品久久久久| 国产精品一二三四| 亚洲在线中文字幕| 欧美精品一区二区三区一线天视频| 丁香婷婷综合色啪| 亚洲国产精品人人做人人爽| 欧美岛国在线观看| 成人av资源网站| 视频一区在线视频| 久久精品一级爱片| 欧美日韩一级视频| 国产91综合网| 五月综合激情婷婷六月色窝| 久久精品视频一区二区三区| 色综合色狠狠综合色| 久久精品av麻豆的观看方式| 国产精品国产三级国产普通话蜜臀 | 国产综合久久久久久久久久久久| 国产精品麻豆网站| 欧美一区二区三区啪啪| 成人综合在线观看| 日韩精品一级二级| 亚洲欧美色综合| 2020国产精品自拍| 欧美色倩网站大全免费| 国产福利一区在线观看| 亚洲h动漫在线| 中文字幕色av一区二区三区| 91精品国产色综合久久不卡电影 | 欧美日韩国产片| 不卡av在线网| 国产在线观看一区二区| 性欧美疯狂xxxxbbbb| 中文字幕亚洲电影| 国产亚洲一区二区三区在线观看 | 国产91在线|亚洲| 男女视频一区二区|