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

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

?? emac.c

?? IAR5.2下 AT91SAM9260 ARM 對 MCP2515 控制源化碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
                              | AT91C_EMAC_HRESP;

}

//-----------------------------------------------------------------------------
/// Get the statstic information & reset it
/// \param pStats   Pointer to EmacStats structure to copy the informations
/// \param reset    Reset the statistics after copy it
//-----------------------------------------------------------------------------
void EMAC_GetStatistics(EmacStats *pStats, unsigned char reset)
{
    unsigned int ncrBackup = 0;

    trace_LOG(trace_DEBUG, "EMAC_GetStatistics\n\r");

    // Sanity check
    if (pStats == (EmacStats *) 0) {
        return;
    }

    ncrBackup = AT91C_BASE_EMAC->EMAC_NCR & (AT91C_EMAC_TE | AT91C_EMAC_RE);

    // Disable TX/RX
    AT91C_BASE_EMAC->EMAC_NCR = ncrBackup & ~(AT91C_EMAC_TE | AT91C_EMAC_RE);

    // Copy the informations
    memcpy(pStats, (void*)&EmacStatistics, sizeof(EmacStats));

    // Reset the statistics
    if (reset) {
        memset((void*)&EmacStatistics, 0x00, sizeof(EmacStats));
        AT91C_BASE_EMAC->EMAC_NCR = ncrBackup | AT91C_EMAC_CLRSTAT;
    }

    // restore NCR
    AT91C_BASE_EMAC->EMAC_NCR = ncrBackup;
}

//-----------------------------------------------------------------------------
/// Send a packet with EMAC.
/// If the packet size is larger than transfer buffer size error returned.
/// \param buffer   The buffer to be send
/// \param size     The size of buffer to be send
/// \param fEMAC_TxCallback Threshold Wakeup callback
/// \param fWakeUpCb   TX Wakeup
/// \return         OK, Busy or invalid packet
//-----------------------------------------------------------------------------
unsigned char EMAC_Send(void *pBuffer,
                        unsigned int size,
                        EMAC_TxCallback fEMAC_TxCallback)
{
    volatile EmacTxTDescriptor *pTxTd;
    volatile EMAC_TxCallback   *pTxCb;

    //trace_LOG(trace_DEBUG, "EMAC_Send\n\r");

    // Check parameter
    if (size > EMAC_TX_UNITSIZE) {

        trace_LOG(trace_ERROR, "-E- EMAC driver does not split send packets.");
        trace_LOG(trace_ERROR, " It can send %d bytes max in one packet (%u bytes requested)\n\r",
            EMAC_TX_UNITSIZE, size);
        return EMAC_TX_INVALID_PACKET;
    }

    // If no free TxTd, buffer can't be sent, schedule the wakeup callback
    if( CIRC_SPACE(txTd.head, txTd.tail, TX_BUFFERS) == 0) {
        return EMAC_TX_BUFFER_BUSY;

    }

    // Pointers to the current TxTd
    pTxTd = txTd.td + txTd.head;
    pTxCb = txTd.txCb + txTd.head;

    // Sanity check
    ASSERT((pTxTd->status & EMAC_TX_USED_BIT) != 0,
        "-F- Buffer is still under EMAC control\n\r");

    // Setup/Copy data to transmition buffer
    if (pBuffer && size) {
        // Driver manage the ring buffer
        memcpy((void *)pTxTd->addr, pBuffer, size);
    }

    // Tx Callback
    *pTxCb = fEMAC_TxCallback;

    // Update TD status
    // The buffer size defined is length of ethernet frame
    // so it's always the last buffer of the frame.
    if (txTd.head == TX_BUFFERS-1) {
        pTxTd->status =
            (size & EMAC_LENGTH_FRAME) | EMAC_TX_LAST_BUFFER_BIT | EMAC_TX_WRAP_BIT;
    }
    else {
        pTxTd->status = (size & EMAC_LENGTH_FRAME) | EMAC_TX_LAST_BUFFER_BIT;
    }

    CIRC_INC(txTd.head, TX_BUFFERS)

    // Tx packets count
    EmacStatistics.tx_packets++;

    // Now start to transmit if it is not already done
    AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_TSTART;

    return EMAC_TX_OK;
}

