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

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

?? csl_emac.c

?? 合眾達的開發板自帶測試程序
?? C
?? 第 1 頁 / 共 4 頁
字號:
    if( localDev.Config.ModeFlags & EMAC_CONFIG_MODEFLG_PASSCONTROL )
        EMAC_FSETS( RXMBPENABLE, RXCMFEN, ENABLE );

    /* Set the channel configuration to priority if requested */
    if( localDev.Config.ModeFlags & EMAC_CONFIG_MODEFLG_CHPRIORITY )
        EMAC_FSETS( MACCONTROL, TXPTYPE, CHANNELPRI );

    /* Set MAC loopback if requested */
    if( localDev.Config.ModeFlags & EMAC_CONFIG_MODEFLG_MACLOOPBACK )
        EMAC_FSETS( MACCONTROL, LOOPBACK, ENABLE );

    /*
    // Enable TX and RX channel interrupts (set mask bits)
    // Enable Host interrupts
    */
    EMAC_RSET( RXINTMASKCLEAR, 0xFF );
    EMAC_RSET( TXINTMASKCLEAR, 0xFF );
    EMAC_RSET( RXINTMASKSET, 1 );
    for(i=0; i<localDev.Config.TxChannels; i++)
        EMAC_RSET( TXINTMASKSET, (1<<i) );
    EMAC_RSET( MACINTMASKSET, EMAC_FMK(MACINTMASKSET,HOSTERRINT,1) |
                              EMAC_FMK(MACINTMASKSET,STATINT,1) );


    /*
    // Setup Receive Buffers
    */

    /*
    // We give the first descriptors to RX The rest of the descriptors
    // will be divided evenly among the TX channels. Odds are this
    // will leave TX with a very large number of TX descriptors, but
    // we'll only use what we need (driven from the application send
    // requests). The RX descriptors are always kept fully populated.
    */

    /* Pointer to first descriptor to use on RX */
    pDesc = (EMAC_Desc *)_EMAC_DSC_BASE_ADDR;

    /* Number of descriptors for RX channel */
    utemp1 = localDev.Config.RxMaxPktPool;

    /* Init Rx */
    localDev.RxCh.pd         = &localDev;
    localDev.RxCh.DescMax    = utemp1;
    localDev.RxCh.pDescFirst = pDesc;
    localDev.RxCh.pDescLast  = pDesc + (utemp1 - 1);
    localDev.RxCh.pDescRead  = pDesc;
    localDev.RxCh.pDescWrite = pDesc;

    /* Fill the descriptor table */
    emacEnqueueRx( &localDev.RxCh, 0 );

    /*
    // If we didn't get the number of descriptor buffers that the
    // application said we should, then the app lied to us. This is
    // bad because we'll be constantly calling to the app to fill
    // up our buffers. So we'll close now to make the problem
    // obvious.
    */
    if( localDev.RxCh.DescCount < utemp1 )
    {
        /* Free all RX descriptors */
        while( pPkt = pqPop( &localDev.RxCh.DescQueue ) )
            (*localDev.Config.pfcbFreePacket)(localDev.hApplication, pPkt);

        /* Close the MDIO Module */
        MDIO_close( localDev.hMDIO );

        /* Return the error condition */
        return( EMAC_ERROR_INVALID );
    }

    /*
    // Setup Transmit Buffers
    */

    /* Pointer to first descriptor to use on TX */
    pDesc += utemp1;

    /* Number of descriptors (max) per channel */
    utemp1 = (_EDMA_DSC_ENTRY_COUNT-utemp1)/localDev.Config.TxChannels;

    /* Init all TX channels in use */
    for( i=0; i<(int)localDev.Config.TxChannels; i++)
    {
        localDev.TxCh[i].pd         = &localDev;
        localDev.TxCh[i].DescMax    = utemp1;
        localDev.TxCh[i].pDescFirst = pDesc;
        localDev.TxCh[i].pDescLast  = pDesc + (utemp1 - 1);
        localDev.TxCh[i].pDescRead  = pDesc;
        localDev.TxCh[i].pDescWrite = pDesc;

        pDesc += utemp1;
    }


    /*
    // Enable RX, TX, and MII
    //
    // Note in full duplex mode we also need to set the FULLDUPLEX
    // bit in MACCRONTROL. However, we don't know what to set until
    // we have a link. Also, we must be able to dynamically change
    // this bit if the cable is unplugged and re-linked with a different
    // duplex.
    */
    EMAC_FSETS( TXCONTROL, TXEN, ENABLE );
    EMAC_FSETS( RXCONTROL, RXEN, ENABLE );
    EMAC_FSETS( MACCONTROL, MIIEN, ENABLE );

    /* Startup RX */
    EMAC_RSET( RX0HDP, (Uint32)localDev.RxCh.pDescRead );

    /* Validate the device handle */
    localDev.DevMagic = EMAC_DEVMAGIC;

    /* Set the open flag */
    openFlag = 1;

    /* Give a handle back to the caller */
    *phEMAC = &localDev;

    /* Enable global interrupt in wrapper */
    EMAC_FSETS( EWCTL, INTEN, ENABLE );

    /* Return Success */
    return( 0 );
}


