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

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

?? llserial.c

?? dm642網絡傳輸程序
?? C
字號:
//--------------------------------------------------------------------------
// IP Stack
//--------------------------------------------------------------------------
// llSerial.c
//
// Serial Port Driver
//
// Author: Michael A. Denio
// Copyright 2001, 2003 by Texas Instruments Inc.
//-------------------------------------------------------------------------
#include <stkmain.h>
#include "llserial.h"

//--------------------------------------------------------------------
// PUBLIC FUNCTIONS USED FOR INTIALIZATION AND EVENTS
//--------------------------------------------------------------------
#define MAX_INSTANCE    1

static uint     SerDevCount = 0;        // Number of Devices
static SDINFO   sdi[MAX_INSTANCE];      // Private Info about devices

//--------------------------------------------------------------------
// PUBLIC FUNCTIONS USED BY NETCTRL
//--------------------------------------------------------------------

//--------------------------------------------------------------------
// _llSerialInit()
//
// Opens the serial driver environment and enumerates devices
//--------------------------------------------------------------------
uint _llSerialInit(STKEVENT_Handle hEvent)
{
    int i;

    //
    // Initialize the serial driver(s)
    //
    SerDevCount = HwSerInit();

    if( SerDevCount > MAX_INSTANCE )
        SerDevCount = MAX_INSTANCE;

    //
    // Initialize SDINFO for each driver instance
    //
    for(i=0; i<SerDevCount; i++)
    {
        mmZeroInit( &sdi[i], sizeof( SDINFO ) );

        // Set physical index
        sdi[i].PhysIdx = i;

        // Set event object handle
        sdi[i].hEvent = hEvent;

        // Set a default operating mode
        sdi[i].Baud     = 9600;
        sdi[i].Mode     = HAL_SERIAL_MODE_8N1;
        sdi[i].FlowCtrl = HAL_SERIAL_FLOWCTRL_NONE;
    }

    return( SerDevCount );
}

//--------------------------------------------------------------------
// _llSerialShutdown()
//
// Called to shutdown serial driver environment
//--------------------------------------------------------------------
void _llSerialShutdown()
{
    uint   dev;

    llEnter();
    // To be safe, close all open devices
    for( dev=0; dev<SerDevCount; dev++ )
    {
        // Zap the HDLC handle
        sdi[dev].hHDLC = 0;

        // Zap callbacks
        sdi[dev].cbRx = 0;
        sdi[dev].cbTimer = 0;
        sdi[dev].cbInput = 0;

        // Close the driver if open
        if( sdi[dev].Open )
            HwSerClose( &sdi[dev] );
    }
    llExit();

    SerDevCount = 0;
    HwSerShutdown();
}

//--------------------------------------------------------------------
// _llSerialServiceCheck()
//
// Called to check for HDLC/Charmode activity and
// feed character mode data to application callback
//--------------------------------------------------------------------
void _llSerialServiceCheck( uint fTimerTick )
{
    uint   dev,mask;
    SDINFO *psdi;
    UINT8  c;

    // Poll devices and callback for character mode
    // receive. Then call the HDLC timer callback (if any)
    for( dev=0; dev<SerDevCount; dev++ )
    {
        psdi = &sdi[dev];

        // Allow low level driver to poll
        _HwSerPoll( psdi, fTimerTick );

        // If charmode data available, handle it
        while( psdi->CharCount )
        {
            // Read char from buffer
            mask = OEMSysCritOn();
            c = psdi->CharBuf[psdi->CharReadIdx++];
            if( psdi->CharReadIdx == CHAR_MAX )
                psdi->CharReadIdx = 0;
            psdi->CharCount--;
            OEMSysCritOff(mask);

            // Give char to application (if any)
            if( psdi->cbRx )
                (*psdi->cbRx)( (char) c );
        }

        // If open in HDLC mode and timer tick, then call the
        // timer callback function on one second intervals
        if( psdi->cbTimer && fTimerTick && (++psdi->Ticks >= 10) )
        {
            psdi->Ticks = 0;
            llEnter();
            (*psdi->cbTimer)( psdi->hHDLC );
            llExit();
        }
    }
}