//-----------------------------------------------------------------------------
/// Receive a packet with EMAC
/// If not enough buffer for the packet, the remaining data is lost but right
/// frame length is returned.
/// \param pFrame           Buffer to store the frame
/// \param frameSize        Size of the frame
/// \param pRcvSize         Received size
/// \return                 OK, no data, or frame too small
//-----------------------------------------------------------------------------
unsigned char EMAC_Poll(unsigned char *pFrame,
                        unsigned int frameSize,
                        unsigned int *pRcvSize)
{
    unsigned short bufferLength;
    unsigned int   tmpFrameSize=0;
    unsigned char  *pTmpFrame=0;
    unsigned int   tmpIdx = rxTd.idx;
    volatile EmacRxTDescriptor *pRxTd = rxTd.td + rxTd.idx;

    ASSERT(pFrame, "F: EMAC_Poll\n\r");

    char isFrame = 0;
    // Set the default return value
    *pRcvSize = 0;

    // Process received RxTd
    while ((pRxTd->addr & EMAC_RX_OWNERSHIP_BIT) == EMAC_RX_OWNERSHIP_BIT) {

        // A start of frame has been received, discard previous fragments
        if ((pRxTd->status & EMAC_RX_SOF_BIT) == EMAC_RX_SOF_BIT) {
            // Skip previous fragment
            while (tmpIdx != rxTd.idx) {
                pRxTd = rxTd.td + rxTd.idx;
                pRxTd->addr &= ~(EMAC_RX_OWNERSHIP_BIT);
                CIRC_INC(rxTd.idx, RX_BUFFERS);
            }
            // Reset the temporary frame pointer
            pTmpFrame = pFrame;
            tmpFrameSize = 0;
            // Start to gather buffers in a frame
            isFrame = 1;
        }

        // Increment the pointer
        CIRC_INC(tmpIdx, RX_BUFFERS);

        // Copy data in the frame buffer
        if (isFrame) {
            if (tmpIdx == rxTd.idx) {
                trace_LOG(trace_INFO,
                    "I: no EOF (Invalid of buffers too small)\n\r");

                do {

                    pRxTd = rxTd.td + rxTd.idx;
                    pRxTd->addr &= ~(EMAC_RX_OWNERSHIP_BIT);
                    CIRC_INC(rxTd.idx, RX_BUFFERS);
                } while(tmpIdx != rxTd.idx);
                return EMAC_RX_NO_DATA;
            }
            // Copy the buffer into the application frame
            bufferLength = EMAC_RX_UNITSIZE;
            if ((tmpFrameSize + bufferLength) > frameSize) {
                bufferLength = frameSize - tmpFrameSize;
            }

            memcpy(pTmpFrame, (void*)(pRxTd->addr & EMAC_ADDRESS_MASK), bufferLength);
            pTmpFrame += bufferLength;
            tmpFrameSize += bufferLength;

            // An end of frame has been received, return the data
            if ((pRxTd->status & EMAC_RX_EOF_BIT) == EMAC_RX_EOF_BIT) {
                // Frame size from the EMAC
                *pRcvSize = (pRxTd->status & EMAC_LENGTH_FRAME);

                // Application frame buffer is too small all data have not been copied
                if (tmpFrameSize < *pRcvSize) {
                    printf("size req %u size allocated %u\n\r", *pRcvSize, frameSize);

                    return EMAC_RX_FRAME_SIZE_TOO_SMALL;
                }

                trace_LOG(trace_INFO, "packet %d-%u (%u)\n\r", rxTd.idx, tmpIdx, *pRcvSize);
                // All data have been copied in the application frame buffer => release TD
                while (rxTd.idx != tmpIdx) {
                    pRxTd = rxTd.td + rxTd.idx;
                    pRxTd->addr &= ~(EMAC_RX_OWNERSHIP_BIT);
                    CIRC_INC(rxTd.idx, RX_BUFFERS);
                }
                EmacStatistics.rx_packets++;
                return EMAC_RX_OK;
            }
        }

        // SOF has not been detected, skip the fragment
        else {
           pRxTd->addr &= ~(EMAC_RX_OWNERSHIP_BIT);
           rxTd.idx = tmpIdx;
        }

        // Process the next buffer
        pRxTd = rxTd.td + tmpIdx;
    }

    //trace_LOG(trace_DEBUG, "E");
    return EMAC_RX_NO_DATA;
}