/*-----------------------------------------------------------------------*\
* EMAC_close()
*
* Closed the EMAC peripheral indicated by the supplied instance handle.
* When called, the EMAC device will shutdown both send and receive
* operations, and free all pending transmit and receive packets.
*
* The function returns zero on success, or an error code on failure.
*
* Possible error code include:
*   EMAC_ERROR_INVALID   - A calling parameter is invalid
*
\*-----------------------------------------------------------------------*/
uint EMAC_close( Handle hEMAC )
{
    EMAC_Device  *pd = (EMAC_Device *)hEMAC;
    Uint32      i,tmp;
    EMAC_Pkt     *pPkt;

    /* Validate our handle */
    if( !pd || pd->DevMagic != EMAC_DEVMAGIC )
        return( EMAC_ERROR_INVALID );

    /* Disable EMAC/MDIO interrupts in wrapper */
    EMAC_FSETS( EWCTL, INTEN, DISABLE );

    /*
    // The close process consists of tearing down all the active
    // channels (RX and TX) and then waiting for the teardown
    // complete indication from the MAC. Then, all queued packets
    // will be returned.
    */

        /* Teardown RX */
        EMAC_RSET( RXTEARDOWN, 0 );

        /* Teardown TX channels in use */
    for( i=0; i<pd->Config.TxChannels; i++)
        EMAC_RSET( TXTEARDOWN, i );

    /* Only check teardown status if there was no fatal error         */
    /* Otherwise; the EMAC is halted and can抰 be shutdown gracefully */
    if( !pd->FatalError )
        {
        /* Wait for the teardown to complete */
        for( tmp=0; tmp!=0xFFFFFFFC; tmp=EMAC_RGET(RX0INTACK) );
        EMAC_RSET( RX0INTACK, tmp );

            for( i=0; i<pd->Config.TxChannels; i++ )
        {
            for( tmp=0; tmp!=0xFFFFFFFC; tmp=EMAC_RGETI(TXINTACK,i) );
            EMAC_RSETI( TXINTACK, i, tmp );
        }
    }

    /* Disable RX, TX, and Clear MACCONTROL */
    EMAC_FSETS( TXCONTROL, TXEN, DISABLE );
    EMAC_FSETS( RXCONTROL, RXEN, DISABLE );
    EMAC_RSET( MACCONTROL, 0 );

    /* Free all RX buffers */
    while( pPkt = pqPop( &pd->RxCh.DescQueue ) )
        (*pd->Config.pfcbFreePacket)(localDev.hApplication, pPkt);

    /* Free all TX buffers */
    for( i=0; i<pd->Config.TxChannels; i++)
    {
        while( pPkt = pqPop( &pd->TxCh[i].DescQueue ) )
            (*pd->Config.pfcbFreePacket)(localDev.hApplication, pPkt);
        while( pPkt = pqPop( &pd->TxCh[i].WaitQueue ) )
            (*pd->Config.pfcbFreePacket)(localDev.hApplication, pPkt);
    }

    /* Close the MDIO Module */
    MDIO_close( pd->hMDIO );

    /* Invalidate the EMAC handle */
    pd->DevMagic = 0;

    /* Clear the open flag */
    openFlag = 0;

    /* Exit with interrupts still disabled in the wrapper */
    return(0);
}