//--------------------------------------------------------------------
// _llSerialSend( uint dev, UINT8 *pBuf, uint len )
//
// Send a block of data in character mode
//
// Returns the number of characters queued onto the send buffer
//--------------------------------------------------------------------
uint  _llSerialSend(uint dev, UINT8 *pBuf, uint len)
{
    PBM_Handle  hPkt;

    // Our device index is "1" based to the upper layers
    dev--;
    if( dev >= SerDevCount )
        return(0);

    // If open in HDLC mode, we can't send any character mode data
    if( sdi[dev].hHDLC )
        return(0);

    // Create a packet for this data
    hPkt = PBM_alloc( len );
    if( !hPkt )
        return(0);

    // Copy the data to send
    mmCopy( PBM_getDataBuffer(hPkt), pBuf, len );

    // Set the length and offset
    PBM_setValidLen( hPkt, len );
    PBM_setDataOffset( hPkt, 0 );

    llEnter();
    llSerialSendPkt( dev+1, hPkt );
    llExit();

    return( len );
}

//--------------------------------------------------------------------
// PUBLIC FUNCTIONS USED BY THE STACK
//--------------------------------------------------------------------

//--------------------------------------------------------------------
// llSerialOpen(uint dev, void (*cbInput)(char c))
//
// Opens the device for charater mode. The device can be
// be open for both character and HDLC mode simultaneously
//--------------------------------------------------------------------
uint llSerialOpen(uint dev, void (*cbInput)(char c))
{
    // Our device index is "1" based to the upper layers
    dev--;
    if( dev >= SerDevCount )
        return(0);

    // Init charmode callback
    sdi[dev].cbRx = cbInput;

    // If already open, just return
    if( ++sdi[dev].Open > 1 )
        return(1);
    // Else call low-level open function if not already open
    else
        return( (sdi[dev].Open = HwSerOpen(&sdi[dev])) );
}

//--------------------------------------------------------------------
// llSerialClose( uint dev )
//
// Close the device
//--------------------------------------------------------------------
void llSerialClose( uint dev )
{
    // Our device index is "1" based to the upper layers
    dev--;
    if( dev >= SerDevCount )
        return;

    // Zap the charmode callback
    sdi[dev].cbRx = 0;

    // Close the driver
    if( sdi[dev].Open && !--sdi[dev].Open )
        HwSerClose( &sdi[dev] );
}

//--------------------------------------------------------------------
// llSerialOpenHDLC()
//
// Opens the device for HDLC mode. The device can be
// be open for both character and HDLC mode simultaneously
//--------------------------------------------------------------------
uint  llSerialOpenHDLC( uint dev, HANDLE hHDLC,
                        void (*cbTimer)(HANDLE h),
                        void (*cbInput)(PBM_Handle hPkt) )
{
    // Our device index is "1" based to the upper layers
    dev--;
    if( dev >= SerDevCount )
        return(0);

    // Init Logical Device
    sdi[dev].hHDLC = hHDLC;

    // Init callbacks
    sdi[dev].cbTimer = cbTimer;
    sdi[dev].cbInput = cbInput;

    // Set the peer map to a safe default
    sdi[dev].PeerMap = 0xFFFFFFFF;

    // If already open, just return
    if( ++sdi[dev].Open > 1 )
        return(1);
    // Else call low-level open function if not already open
    else
        return( (sdi[dev].Open = HwSerOpen(&sdi[dev])) );
}

//--------------------------------------------------------------------
// llSerialCloseHDLC()
//
// Close the device for charater mode.
//--------------------------------------------------------------------
void llSerialCloseHDLC( uint dev )
{
    PBM_Handle hPkt;

    // Our device index is "1" based to the upper layers
    dev--;
    if( dev >= SerDevCount )
        return;

    // Zap the HDLC handle
    sdi[dev].hHDLC = 0;

    // Zap callbacks
    sdi[dev].cbTimer = 0;
    sdi[dev].cbInput = 0;

    // Flush the RX packet queue
    while( (hPkt = PBMQ_deq(&(sdi[dev].PBMQ_rx))) )
        PBM_free( hPkt );

    // Close the driver
    if( sdi[dev].Open && !--sdi[dev].Open )
        HwSerClose( &sdi[dev] );
}