//-----------------------------------------------------------------------------
/// Registers pRxCb callback. Callback will be invoked after the next received
/// frame.
/// When EMAC_Poll() returns EMAC_RX_NO_DATA the application task call EMAC_Set_RxCb()
/// to register pRxCb() callback and enters suspend state. The callback is in charge
/// to resume the task once a new frame has been received. The next time EMAC_Poll()
/// is called, it will be successfull.
/// \param pRxCb            Pointer to callback function
//-----------------------------------------------------------------------------
void EMAC_Set_RxCb(EMAC_RxCallback pRxCb)
{
    rxTd.rxCb = pRxCb;
    AT91C_BASE_EMAC->EMAC_IER = AT91C_EMAC_RCOMP;
}

//-----------------------------------------------------------------------------
/// Remove the RX callback function.
/// This function is usually invoked from the RX callback itself. Once the callback
/// has resumed the application task, there is no need to invoke the callback again.
//-----------------------------------------------------------------------------
void EMAC_Clear_RxCb(void)
{
    AT91C_BASE_EMAC->EMAC_IDR = AT91C_EMAC_RCOMP;
    rxTd.rxCb = (EMAC_RxCallback) 0;
}

//-----------------------------------------------------------------------------
/// Registers TX wakeup callback callback. Callback will be invoked once several
/// transfer descriptors are available.
/// When EMAC_Send() returns EMAC_TX_BUFFER_BUSY (all TD busy) the application
/// task calls EMAC_Set_TxWakeUpCb() to register pTxWakeUpCb() callback and
/// enters suspend state. The callback is in charge to resume the task once
/// several TD have been released. The next time EMAC_Send() will be called, it
/// shall be successfull.
/// \param pTxWakeUpCb   Pointer to callback function
/// \param threshold     Minimum number of available transfer descriptors before pTxWakeUpCb() is invoked
/// \return              0= success, 1 = threshold exceeds nuber of transfer descriptors
//-----------------------------------------------------------------------------
char EMAC_Set_TxWakeUpCb(EMAC_WakeupCallback pTxWakeUpCb, unsigned short threshold)
{
    if (threshold <= TX_BUFFERS) {
        txTd.wakeupCb = pTxWakeUpCb;
        txTd.wakeupThreshold = threshold;
        return 0;
    }
    return 1;
}

