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

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

?? sh_sci_serial.c

?? 開放源碼實時操作系統源碼.
?? C
?? 第 1 頁 / 共 2 頁
字號:
                                 &sh_chan->serial_tx_interrupt);
        cyg_drv_interrupt_attach(sh_chan->serial_tx_interrupt_handle);
        cyg_drv_interrupt_unmask(sh_chan->tx_int_num);
        sh_chan->tx_enabled = false;
    }
    if (chan->in_cbuf.len != 0) {
        // Receive interrupt
        cyg_drv_interrupt_create(sh_chan->rx_int_num,
                                 3,
                                 (cyg_addrword_t)chan, // Data item passed to interrupt handler
                                 sh_serial_rx_ISR,
                                 sh_serial_rx_DSR,
                                 &sh_chan->serial_rx_interrupt_handle,
                                 &sh_chan->serial_rx_interrupt);
        cyg_drv_interrupt_attach(sh_chan->serial_rx_interrupt_handle);
        // Receive error interrupt
        cyg_drv_interrupt_create(sh_chan->er_int_num,
                                 3,
                                 (cyg_addrword_t)chan, // Data item passed to interrupt handler
                                 sh_serial_er_ISR,
                                 sh_serial_er_DSR,
                                 &sh_chan->serial_er_interrupt_handle,
                                 &sh_chan->serial_er_interrupt);
        cyg_drv_interrupt_attach(sh_chan->serial_er_interrupt_handle);
        // This unmasks both interrupt sources.
        cyg_drv_interrupt_unmask(sh_chan->rx_int_num);
    }
    sh_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 
sh_serial_lookup(struct cyg_devtab_entry **tab, 
                  struct cyg_devtab_entry *sub_tab,
                  const char *name)
{
    serial_channel *chan = (serial_channel *)(*tab)->priv;

    // Really only required for interrupt driven devices
    (chan->callbacks->serial_init)(chan);
    return ENOERR;
}

// Send a character to the device output buffer.
// Return 'true' if character is sent to device
static bool
sh_serial_putc(serial_channel *chan, unsigned char c)
{
    cyg_uint8 _ssr;
    sh_sci_info *sh_chan = (sh_sci_info *)chan->dev_priv;

    HAL_READ_UINT8(sh_chan->ctrl_base+SCI_SCSSR, _ssr);
    if (_ssr & CYGARC_REG_SCI_SCSSR_TDRE) {
// Transmit buffer is empty
        HAL_WRITE_UINT8(sh_chan->ctrl_base+SCI_SCTDR, c);
        // Clear empty flag.
        HAL_WRITE_UINT8(sh_chan->ctrl_base+SCI_SCSSR, 
                        CYGARC_REG_SCI_SCSSR_CLEARMASK & ~CYGARC_REG_SCI_SCSSR_TDRE);
        return true;
    } else {
// No space
        return false;
    }
}

// Fetch a character from the device input buffer, waiting if necessary
static unsigned char 
sh_serial_getc(serial_channel *chan)
{
    sh_sci_info *sh_chan = (sh_sci_info *)chan->dev_priv;
    unsigned char c;
    cyg_uint8 _ssr;

    do {
        HAL_READ_UINT8(sh_chan->ctrl_base+SCI_SCSSR, _ssr);
    } while ((_ssr & CYGARC_REG_SCI_SCSSR_RDRF) == 0);

    HAL_READ_UINT8(sh_chan->ctrl_base+SCI_SCRDR, c);

    // Clear buffer full flag.
    HAL_WRITE_UINT8(sh_chan->ctrl_base+SCI_SCSSR, 
                    CYGARC_REG_SCI_SCSSR_CLEARMASK & ~CYGARC_REG_SCI_SCSSR_RDRF);

    return c;
}

// Set up the device characteristics; baud rate, etc.
static Cyg_ErrNo
sh_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 != sh_serial_config_port(chan, config, false) )
            return -EINVAL;
      }
      break;
    default:
        return -EINVAL;
    }
    return ENOERR;
}

// Enable the transmitter on the device
static void
sh_serial_start_xmit(serial_channel *chan)
{
    cyg_uint8 _scr;
    sh_sci_info *sh_chan = (sh_sci_info *)chan->dev_priv;

    sh_chan->tx_enabled = true;

    // Mask the interrupts (all sources of the unit) while changing
    // the CR since a rx interrupt in the middle of this would result
    // in a bad CR state.
    cyg_drv_interrupt_mask(sh_chan->rx_int_num);

    HAL_READ_UINT8(sh_chan->ctrl_base+SCI_SCSCR, _scr);
    _scr |= CYGARC_REG_SCI_SCSCR_TIE;       // Enable xmit interrupt
    HAL_WRITE_UINT8(sh_chan->ctrl_base+SCI_SCSCR, _scr);

    cyg_drv_interrupt_unmask(sh_chan->rx_int_num);
}