//--------------------------------------------------------------------
// llSerialSendPkt()
//
// Called to send data in packet form.
//--------------------------------------------------------------------
void  llSerialSendPkt( uint dev, PBM_Handle hPkt )
{
    // Our device index is "1" based to the upper layers
    dev--;
    if( dev >= SerDevCount )
        return;

    if( hPkt )
    {
        PBMQ_enq( &(sdi[dev].PBMQ_tx), hPkt );

        if( sdi[dev].TxFree )
            HwSerTxNext( &(sdi[dev]) );
    }
    else
        PBM_free( hPkt );
}

//--------------------------------------------------------------------
// llSerialHDLCPeerMap( uint dev, UINT32 peerMap )
//
// Called to update the sending peer map.
//--------------------------------------------------------------------
void  llSerialHDLCPeerMap( uint dev, UINT32 peerMap )
{
    // Our device index is "1" based to the upper layers
    dev--;

    if( dev < SerDevCount )
        sdi[dev].PeerMap = peerMap;
}

//--------------------------------------------------------------------
// void llSerialService()
//
// Called to pass up HDLC packets to their input callback functions.
//--------------------------------------------------------------------
void llSerialService()
{
    uint       dev;
    PBM_Handle hPkt;
    SDINFO     *psdi;

    // Service all the drivers
    for( dev=0; dev<SerDevCount; dev++ )
    {
        psdi = &sdi[dev];

        // Give all queued packets to the callback function
        while( (hPkt = PBMQ_deq(&psdi->PBMQ_rx)) )
        {
            if( psdi->cbInput )
                psdi->cbInput( hPkt );
            else
                PBM_free( hPkt );
        }
    }
}