/*-----------------------------------------------------------------------*\
* EMAC_getStatus()
*
* Called to get the current status of the device. The device status
* is copied into the supplied data structure.
*
* The function returns zero on success, or an error code on failure.
*
* Possible error code include:
*   EMAC_ERROR_INVALID   - A calling parameter is invalid
*
\*-----------------------------------------------------------------------*/
uint EMAC_getStatus( Handle hEMAC, EMAC_Status *pStatus )
{
    EMAC_Device  *pd = (EMAC_Device *)hEMAC;
    uint        i,tmp;

    /* Validate our handle */
    if( !pd || pd->DevMagic != EMAC_DEVMAGIC || !pStatus )
        return( EMAC_ERROR_INVALID );

    /* Get the MDIO status */
    MDIO_getStatus(pd->hMDIO, &pStatus->PhyDev, &pStatus->MdioLinkStatus );

    /* Number of rx packets held */
    pStatus->RxPktHeld = pd->RxCh.DescCount;

    /* Number of tx packets held */
    tmp = 0;
    for( i=0; i<pd->Config.TxChannels; i++)
    {
        tmp += pd->TxCh[i].DescCount;
        tmp += pd->TxCh[i].WaitQueue.Count;
    }
    pStatus->TxPktHeld = tmp;

    /* Fatal error value */
    pStatus->FatalError = pd->FatalError;

    return(0);
}


/*-----------------------------------------------------------------------*\
* EMAC_setReceiveFilter()
*
* Called to set the packet filter for received packets. The filtering
* level is inclusive, so BROADCAST would include both BROADCAST and
* DIRECTED (UNICAST) packets.
*
* Available filtering modes include the following:
*  EMAC_RXFILTER_NOTHING      - Receive nothing
*  EMAC_RXFILTER_DIRECT       - Receive only Unicast to local MAC addr
*  EMAC_RXFILTER_BROADCAST    - Receive direct and Broadcast
*  EMAC_RXFILTER_MULTICAST    - Receive above plus multicast in mcast list
*  EMAC_RXFILTER_ALLMULTICAST - Receive above plus all multicast
*  EMAC_RXFILTER_ALL          - Receive all packets
*
* Note that if error frames and control frames are desired, reception of
* these must be specified in the device configuration.
*
* The function returns zero on success, or an error code on failure.
*
* Possible error code include:
*   EMAC_ERROR_INVALID   - A calling parameter is invalid
*
\*-----------------------------------------------------------------------*/
uint EMAC_setReceiveFilter( Handle hEMAC, uint ReceiveFilter )
{
    EMAC_Device  *pd = (EMAC_Device *)hEMAC;

    /* Validate our handle */
    if( !pd || pd->DevMagic != EMAC_DEVMAGIC || ReceiveFilter > EMAC_RXFILTER_ALL )
        return( EMAC_ERROR_INVALID );

    /*
    // The following code relies on the numberic relation of the filter
    // value such that the higher filter values receive more types of
    // packets.
    */

    /* Disable Section */
    if( ReceiveFilter < EMAC_RXFILTER_ALL )
        EMAC_FSETS( RXMBPENABLE, RXCAFEN, DISABLE );
    if( ReceiveFilter < EMAC_RXFILTER_ALLMULTICAST )
    {
        EMAC_RSET( MACHASH1, pd->MacHash1 );
        EMAC_RSET( MACHASH2, pd->MacHash2 );
    }
    if( ReceiveFilter < EMAC_RXFILTER_MULTICAST )
        EMAC_FSETS( RXMBPENABLE, MULTEN, DISABLE );
    if( ReceiveFilter < EMAC_RXFILTER_BROADCAST )
        EMAC_FSETS( RXMBPENABLE, BROADEN, DISABLE );
    if( ReceiveFilter < EMAC_RXFILTER_DIRECT )
        EMAC_RSET( RXUNICASTCLEAR, 1 );

    /* Enable Section */
    if( ReceiveFilter >= EMAC_RXFILTER_DIRECT )
        EMAC_RSET( RXUNICASTSET, 1 );
    if( ReceiveFilter >= EMAC_RXFILTER_BROADCAST )
        EMAC_FSETS( RXMBPENABLE, BROADEN, ENABLE );
    if( ReceiveFilter >= EMAC_RXFILTER_MULTICAST )
        EMAC_FSETS( RXMBPENABLE, MULTEN, ENABLE );
    if( ReceiveFilter >= EMAC_RXFILTER_ALLMULTICAST )
    {
        EMAC_RSET( MACHASH1, 0xffffffff );
        EMAC_RSET( MACHASH1, 0xffffffff );
    }
    if( ReceiveFilter == EMAC_RXFILTER_ALL )
        EMAC_FSETS( RXMBPENABLE, RXCAFEN, ENABLE );

    pd->RxFilter = ReceiveFilter;
    return(0);
}