// Disable the transmitter on the device
static void 
sh_serial_stop_xmit(serial_channel *chan)
{
    cyg_uint8 _scr;
    sh_sci_info *sh_chan = (sh_sci_info *)chan->dev_priv;

    sh_chan->tx_enabled = false;

    // Mask the interrupts (all sources of the unit) while changing
    // the CR since a rx interrupt in the middle of this would result
    // in a bad CR state.
    cyg_drv_interrupt_mask(sh_chan->rx_int_num);

    HAL_READ_UINT8(sh_chan->ctrl_base+SCI_SCSCR, _scr);
    _scr &= ~CYGARC_REG_SCI_SCSCR_TIE;      // Disable xmit interrupt
    HAL_WRITE_UINT8(sh_chan->ctrl_base+SCI_SCSCR, _scr);

    cyg_drv_interrupt_unmask(sh_chan->rx_int_num);
}

// Serial I/O - low level tx interrupt handler (ISR)
static cyg_uint32 
sh_serial_tx_ISR(cyg_vector_t vector, cyg_addrword_t data)
{
    serial_channel *chan = (serial_channel *)data;
    sh_sci_info *sh_chan = (sh_sci_info *)chan->dev_priv;
    cyg_uint8 _scr;

    HAL_READ_UINT8(sh_chan->ctrl_base+SCI_SCSCR, _scr);
    _scr &= ~CYGARC_REG_SCI_SCSCR_TIE;      // mask out tx interrupts
    HAL_WRITE_UINT8(sh_chan->ctrl_base+SCI_SCSCR, _scr);

    return CYG_ISR_CALL_DSR;  // Cause DSR to be run
}

// Serial I/O - high level tx interrupt handler (DSR)
static void       
sh_serial_tx_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data)
{
    serial_channel *chan = (serial_channel *)data;
    sh_sci_info *sh_chan = (sh_sci_info *)chan->dev_priv;

    (chan->callbacks->xmt_char)(chan);

    if (sh_chan->tx_enabled) {
        cyg_uint8 _scr;

        HAL_READ_UINT8(sh_chan->ctrl_base+SCI_SCSCR, _scr);
        _scr |= CYGARC_REG_SCI_SCSCR_TIE;       // unmask tx interrupts
        HAL_WRITE_UINT8(sh_chan->ctrl_base+SCI_SCSCR, _scr);
    }
}

// Serial I/O - low level RX interrupt handler (ISR)
static cyg_uint32 
sh_serial_rx_ISR(cyg_vector_t vector, cyg_addrword_t data)
{
    serial_channel *chan = (serial_channel *)data;
    sh_sci_info *sh_chan = (sh_sci_info *)chan->dev_priv;
    cyg_uint8 _scr;

    HAL_READ_UINT8(sh_chan->ctrl_base+SCI_SCSCR, _scr);
    _scr &= ~CYGARC_REG_SCI_SCSCR_RIE;      // mask rx interrupts
    HAL_WRITE_UINT8(sh_chan->ctrl_base+SCI_SCSCR, _scr);
    return CYG_ISR_CALL_DSR;  // Cause DSR to be run
}

// Serial I/O - high level rx interrupt handler (DSR)
static void       
sh_serial_rx_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data)
{
    serial_channel *chan = (serial_channel *)data;
    sh_sci_info *sh_chan = (sh_sci_info *)chan->dev_priv;
    cyg_uint8 _ssr, _scr;

    HAL_READ_UINT8(sh_chan->ctrl_base+SCI_SCSSR, _ssr);
    if (_ssr & CYGARC_REG_SCI_SCSSR_RDRF) {
        cyg_uint8 _c;
        HAL_READ_UINT8(sh_chan->ctrl_base+SCI_SCRDR, _c);
        // Clear buffer full flag.
        HAL_WRITE_UINT8(sh_chan->ctrl_base+SCI_SCSSR, 
                        CYGARC_REG_SCI_SCSSR_CLEARMASK & ~CYGARC_REG_SCI_SCSSR_RDRF);

        (chan->callbacks->rcv_char)(chan, _c);
    }

    HAL_READ_UINT8(sh_chan->ctrl_base+SCI_SCSCR, _scr);
    _scr |= CYGARC_REG_SCI_SCSCR_RIE;       // unmask rx interrupts
    HAL_WRITE_UINT8(sh_chan->ctrl_base+SCI_SCSCR, _scr);
}