//--------------------------------------------------------------------
// llSerialConfig()
//
// Called to configure the serial port baud rate and mode
//--------------------------------------------------------------------
void llSerialConfig( uint dev, uint baud, uint mode, uint flowctrl )
{
    // Our device index is "1" based to the upper layers
    dev--;
    if( dev >= SerDevCount )
        return;

    // Set baud and mode
    sdi[dev].Baud     = baud;
    sdi[dev].Mode     = mode;
    sdi[dev].FlowCtrl = flowctrl;

    // If the driver is open, update the settings
    if( sdi[dev].Open )
        HwSerSetConfig( &sdi[dev] );
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人福利在线看| 久久精品亚洲国产奇米99| 欧美视频一区二区三区四区| 欧美精品在线一区二区三区| 91精品国产91热久久久做人人| 久久亚洲精品国产精品紫薇| 久久奇米777| 欧美激情一区二区三区全黄| 亚洲影视在线观看| 日韩国产在线观看一区| 国内久久精品视频| 男女激情视频一区| 国产精品123区| 在线看一区二区| 欧美一级黄色录像| 中文字幕一区二区三区色视频| 亚洲另类色综合网站| 天天亚洲美女在线视频| 国模套图日韩精品一区二区 | 五月婷婷激情综合| 美女mm1313爽爽久久久蜜臀| 99r精品视频| 9191久久久久久久久久久| 久久精品视频免费观看| 亚洲蜜臀av乱码久久精品| 日韩精品一区第一页| 国产一区激情在线| 91麻豆高清视频| 精品福利一区二区三区免费视频| 久久久久97国产精华液好用吗| 一区二区三区丝袜| 国产在线国偷精品免费看| 91免费观看在线| 精品国产99国产精品| 亚洲欧美在线视频观看| 精品一区二区在线免费观看| 91丨porny丨在线| 26uuu亚洲综合色| 亚洲国产精品视频| 国产成人精品aa毛片| 欧美一级片在线| 中文字幕一区二区三区精华液| 久久99精品久久只有精品| 91美女片黄在线观看91美女| 7777精品久久久大香线蕉| 欧美国产精品中文字幕| 亚欧色一区w666天堂| 91在线观看污| 日韩视频中午一区| 亚洲第一久久影院| av中文字幕在线不卡| 精品国产污污免费网站入口 | 亚洲欧洲另类国产综合| 免费成人美女在线观看.| 色噜噜久久综合| 久久青草国产手机看片福利盒子 | 欧美日韩国产在线播放网站| 久久久99久久| 中文字幕一区二区视频| 国产精品456| 欧美一区二区视频观看视频 | 欧美午夜精品久久久久久孕妇| 久久久久久9999| 狠狠色狠狠色综合日日91app| 欧美吞精做爰啪啪高潮| 亚洲欧美欧美一区二区三区| 国产一区在线不卡| 欧美精品欧美精品系列| 亚洲高清在线精品| 91蜜桃免费观看视频| ...av二区三区久久精品| 激情欧美日韩一区二区| 日韩三级在线观看| 亚洲国产一区二区在线播放| 欧美午夜精品一区| 亚洲精品高清在线| 国产老妇另类xxxxx| 久久久蜜桃精品| 久久成人免费网| 精品国产乱码久久| 麻豆一区二区在线| 日韩精品在线看片z| 青青草国产成人99久久| 91精品国模一区二区三区| 亚洲成人手机在线| 欧美三级韩国三级日本三斤| 一区二区日韩电影| 99v久久综合狠狠综合久久| 国产精品不卡在线| 91国产成人在线| 亚洲欧美一区二区三区极速播放| 色呦呦日韩精品| 亚洲精品免费看| 91免费国产在线观看| 亚洲va欧美va人人爽| 欧美男同性恋视频网站| 久久精品国产99久久6| 日韩一级免费观看| 国产精品一区二区久久精品爱涩| 精品久久久久久久一区二区蜜臀| 偷拍日韩校园综合在线| 日韩一区二区精品葵司在线 | 精品国产伦一区二区三区免费 | 国产欧美日韩中文久久| 国内精品久久久久影院薰衣草 | 久久综合久色欧美综合狠狠| 国产精品亚洲人在线观看| 国产亚洲综合在线| 99久久国产综合精品色伊| 亚洲欧洲制服丝袜| 欧美一区二区视频在线观看2020 | 91麻豆精品国产91| 日韩极品在线观看| 精品国产髙清在线看国产毛片| 国内成+人亚洲+欧美+综合在线| 国产欧美一区二区精品性 | 欧美日韩一区二区三区高清| 蜜臀国产一区二区三区在线播放| 精品国产伦一区二区三区观看体验| 国产成人精品一区二| 亚洲视频1区2区| 欧美一区二区播放| 国产成人精品影院| 亚洲一级不卡视频| 日韩三级免费观看| 六月婷婷色综合| 亚洲精品精品亚洲| 91 com成人网| 国产福利不卡视频| 亚洲制服丝袜av| 精品久久久久久久久久久久包黑料| 国产成人在线看| 亚洲影视在线观看| 久久精品夜色噜噜亚洲aⅴ| 99在线精品视频| 精品一区二区三区在线播放视频| 中文幕一区二区三区久久蜜桃| 99精品久久只有精品| 免费的成人av| 国产欧美综合在线观看第十页 | 一区在线中文字幕| 日韩免费电影一区| 99re这里都是精品| 精品在线免费观看| 亚洲最新在线观看| 日韩亚洲欧美一区二区三区| 成人黄色大片在线观看| 亚洲狼人国产精品| 中文字幕不卡三区| 欧美日本视频在线| 一本到一区二区三区| 麻豆精品在线播放| 亚洲国产精品嫩草影院| 91麻豆精品国产91久久久使用方法 | 国产亚洲制服色| 色国产综合视频| 国产精品小仙女| 石原莉奈在线亚洲二区| 亚洲美女电影在线| 久久综合九色综合欧美亚洲| 欧美日韩国产免费一区二区| youjizz久久| 精品一区二区三区免费观看| 亚洲午夜视频在线观看| 欧美激情资源网| 欧美成人vps| 欧美年轻男男videosbes| 91麻豆福利精品推荐| 蜜桃久久精品一区二区| 首页国产欧美久久| 亚洲男人天堂av网| 亚洲特级片在线| 国产日韩欧美精品综合| 久久久国产午夜精品| 在线91免费看| 欧美日韩亚洲丝袜制服| 91免费视频网| 成人福利在线看| 国产精品99精品久久免费| 久久精品国产第一区二区三区| 亚洲黄色小说网站| 日韩理论在线观看| 亚洲图片激情小说| 国产欧美一区二区精品性色 | 国产精品一区二区不卡| 久久成人麻豆午夜电影| 首页综合国产亚洲丝袜| 亚洲1区2区3区4区| 一区二区三区中文字幕在线观看| 亚洲天堂福利av| 国产精品美女久久久久aⅴ | 成人一区在线观看| 成人a免费在线看| 国产成人超碰人人澡人人澡| 高清国产一区二区三区| 高潮精品一区videoshd| 成人的网站免费观看| 国产999精品久久久久久| 99这里都是精品| www.一区二区|