/*-----------------------------------------------------------------------*\
* EMAC_getReceiveFilter()
*
* Called to get the current packet filter setting for received packets.
* The filter values are the same as those used in EMAC_setReceiveFilter().
*
* The current filter value is writter to the pointer supplied in
* pReceiveFilter.
*
* The function returns zero on success, or an error code on failure.
*
* Possible error code include:
*   EMAC_ERROR_INVALID   - A calling parameter is invalid
*
\*-----------------------------------------------------------------------*/
uint EMAC_getReceiveFilter( Handle hEMAC, uint *pReceiveFilter )
{
    EMAC_Device  *pd = (EMAC_Device *)hEMAC;

    /* Validate our handle */
    if( !pd || pd->DevMagic != EMAC_DEVMAGIC || !pReceiveFilter )
        return( EMAC_ERROR_INVALID );

    *pReceiveFilter = pd->RxFilter;
    return(0);
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人听书哪个软件好| 国产精品一区2区| 日韩理论电影院| 国产欧美一区二区精品婷婷| 欧美精品一区二区三区四区 | 欧美日韩在线免费视频| 波多野结衣中文字幕一区| 成人小视频免费在线观看| 国产99久久久久久免费看农村| 韩国v欧美v日本v亚洲v| 国产精品自拍三区| 成人一区二区三区视频| 99免费精品视频| 91麻豆蜜桃一区二区三区| 色国产综合视频| 欧美剧在线免费观看网站 | 国产精品资源网| 国产真实乱偷精品视频免| 国产成人午夜高潮毛片| 99久久精品99国产精品| 日本久久一区二区| 欧美一区二区三区人| 精品盗摄一区二区三区| 国产精品国产三级国产aⅴ中文| ...中文天堂在线一区| 亚洲国产精品一区二区久久| 免费成人结看片| 国产精品99久久不卡二区| 91老师片黄在线观看| 欧美精品aⅴ在线视频| 精品国产乱码久久久久久浪潮| 国产欧美精品在线观看| 亚洲专区一二三| 国产在线精品免费| 色天使色偷偷av一区二区| 日韩欧美国产精品一区| 国产精品成人一区二区艾草| 丝袜美腿亚洲色图| 成人av电影在线网| 欧美一级欧美三级| 一区二区在线观看免费 | 国产无人区一区二区三区| 亚洲美女精品一区| 国产一区二区三区四区五区入口| 色综合天天性综合| 精品av久久707| 一区二区三区在线视频免费| 精品在线一区二区三区| 91麻豆免费观看| 久久精品一区二区| 蜜臀av性久久久久蜜臀aⅴ四虎 | 日韩激情av在线| www.av精品| 久久精品亚洲精品国产欧美| 亚洲一级二级在线| 97精品久久久午夜一区二区三区 | 青青草91视频| 在线观看不卡一区| 亚洲欧洲日韩一区二区三区| 国产曰批免费观看久久久| 4438亚洲最大| 亚洲国产日产av| 一本久久a久久免费精品不卡| 久久亚洲春色中文字幕久久久| 亚洲一区免费观看| 色94色欧美sute亚洲13| 亚洲色欲色欲www| 本田岬高潮一区二区三区| 久久嫩草精品久久久精品一| 男人的j进女人的j一区| 欧美一区三区四区| 日韩av网站免费在线| 欧美高清视频一二三区 | 美国毛片一区二区三区| 精品视频一区二区不卡| 亚洲第一成人在线| 69成人精品免费视频| 日韩av网站免费在线| 在线播放视频一区| 青青草国产成人av片免费| 欧美一级搡bbbb搡bbbb| 男男成人高潮片免费网站| 欧美一级高清片| 久久99在线观看| 久久综合色8888| www.视频一区| 亚洲精品久久久久久国产精华液| 色屁屁一区二区| 偷拍日韩校园综合在线| 日韩美女一区二区三区| 国产一区欧美日韩| 国产精品美女久久久久久2018| 99久久精品国产一区| 亚洲一级二级在线| 日韩欧美国产成人一区二区| 国产真实精品久久二三区| 亚洲欧洲精品一区二区三区不卡| 91丝袜国产在线播放| 视频在线观看国产精品| 久久综合色天天久久综合图片| 高清日韩电视剧大全免费| 亚洲女爱视频在线| 91精品国产综合久久精品性色| 精品一二线国产| **性色生活片久久毛片| 制服.丝袜.亚洲.另类.中文| 国产精品中文字幕日韩精品| 亚洲乱码国产乱码精品精可以看| 欧美精品久久天天躁| 激情久久久久久久久久久久久久久久| 日本一区二区三区dvd视频在线| 色悠悠亚洲一区二区| 日韩成人一级片| 亚洲欧美在线高清| 91精品国产乱码久久蜜臀| 国产精品亚洲一区二区三区在线| 亚洲精品中文在线影院| 久久色中文字幕| 欧美午夜一区二区三区| 国产91在线观看| 日韩高清不卡一区二区| 国产精品欧美极品| 精品美女在线观看| 91精品1区2区| 国产.欧美.日韩| 久久99蜜桃精品| 亚洲最新在线观看| 中文字幕在线播放不卡一区| 欧美一区二区三区色| 91行情网站电视在线观看高清版| 精品一二线国产| 日韩黄色免费电影| 日韩毛片精品高清免费| 久久午夜国产精品| 日韩欧美亚洲国产另类| 在线观看免费一区| 成人avav在线| 成人久久久精品乱码一区二区三区| 秋霞午夜av一区二区三区| 一区二区高清免费观看影视大全| 国产欧美视频在线观看| 欧美va亚洲va香蕉在线| 在线成人av影院| 欧美日韩免费一区二区三区视频| 97久久精品人人爽人人爽蜜臀| 国产精品一区在线| 久久99精品国产麻豆婷婷洗澡| 性做久久久久久久免费看| 亚洲免费观看高清完整版在线观看熊 | 欧美喷潮久久久xxxxx| 欧美在线观看视频一区二区三区| 懂色av中文字幕一区二区三区| 久久aⅴ国产欧美74aaa| 另类小说图片综合网| 午夜精品影院在线观看| 亚洲小少妇裸体bbw| 亚洲成人午夜影院| 亚洲图片自拍偷拍| 丝袜亚洲精品中文字幕一区| 亚洲成av人**亚洲成av**| 亚洲国产中文字幕在线视频综合| 亚洲综合一区二区三区| 亚洲国产欧美日韩另类综合 | 成人精品免费网站| 成人免费av网站| 色婷婷久久99综合精品jk白丝| 99视频有精品| 色偷偷久久一区二区三区| 在线一区二区三区做爰视频网站| 在线免费不卡视频| 欧美亚洲精品一区| 欧美片网站yy| 2020国产精品| 中文字幕乱码一区二区免费| 欧美国产1区2区| 亚洲三级电影网站| 日韩高清在线电影| 国产高清精品在线| 91网站视频在线观看| 欧美老肥妇做.爰bbww视频| 精品欧美乱码久久久久久1区2区| 久久精品视频免费观看| 亚洲美女在线国产| 蜜臀精品久久久久久蜜臀| 国产黄色精品视频| 91黄色免费观看| 久久久综合视频| 亚洲综合色视频| 国产综合色产在线精品| 91丨九色丨国产丨porny| 欧美高清视频不卡网| 久久久欧美精品sm网站| 亚洲精品国产视频| 久久国产精品免费| 色综合中文综合网| 国产一区二区调教| 91香蕉视频污在线| 日韩欧美在线网站| 亚洲天堂久久久久久久| 日本欧美加勒比视频|