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

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

?? cma230_serial.c

?? eCos操作系統源碼
?? C
字號:
//==========================================================================////      io/serial/arm/cma230_serial.c////      Cogent CMA230 Serial I/O Interface Module (interrupt driven)////==========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s):   gthomas// Contributors:  gthomas// Date:        1999-02-04// Purpose:     CMA230 Serial I/O module (interrupt driven version)// Description: ////####DESCRIPTIONEND####////==========================================================================#include <pkgconf/system.h>#include <pkgconf/io_serial.h>#include <pkgconf/io.h>#include <cyg/io/io.h>#include <cyg/hal/hal_intr.h>#include <cyg/io/devtab.h>#include <cyg/io/serial.h>#include <cyg/hal/hal_cma230.h>#include <cyg/infra/diag.h>#ifdef CYGPKG_IO_SERIAL_ARM_CMA230#include "cma230_serial.h"typedef struct cma230_serial_info {    CYG_ADDRWORD   base;    CYG_WORD       int_num;    cyg_interrupt  serial_interrupt;    cyg_handle_t   serial_interrupt_handle;} cma230_serial_info;static bool cma230_serial_init(struct cyg_devtab_entry *tab);static bool cma230_serial_putc(serial_channel *chan, unsigned char c);static Cyg_ErrNo cma230_serial_lookup(struct cyg_devtab_entry **tab,                                    struct cyg_devtab_entry *sub_tab,                                   const char *name);static unsigned char cma230_serial_getc(serial_channel *chan);static Cyg_ErrNo cma230_serial_set_config(serial_channel *chan, cyg_uint32 key,                                          const void *xbuf, cyg_uint32 *len);static void cma230_serial_start_xmit(serial_channel *chan);static void cma230_serial_stop_xmit(serial_channel *chan);static cyg_uint32 cma230_serial_ISR(cyg_vector_t vector, cyg_addrword_t data);static void       cma230_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data);static SERIAL_FUNS(cma230_serial_funs,                    cma230_serial_putc,                    cma230_serial_getc,                   cma230_serial_set_config,                   cma230_serial_start_xmit,                   cma230_serial_stop_xmit    );#ifdef CYGPKG_IO_SERIAL_ARM_CMA230_SERIAL_Astatic cma230_serial_info cma230_serial_info0 = {CMA101_DUARTA,                                                  CYGNUM_HAL_INTERRUPT_SERIAL_A};#if CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_A_BUFSIZE > 0static unsigned char cma230_serial_out_buf0[CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_A_BUFSIZE];static unsigned char cma230_serial_in_buf0[CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_A_BUFSIZE];static SERIAL_CHANNEL_USING_INTERRUPTS(cma230_serial_channel0,                                       cma230_serial_funs,                                        cma230_serial_info0,                                       CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_A_BAUD),                                       CYG_SERIAL_STOP_DEFAULT,                                       CYG_SERIAL_PARITY_DEFAULT,                                       CYG_SERIAL_WORD_LENGTH_DEFAULT,                                       CYG_SERIAL_FLAGS_DEFAULT,                                       &cma230_serial_out_buf0[0], sizeof(cma230_serial_out_buf0),                                       &cma230_serial_in_buf0[0], sizeof(cma230_serial_in_buf0)    );#elsestatic SERIAL_CHANNEL(cma230_serial_channel0,                      cma230_serial_funs,                       cma230_serial_info0,                      CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_A_BAUD),                      CYG_SERIAL_STOP_DEFAULT,                      CYG_SERIAL_PARITY_DEFAULT,                      CYG_SERIAL_WORD_LENGTH_DEFAULT,                      CYG_SERIAL_FLAGS_DEFAULT    );#endifDEVTAB_ENTRY(cma230_serial_io0,              CYGDAT_IO_SERIAL_ARM_CMA230_SERIAL_A_NAME,             0,                     // Does not depend on a lower level interface             &cyg_io_serial_devio,              cma230_serial_init,              cma230_serial_lookup,     // Serial driver may need initializing             &cma230_serial_channel0    );#endif //  CYGPKG_IO_SERIAL_ARM_CMA230_SERIAL_A#ifdef CYGPKG_IO_SERIAL_ARM_CMA230_SERIAL_Bstatic cma230_serial_info cma230_serial_info1 = {CMA101_DUARTB,                                                 CYGNUM_HAL_INTERRUPT_SERIAL_B};#if CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_B_BUFSIZE > 0static unsigned char cma230_serial_out_buf1[CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_B_BUFSIZE];static unsigned char cma230_serial_in_buf1[CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_B_BUFSIZE];static SERIAL_CHANNEL_USING_INTERRUPTS(cma230_serial_channel1,                                       cma230_serial_funs,                                        cma230_serial_info1,                                       CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_B_BAUD),                                       CYG_SERIAL_STOP_DEFAULT,                                       CYG_SERIAL_PARITY_DEFAULT,                                       CYG_SERIAL_WORD_LENGTH_DEFAULT,                                       CYG_SERIAL_FLAGS_DEFAULT,                                       &cma230_serial_out_buf1[0], sizeof(cma230_serial_out_buf1),                                       &cma230_serial_in_buf1[0], sizeof(cma230_serial_in_buf1)    );#elsestatic SERIAL_CHANNEL(cma230_serial_channel1,                      cma230_serial_funs,                       cma230_serial_info1,                      CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_CMA230_SERIAL_B_BAUD),                      CYG_SERIAL_STOP_DEFAULT,                      CYG_SERIAL_PARITY_DEFAULT,                      CYG_SERIAL_WORD_LENGTH_DEFAULT,                      CYG_SERIAL_FLAGS_DEFAULT    );#endifDEVTAB_ENTRY(cma230_serial_io1,              CYGDAT_IO_SERIAL_ARM_CMA230_SERIAL_B_NAME,             0,                     // Does not depend on a lower level interface             &cyg_io_serial_devio,              cma230_serial_init,              cma230_serial_lookup,     // Serial driver may need initializing             &cma230_serial_channel1    );#endif //  CYGPKG_IO_SERIAL_ARM_CMA230_SERIAL_B// Internal function to actually configure the hardware to desired baud rate, etc.static boolcma230_serial_config_port(serial_channel *chan, cyg_serial_info_t *new_config, bool init){    cma230_serial_info *cma230_chan = (cma230_serial_info *)chan->dev_priv;    volatile struct serial_port *port = (volatile struct serial_port *)cma230_chan->base;    unsigned short baud_divisor = select_baud[new_config->baud];    unsigned char _lcr, _ier;    if (baud_divisor == 0) return false;  // Invalid configuration    _ier = port->ier;    port->ier = 0;  // Disable port interrupts while changing hardware    _lcr = select_word_length[new_config->word_length - CYGNUM_SERIAL_WORD_LENGTH_5] |         select_stop_bits[new_config->stop] |        select_parity[new_config->parity];    port->lcr = _lcr;    port->lcr |= LCR_DL;    port->mdl = baud_divisor >> 8;    port->ldl = baud_divisor & 0xFF;    port->lcr &= ~LCR_DL;    if (init) {        port->fcr = 0x07;  // Enable and clear FIFO        if (chan->out_cbuf.len != 0) {            port->ier = IER_RCV;        } else {            port->ier = 0;        }        port->mcr = MCR_INT|MCR_DTR|MCR_RTS;  // Master interrupt enable    } else {        port->ier = _ier;    }    if (new_config != &chan->config) {        chan->config = *new_config;    }    return true;}// Function to initialize the device.  Called at bootstrap time.static bool cma230_serial_init(struct cyg_devtab_entry *tab){    serial_channel *chan = (serial_channel *)tab->priv;    cma230_serial_info *cma230_chan = (cma230_serial_info *)chan->dev_priv;#ifdef CYGDBG_IO_INIT    diag_printf("CMA230 SERIAL init - dev: %x.%d\n", cma230_chan->base, cma230_chan->int_num);#endif    (chan->callbacks->serial_init)(chan);  // Really only required for interrupt driven devices    if (chan->out_cbuf.len != 0) {        cyg_drv_interrupt_create(cma230_chan->int_num,                                 99,                     // Priority - what goes here?                                 (cyg_addrword_t)chan,   //  Data item passed to interrupt handler                                 cma230_serial_ISR,                                 cma230_serial_DSR,                                 &cma230_chan->serial_interrupt_handle,                                 &cma230_chan->serial_interrupt);        cyg_drv_interrupt_attach(cma230_chan->serial_interrupt_handle);        cyg_drv_interrupt_unmask(cma230_chan->int_num);    }    cma230_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 cma230_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 boolcma230_serial_putc(serial_channel *chan, unsigned char c){    cma230_serial_info *cma230_chan = (cma230_serial_info *)chan->dev_priv;    volatile struct serial_port *port = (volatile struct serial_port *)cma230_chan->base;    if (port->lsr & LSR_THE) {// Transmit buffer is empty        port->thr = c;        return true;    } else {// No space        return false;    }}// Fetch a character from the device input buffer, waiting if necessarystatic unsigned char cma230_serial_getc(serial_channel *chan){    unsigned char c;    cma230_serial_info *cma230_chan = (cma230_serial_info *)chan->dev_priv;    volatile struct serial_port *port = (volatile struct serial_port *)cma230_chan->base;    while ((port->lsr & LSR_RSR) == 0) ;   // Wait for char    c = port->rhr;    return c;}// Set up the device characteristics; baud rate, etc.static Cyg_ErrNocma230_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 != cma230_serial_config_port(chan, config, false) )            return -EINVAL;      }      break;    default:        return -EINVAL;    }    return ENOERR;}// Enable the transmitter on the devicestatic voidcma230_serial_start_xmit(serial_channel *chan){    cma230_serial_info *cma230_chan = (cma230_serial_info *)chan->dev_priv;    volatile struct serial_port *port = (volatile struct serial_port *)cma230_chan->base;    port->ier |= IER_XMT;  // Enable xmit interrupt}// Disable the transmitter on the devicestatic void cma230_serial_stop_xmit(serial_channel *chan){    cma230_serial_info *cma230_chan = (cma230_serial_info *)chan->dev_priv;    volatile struct serial_port *port = (volatile struct serial_port *)cma230_chan->base;    port->ier &= ~IER_XMT;  // Disable xmit interrupt}// Serial I/O - low level interrupt handler (ISR)static cyg_uint32 cma230_serial_ISR(cyg_vector_t vector, cyg_addrword_t data){    serial_channel *chan = (serial_channel *)data;    cma230_serial_info *cma230_chan = (cma230_serial_info *)chan->dev_priv;    cyg_drv_interrupt_mask(cma230_chan->int_num);    cyg_drv_interrupt_acknowledge(cma230_chan->int_num);    return CYG_ISR_CALL_DSR;  // Cause DSR to be run}// Serial I/O - high level interrupt handler (DSR)static void       cma230_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data){    serial_channel *chan = (serial_channel *)data;    cma230_serial_info *cma230_chan = (cma230_serial_info *)chan->dev_priv;    volatile struct serial_port *port = (volatile struct serial_port *)cma230_chan->base;    unsigned char isr;    isr = port->isr & 0x0E;    if (isr == ISR_Tx) {        (chan->callbacks->xmt_char)(chan);    } else if (isr == ISR_Rx) {        (chan->callbacks->rcv_char)(chan, port->rhr);    }    cyg_drv_interrupt_unmask(cma230_chan->int_num);}#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人综合亚洲网站| 国产成人在线色| 精品国产成人系列| 国产精品1区二区.| 国产精品国产a| 色94色欧美sute亚洲13| 蜜臂av日日欢夜夜爽一区| 久久精品日韩一区二区三区| 91免费国产视频网站| 免费在线观看成人| 国产精品久久久久久久久动漫 | 国产69精品久久久久777| 亚洲欧美国产三级| 欧美日韩dvd在线观看| 国产大陆a不卡| 亚洲三级电影网站| 欧美mv日韩mv| av电影在线观看不卡| 免费成人在线影院| 亚洲精品国产视频| 国产女人aaa级久久久级| 在线成人小视频| 99久久99久久久精品齐齐| 美女视频黄频大全不卡视频在线播放| 中文字幕一区视频| 久久久久久久久久久久久女国产乱| 色美美综合视频| 成人一区在线观看| 精品在线观看免费| 性欧美疯狂xxxxbbbb| 亚洲另类春色校园小说| 日本一区二区三区dvd视频在线| 欧美日韩国产在线观看| 91麻豆精品秘密| 精品亚洲成av人在线观看| 亚洲国产成人av| 中文字幕在线免费不卡| 久久日韩粉嫩一区二区三区| 91精品久久久久久蜜臀| 欧美视频在线一区二区三区 | 欧美激情一区二区三区四区| 91麻豆精品91久久久久同性| 色偷偷一区二区三区| 成人小视频免费观看| 国产精品911| 激情欧美日韩一区二区| 美腿丝袜亚洲色图| 免费成人在线网站| 首页国产丝袜综合| 亚洲成人第一页| 亚洲成av人片在www色猫咪| 亚洲美女免费在线| 国产视频一区不卡| 国产欧美1区2区3区| 亚洲精品一区二区三区蜜桃下载| 日韩欧美在线影院| 日韩精品一区二区三区在线| 欧美一区二区播放| 日韩免费看网站| 欧美精品一区二区三区蜜桃| 精品国产在天天线2019| 精品少妇一区二区| 久久久亚洲精品一区二区三区| 精品国产百合女同互慰| 精品成人免费观看| 国产精品网站一区| 欧美国产一区在线| 国产日本欧洲亚洲| 亚洲欧洲av一区二区三区久久| 久久久久亚洲蜜桃| 国产农村妇女精品| 国产精品视频九色porn| 一区二区视频在线看| 亚洲成人三级小说| 日韩二区在线观看| 国产精品白丝jk白祙喷水网站| 国产精品一区二区免费不卡 | 亚洲靠逼com| 亚洲一区二区三区四区中文字幕| 一级日本不卡的影视| 丝袜诱惑制服诱惑色一区在线观看 | 精品国产乱码久久久久久免费| 久久免费看少妇高潮| 国产精品女主播av| 亚洲成人av一区| 丝袜美腿亚洲综合| 久久电影网电视剧免费观看| 精品一区二区三区影院在线午夜 | 国产成人一级电影| 色老综合老女人久久久| 91麻豆精品国产91久久久| 国产亚洲欧美日韩日本| 一区二区三区精密机械公司| 美国毛片一区二区| 成人精品国产一区二区4080| 色偷偷久久人人79超碰人人澡| 3d动漫精品啪啪一区二区竹菊| www激情久久| 一区二区在线观看视频| 久久成人精品无人区| 色综合中文字幕国产| 91麻豆精品国产91久久久久久 | 亚洲成a人片综合在线| 国产一区二区精品久久| 色欧美片视频在线观看| 欧美videos中文字幕| 亚洲精品乱码久久久久久久久 | 久久精品一区二区三区不卡| 综合分类小说区另类春色亚洲小说欧美| 亚洲免费观看高清完整版在线| 免费看精品久久片| 一本一本久久a久久精品综合麻豆| 91精品啪在线观看国产60岁| 亚洲日本在线视频观看| 精品一区二区三区欧美| 精品视频在线免费| 国产精品乱码一区二三区小蝌蚪| 蜜桃av一区二区| 欧美日韩国产高清一区二区三区| 精品区一区二区| 亚洲一区二区三区视频在线| 懂色av一区二区三区蜜臀| 制服丝袜亚洲色图| 夜夜嗨av一区二区三区中文字幕 | 久久99精品国产麻豆婷婷| 91亚洲精品久久久蜜桃| 欧美一区二区三区成人| 一区二区视频免费在线观看| 国产酒店精品激情| 日韩三级.com| 亚洲电影激情视频网站| 91丝袜呻吟高潮美腿白嫩在线观看| 精品国产sm最大网站| 日韩高清不卡在线| 欧美日本一道本| 一区2区3区在线看| 在线一区二区三区四区| 中文字幕日本乱码精品影院| 国产精品夜夜爽| 久久蜜桃av一区精品变态类天堂| 日韩av中文字幕一区二区| 色呦呦国产精品| 国产精品久久久久久福利一牛影视| 看电影不卡的网站| 91精品国产欧美日韩| 日韩va亚洲va欧美va久久| 欧美精品色综合| 日韩国产欧美视频| 欧美一卡二卡在线| 日本欧美在线看| 日韩三级视频中文字幕| 麻豆成人av在线| 精品sm捆绑视频| 国产精品一区二区在线观看网站 | 国产福利一区二区三区视频| 欧美精品一区二区三区四区| 国产综合色精品一区二区三区| 日韩精品一区二区三区老鸭窝| 久久国产精品99久久人人澡| 精品国产一区二区三区忘忧草| 久久国产尿小便嘘嘘尿| 精品成人免费观看| 国v精品久久久网| 国产精品福利电影一区二区三区四区| 北条麻妃一区二区三区| wwwwww.欧美系列| 日本成人中文字幕在线视频| 亚洲人成在线播放网站岛国| 91麻豆国产精品久久| 日本色综合中文字幕| 中文字幕不卡在线播放| 欧美日韩高清一区| 国产精品一品视频| 亚洲国产一区二区三区青草影视 | 中文一区一区三区高中清不卡| 在线免费观看成人短视频| 免费的成人av| 亚洲欧美日韩人成在线播放| 7777精品伊人久久久大香线蕉 | 国产午夜亚洲精品羞羞网站| 99久久国产免费看| 日本视频中文字幕一区二区三区| 国产精品天美传媒沈樵| 69久久99精品久久久久婷婷| 成人网男人的天堂| 日韩国产精品大片| 综合av第一页| 日韩美女一区二区三区| 91论坛在线播放| 国产一区欧美一区| 亚洲一区在线观看视频| 国产日韩综合av| 日韩一级二级三级精品视频| 99国产一区二区三精品乱码| 激情综合五月婷婷| 亚洲成人tv网| 亚洲精品高清在线观看| 中文字幕不卡三区| 精品国产一区二区三区忘忧草| 欧美综合色免费|