static volatile int sh_serial_error_orer = 0;
static volatile int sh_serial_error_fer = 0;
static volatile int sh_serial_error_per = 0;

// Serial I/O - low level error interrupt handler (ISR)
static cyg_uint32 
sh_serial_er_ISR(cyg_vector_t vector, cyg_addrword_t data)
{
    serial_channel *chan = (serial_channel *)data;
    sh_sci_info *sh_chan = (sh_sci_info *)chan->dev_priv;
    cyg_uint8 _scr;

    HAL_READ_UINT8(sh_chan->ctrl_base+SCI_SCSCR, _scr);
    _scr &= ~CYGARC_REG_SCI_SCSCR_RIE;      // mask rx interrupts
    HAL_WRITE_UINT8(sh_chan->ctrl_base+SCI_SCSCR, _scr);
    return CYG_ISR_CALL_DSR;            // Cause DSR to be run
}

// Serial I/O - high level error interrupt handler (DSR)
static void       
sh_serial_er_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data)
{
    serial_channel *chan = (serial_channel *)data;
    sh_sci_info *sh_chan = (sh_sci_info *)chan->dev_priv;
    cyg_uint8 _ssr, _ssr2, _scr;

    HAL_READ_UINT8(sh_chan->ctrl_base+SCI_SCSSR, _ssr);
    _ssr2 = CYGARC_REG_SCI_SCSSR_CLEARMASK;

    if (_ssr & CYGARC_REG_SCI_SCSSR_ORER) {
        _ssr2 &= ~CYGARC_REG_SCI_SCSSR_ORER;
        sh_serial_error_orer++;
    }
    if (_ssr & CYGARC_REG_SCI_SCSSR_FER) {
        _ssr2 &= ~CYGARC_REG_SCI_SCSSR_FER;
        sh_serial_error_fer++;
    }
    if (_ssr & CYGARC_REG_SCI_SCSSR_PER) {
        _ssr2 &= ~CYGARC_REG_SCI_SCSSR_PER;
        sh_serial_error_per++;
    }
    HAL_WRITE_UINT8(sh_chan->ctrl_base+SCI_SCSSR, _ssr2);

    HAL_READ_UINT8(sh_chan->ctrl_base+SCI_SCSCR, _scr);
    _scr |= CYGARC_REG_SCI_SCSCR_RIE;       // unmask rx interrupts
    HAL_WRITE_UINT8(sh_chan->ctrl_base+SCI_SCSCR, _scr);
}