//-----------------------------------------------------------------------------
/// Remove the TX wakeup callback function.
/// This function is usually invoked from the TX wakeup callback itself. Once the callback
/// has resumed the application task, there is no need to invoke the callback again.
//-----------------------------------------------------------------------------
void EMAC_Clear_TxWakeUpCb(void)
{
    txTd.wakeupCb = (EMAC_WakeupCallback) 0;
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久国产人妖系列| 日韩国产欧美视频| 久久天天做天天爱综合色| 欧美日韩精品欧美日韩精品一 | 3751色影院一区二区三区| 91极品视觉盛宴| 欧美日韩在线播放三区四区| 91福利精品视频| 欧美精品v国产精品v日韩精品| 欧美性xxxxxxxx| 制服丝袜在线91| 久久久精品黄色| 国产精品国产三级国产aⅴ中文| 国产精品久久久久毛片软件| 一区二区三区在线观看动漫| 视频一区在线视频| 麻豆精品蜜桃视频网站| 成人小视频免费观看| 91豆麻精品91久久久久久| 在线综合亚洲欧美在线视频| 欧美精品一区二区在线观看| 日韩一区欧美小说| 三级一区在线视频先锋 | 午夜一区二区三区视频| 久久精品国产99久久6| 成人激情视频网站| 欧美午夜精品久久久| 精品三级在线看| 成人欧美一区二区三区小说| 日本不卡在线视频| 成人高清av在线| 欧美蜜桃一区二区三区| 国产精品美女久久福利网站| 亚洲一本大道在线| 国产毛片精品国产一区二区三区| 色婷婷激情久久| 日韩欧美国产1| 亚洲精品美腿丝袜| 美女脱光内衣内裤视频久久网站| 99国产欧美久久久精品| 欧美二区三区的天堂| 国产精品短视频| 亚洲成人av一区| 国产精品亚洲一区二区三区在线 | av成人老司机| 欧美一二区视频| 亚洲色图欧美激情| 精品无码三级在线观看视频| 91国在线观看| 国产精品激情偷乱一区二区∴| 天堂成人国产精品一区| 粉嫩13p一区二区三区| 欧美日韩高清一区二区| 亚洲手机成人高清视频| 国产一区二区三区免费| 在线播放/欧美激情| 亚洲精品欧美激情| jvid福利写真一区二区三区| 精品欧美一区二区久久| 图片区小说区国产精品视频| 在线视频亚洲一区| 日韩伦理av电影| 成人精品免费看| 国产日产欧产精品推荐色| 久久国产夜色精品鲁鲁99| 欧美一区二区三区在线观看视频 | 久久99精品国产91久久来源| 欧美日韩在线播放三区四区| 一区二区三区在线免费观看| 91小视频在线免费看| 国产精品成人免费| 成人黄色av网站在线| 国产精品伦一区二区三级视频| 国产黑丝在线一区二区三区| 久久久久久久久岛国免费| 经典一区二区三区| 2021久久国产精品不只是精品| 免费成人在线网站| 精品国产91九色蝌蚪| 国产一区二区导航在线播放| 久久久久99精品一区| 国产一区二区三区在线看麻豆| 欧美变态凌虐bdsm| 国产一区二区三区精品视频| 精品国产乱码久久久久久久久| 久久激五月天综合精品| 久久新电视剧免费观看| a美女胸又www黄视频久久| **性色生活片久久毛片| 欧美日韩一区二区三区不卡| 亚洲18影院在线观看| 日韩欧美三级在线| 国产精品77777| 一区二区三区在线免费观看| 69p69国产精品| 国产麻豆成人精品| 国产精品国产三级国产普通话三级| 91麻豆swag| 久久国产免费看| 1024精品合集| 欧美一级欧美一级在线播放| 国产一区二区三区久久久| 亚洲免费观看在线观看| 欧美一区二区在线观看| 国产成人夜色高潮福利影视| 亚洲激情五月婷婷| 欧美不卡123| 91麻豆.com| 国内久久精品视频| 亚洲成人午夜电影| 国产日韩欧美精品电影三级在线| 99精品热视频| 蜜臀久久99精品久久久久久9| 国产精品乱人伦一区二区| 欧美老肥妇做.爰bbww| 国产精品1024| 五月激情六月综合| 国产欧美一区二区精品婷婷| 欧美日韩精品一区视频| www.爱久久.com| 精品无人码麻豆乱码1区2区| 亚洲sss视频在线视频| 国产婷婷精品av在线| 欧美精品v国产精品v日韩精品| 91亚洲国产成人精品一区二区三| 捆绑调教一区二区三区| 亚洲成人tv网| 洋洋av久久久久久久一区| 久久精品免视看| 欧美刺激脚交jootjob| 欧美天天综合网| 91免费国产视频网站| 国产成人综合视频| 久久se精品一区二区| 日本人妖一区二区| 午夜视频久久久久久| 亚洲自拍另类综合| 一区二区三区鲁丝不卡| 国产精品污污网站在线观看| 欧美www视频| 日韩精品中文字幕一区| 日韩三级电影网址| 91精品国产色综合久久久蜜香臀| 色国产综合视频| 欧美性猛交xxxx乱大交退制版| 91免费小视频| 91在线免费播放| 色综合久久99| 欧美亚洲日本一区| 91福利在线免费观看| 91行情网站电视在线观看高清版| 91蜜桃网址入口| 在线观看日韩精品| 欧美日免费三级在线| 欧美日韩国产高清一区二区三区 | 老司机一区二区| 精品一区二区在线观看| 韩国女主播成人在线观看| 国内精品免费在线观看| 国产精品一区专区| 成人av中文字幕| 99国产欧美另类久久久精品| 欧美影院精品一区| 欧美久久久久久久久久| 这里只有精品视频在线观看| 日韩一区二区在线观看视频| 久久美女高清视频| 国产精品色眯眯| 亚洲一区二区三区在线播放| 天天av天天翘天天综合网色鬼国产| 午夜视频一区二区| 精品一区二区在线视频| 成人免费视频网站在线观看| 91视频xxxx| 91精品久久久久久久久99蜜臂| 精品免费国产一区二区三区四区| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 欧美精品欧美精品系列| 日韩免费性生活视频播放| 中文字幕av资源一区| 一区二区三区产品免费精品久久75| 亚洲成人av一区二区三区| 国内精品免费在线观看| 91女厕偷拍女厕偷拍高清| 欧美一区二区视频在线观看2022| 久久久久久久久久久99999| 亚洲色图欧洲色图| 精品一区二区三区免费播放| jlzzjlzz欧美大全| 91精品婷婷国产综合久久竹菊| 久久伊99综合婷婷久久伊| 亚洲精品乱码久久久久久久久| 免费高清在线视频一区·| 一本色道a无线码一区v| 精品久久五月天| 一区二区成人在线视频| 国产一区日韩二区欧美三区| 欧美日本国产视频| 中文字幕一区二区三中文字幕 | 国产亚洲自拍一区|