#endif // ifdef CYGDAT_IO_SERIAL_SH_SCI_INL

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一区二区久久不卡| 亚洲chinese男男1069| 91精品福利在线| 亚洲精品乱码久久久久久黑人| 欧美午夜精品免费| 国内不卡的二区三区中文字幕| 亚洲欧洲99久久| 91麻豆精品国产91久久久久| 国产69精品久久久久毛片| 久久精品夜色噜噜亚洲a∨| 国产一区二区三区美女| 香蕉成人伊视频在线观看| 久久综合九色综合97婷婷女人| 欧美日韩国产高清一区二区| yourporn久久国产精品| 美女一区二区久久| 亚洲一区中文日韩| 欧美国产乱子伦 | 亚洲图片激情小说| 91精品国产福利在线观看| 成人免费毛片片v| 免费观看日韩电影| 国产精品国产三级国产aⅴ原创| 7878成人国产在线观看| 欧美日韩一区二区三区高清| www.欧美日韩| 国产精品资源在线| 裸体一区二区三区| 一区二区在线观看视频| 日韩精品一区在线| 91日韩精品一区| 国产盗摄视频一区二区三区| 男人的j进女人的j一区| 亚洲图片欧美一区| 中文乱码免费一区二区| 日本一区二区三区免费乱视频| 91精品国产麻豆| 精品视频一区二区不卡| 欧美少妇xxx| 99久久精品国产精品久久| 国产美女娇喘av呻吟久久| 日本亚洲免费观看| 亚洲成a人在线观看| 亚洲免费av高清| 亚洲欧洲精品天堂一级 | 26uuu亚洲婷婷狠狠天堂| 欧美日韩国产高清一区二区三区 | 亚洲精品欧美在线| 亚洲日本丝袜连裤袜办公室| 日韩一区二区三区免费观看| 欧美高清性hdvideosex| 色天天综合久久久久综合片| 99视频一区二区| av激情综合网| 99天天综合性| 色综合天天综合色综合av| jizz一区二区| 99久久久免费精品国产一区二区 | 日日嗨av一区二区三区四区| 亚洲成a人片综合在线| 亚洲超丰满肉感bbw| 亚洲mv在线观看| 性久久久久久久久| 洋洋成人永久网站入口| 亚洲图片欧美一区| 午夜伊人狠狠久久| 日韩一区精品字幕| 久久精品国产99国产精品| 精品亚洲成a人| 日韩av电影免费观看高清完整版在线观看| 亚洲bt欧美bt精品| 婷婷丁香激情综合| 久久国产剧场电影| 国内精品视频666| 成人小视频在线观看| 一本久久精品一区二区| 色综合色狠狠天天综合色| 成人黄页毛片网站| 色综合久久综合网| 欧美丰满少妇xxxbbb| 精品福利二区三区| 国产精品你懂的在线| 亚洲精品视频在线观看免费| 中文字幕在线播放不卡一区| 国产精品福利一区| 亚洲成人你懂的| 国产最新精品精品你懂的| 成人综合婷婷国产精品久久蜜臀| 色哟哟欧美精品| 欧美一级淫片007| 国产日韩视频一区二区三区| 亚洲精品免费播放| 久久精品国产**网站演员| 韩国三级在线一区| 国产夫妻精品视频| 色久优优欧美色久优优| 欧美一级国产精品| 欧美激情中文字幕| 亚洲r级在线视频| 精品一区二区三区香蕉蜜桃 | 老汉av免费一区二区三区| 国产传媒欧美日韩成人| 色婷婷激情一区二区三区| 日韩一区二区三区高清免费看看 | 美女一区二区视频| 99re在线视频这里只有精品| 91精品在线免费观看| 国产精品免费视频一区| 美女在线一区二区| 一本久久综合亚洲鲁鲁五月天| 日韩欧美你懂的| 亚洲国产日韩av| 成人高清视频免费观看| 欧美一区二区三区播放老司机| 一区二区三区精品在线| 成人一级片网址| 欧美一区二区视频免费观看| 一区二区三区不卡在线观看| 国产精品一线二线三线| 4438x亚洲最大成人网| 国产精品人人做人人爽人人添| 日韩激情一区二区| 色94色欧美sute亚洲线路一久 | 国产午夜亚洲精品午夜鲁丝片| 亚洲gay无套男同| 色综合天天综合网天天狠天天| 欧美一区二区三区日韩视频| 中文字幕亚洲在| 国内精品视频一区二区三区八戒| 色婷婷av一区二区三区gif| 欧美国产禁国产网站cc| 国产乱码字幕精品高清av| 欧美精品久久久久久久久老牛影院 | 日日夜夜一区二区| 91黄色免费看| 亚洲少妇中出一区| 亚洲图片自拍偷拍| 欧美性大战久久久久久久| 一区在线中文字幕| 久久国产精品免费| 精品99久久久久久| 麻豆精品在线观看| 久久亚洲精精品中文字幕早川悠里| www国产精品av| 精品一区二区三区在线播放 | 高清国产一区二区| 国产精品色在线观看| 99视频精品在线| 国产精品女人毛片| 91麻豆国产精品久久| 亚洲自拍偷拍网站| 欧美一区二区在线视频| 久久精品国产**网站演员| 久久精品亚洲精品国产欧美| 9久草视频在线视频精品| 亚洲欧美成人一区二区三区| 欧美三级中文字| 美女一区二区在线观看| 国产精品午夜久久| 91麻豆swag| 日韩精品电影在线| 久久精品综合网| 色狠狠一区二区| 秋霞影院一区二区| 久久综合精品国产一区二区三区 | 亚洲欧洲一区二区在线播放| 91久久一区二区| 奇米亚洲午夜久久精品| 久久精品夜色噜噜亚洲a∨| 91亚洲精品一区二区乱码| 亚洲亚洲人成综合网络| 精品国产免费久久| 91在线码无精品| 天天综合网天天综合色| 国产欧美日韩久久| 欧美日韩一区二区不卡| 国产激情91久久精品导航| 樱桃国产成人精品视频| 欧美va亚洲va在线观看蝴蝶网| 99久久综合国产精品| 男人的天堂久久精品| 亚洲视频免费观看| 日韩一区二区三区视频在线| 色综合视频一区二区三区高清| 另类综合日韩欧美亚洲| 亚洲视频免费在线观看| 精品国产精品一区二区夜夜嗨| 91在线看国产| 国产一区二区三区综合| 亚洲成人三级小说| 国产精品丝袜黑色高跟| 日韩女优av电影| 欧洲视频一区二区| 国产乱码精品一区二区三区忘忧草 | 国内成人精品2018免费看| 亚洲影院免费观看| 国产欧美日韩麻豆91| 日韩免费观看高清完整版| 欧美综合一区二区| 不卡一区二区在线|