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

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

?? emac.c

?? IAR5.2下 AT91SAM9260 ARM 對 MCP2515 控制源化碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* ----------------------------------------------------------------------------
 *         ATMEL Microcontroller Software Support
 * ----------------------------------------------------------------------------
 * Copyright (c) 2008, Atmel Corporation
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the disclaimer below.
 *
 * Atmel's name may not be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * ----------------------------------------------------------------------------
 */

//-----------------------------------------------------------------------------
//         Headers
//-----------------------------------------------------------------------------
#include <board.h>
#include "emac.h"
#include <utility/trace.h>
#include <utility/assert.h>
#include <string.h>

//------------------------------------------------------------------------------
//         Definitions
//------------------------------------------------------------------------------
/// The buffer addresses written into the descriptors must be aligned so the
/// last few bits are zero.  These bits have special meaning for the EMAC
/// peripheral and cannot be used as part of the address.
#define EMAC_ADDRESS_MASK   ((unsigned int)0xFFFFFFFC)
#define EMAC_LENGTH_FRAME   ((unsigned int)0x0FFF)    /// Length of frame mask

// receive buffer descriptor bits
#define EMAC_RX_OWNERSHIP_BIT   (1UL <<  0)
#define EMAC_RX_WRAP_BIT        (1UL <<  1)
#define EMAC_RX_SOF_BIT         (1UL << 14)
#define EMAC_RX_EOF_BIT         (1UL << 15)

// Transmit buffer descriptor bits
#define EMAC_TX_LAST_BUFFER_BIT (1UL << 15)
#define EMAC_TX_WRAP_BIT        (1UL << 30)
#define EMAC_TX_USED_BIT        (1UL << 31)

//-----------------------------------------------------------------------------
// Circular buffer management
//-----------------------------------------------------------------------------
// Return count in buffer
#define CIRC_CNT(head,tail,size) (((head) - (tail)) & ((size)-1))

// Return space available, 0..size-1
// We always leave one free char as a completely full buffer
// has head == tail, which is the same as empty
#define CIRC_SPACE(head,tail,size) CIRC_CNT((tail),((head)+1),(size))

// Return count up to the end of the buffer.
// Carefully avoid accessing head and tail more than once,
// so they can change underneath us without returning inconsistent results
#define CIRC_CNT_TO_END(head,tail,size) \
   ({int end = (size) - (tail); \
     int n = ((head) + end) & ((size)-1); \
     n < end ? n : end;})

// Return space available up to the end of the buffer
#define CIRC_SPACE_TO_END(head,tail,size) \
   ({int end = (size) - 1 - (head); \
     int n = (end + (tail)) & ((size)-1); \
     n <= end ? n : end+1;})

// Increment head or tail
#define CIRC_INC(headortail,size) \
        headortail++;             \
        if(headortail >= size) {  \
            headortail = 0;       \
        }

#define CIRC_EMPTY(circ)     ((circ)->head == (circ)->tail)
#define CIRC_CLEAR(circ)     ((circ)->head = (circ)->tail = 0)


//------------------------------------------------------------------------------
//      Structures
//------------------------------------------------------------------------------
#ifdef __ICCARM__          // IAR
#pragma pack(4)            // IAR
#define __attribute__(...) // IAR
#endif                     // IAR
/// Describes the type and attribute of Receive Transfer descriptor.
typedef struct _EmacRxTDescriptor {
    unsigned int addr;
    unsigned int status;
} __attribute__((packed, aligned(8))) EmacRxTDescriptor, *PEmacRxTDescriptor;

/// Describes the type and attribute of Transmit Transfer descriptor.
typedef struct _EmacTxTDescriptor {
    unsigned int addr;
    unsigned int status;
} __attribute__((packed, aligned(8))) EmacTxTDescriptor, *PEmacTxTDescriptor;
#ifdef __ICCARM__          // IAR
#pragma pack()             // IAR
#endif                     // IAR

/// Descriptors for RX (required aligned by 8)
typedef struct {
   volatile EmacRxTDescriptor td[RX_BUFFERS];
   EMAC_RxCallback rxCb; /// Callback function to be invoked once a frame has been received
   unsigned short idx;
} RxTd;

/// Descriptors for TX (required aligned by 8)
typedef struct {
   volatile EmacTxTDescriptor td[TX_BUFFERS];
   EMAC_TxCallback txCb[TX_BUFFERS];    /// Callback function to be invoked once TD has been processed
   EMAC_WakeupCallback wakeupCb;        /// Callback function to be invoked once several TD have been released
   unsigned short wakeupThreshold; /// Number of free TD before wakeupCb is invoked
   unsigned short head;            /// Circular buffer head pointer incremented by the upper layer (buffer to be sent)
   unsigned short tail;            /// Circular buffer head pointer incremented by the IT handler (buffer sent)
} TxTd;

//------------------------------------------------------------------------------
//         Internal variables
//------------------------------------------------------------------------------
// Receive Transfer Descriptor buffer
#ifdef __ICCARM__          // IAR
#pragma data_alignment=8   // IAR
#endif                     // IAR
static volatile RxTd rxTd;
// Transmit Transfer Descriptor buffer
#ifdef __ICCARM__          // IAR
#pragma data_alignment=8   // IAR
#endif                     // IAR
static volatile TxTd txTd;
/// Send Buffer
// Section 3.6 of AMBA 2.0 spec states that burst should not cross 1K Boundaries.
// Receive buffer manager writes are burst of 2 words => 3 lsb bits of the address shall be set to 0
#ifdef __ICCARM__          // IAR
#pragma data_alignment=8   // IAR
#endif                     // IAR
static volatile unsigned char pTxBuffer[TX_BUFFERS * EMAC_TX_UNITSIZE] __attribute__((aligned(8)));

#ifdef __ICCARM__          // IAR
#pragma data_alignment=8   // IAR
#endif                     // IAR
/// Receive Buffer
static volatile unsigned char pRxBuffer[RX_BUFFERS * EMAC_RX_UNITSIZE] __attribute__((aligned(8)));
/// Statistics
static volatile EmacStats EmacStatistics;

//-----------------------------------------------------------------------------
//         Internal functions
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
/// Wait PHY operation complete.
/// Return 1 if the operation completed successfully.
/// May be need to re-implemented to reduce CPU load.
/// \param retry: the retry times, 0 to wait forever until complete.
//-----------------------------------------------------------------------------
static unsigned char EMAC_WaitPhy( unsigned int retry )
{
    unsigned int retry_count = 0;

    while((AT91C_BASE_EMAC->EMAC_NSR & AT91C_EMAC_IDLE) == 0) {

        // Dead LOOP!
        if (retry == 0) {

            continue;
        }

        // Timeout check
        retry_count++;
        if(retry_count >= retry) {

            trace_LOG(trace_ERROR, "E: Wait PHY time out\n\r");
            return 0;
        }
    }

    return 1;
}

//-----------------------------------------------------------------------------
//         Exported functions
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//          PHY management functions
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
/// Set MDC clock according to current board clock. Per 802.3, MDC should be
/// less then 2.5MHz.
/// Return 1 if successfully, 0 if MDC clock not found.
//-----------------------------------------------------------------------------
unsigned char EMAC_SetMdcClock( unsigned int mck )
{
    int clock_dividor;

    if (mck <= 20000000) {
        clock_dividor = AT91C_EMAC_CLK_HCLK_8;          /// MDC clock = MCK/8
    }
    else if (mck <= 40000000) {
        clock_dividor = AT91C_EMAC_CLK_HCLK_16;         /// MDC clock = MCK/16
    }
    else if (mck <= 80000000) {
        clock_dividor = AT91C_EMAC_CLK_HCLK_32;         /// MDC clock = MCK/32
    }
    else if (mck <= 160000000) {
        clock_dividor = AT91C_EMAC_CLK_HCLK_64;         /// MDC clock = MCK/64
    }
    else {
        trace_LOG(trace_ERROR, "E: No valid MDC clock.\n\r");
        return 0;
    }
    AT91C_BASE_EMAC->EMAC_NCFGR = (AT91C_BASE_EMAC->EMAC_NCFGR & (~AT91C_EMAC_CLK))
                                 | clock_dividor;
    return 1;
}

//-----------------------------------------------------------------------------
/// Enable MDI with PHY
//-----------------------------------------------------------------------------
void EMAC_EnableMdio( void )
{
    AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_MPE;
}

//-----------------------------------------------------------------------------
/// Enable MDI with PHY
//-----------------------------------------------------------------------------
void EMAC_DisableMdio( void )
{
    AT91C_BASE_EMAC->EMAC_NCR &= ~AT91C_EMAC_MPE;
}

//-----------------------------------------------------------------------------
/// Enable MII mode for EMAC, called once after autonegotiate
//-----------------------------------------------------------------------------
void EMAC_EnableMII( void )
{
    AT91C_BASE_EMAC->EMAC_USRIO = AT91C_EMAC_CLKEN;
}

//-----------------------------------------------------------------------------
/// Enable RMII mode for EMAC, called once after autonegotiate
//-----------------------------------------------------------------------------
void EMAC_EnableRMII( void )
{
    AT91C_BASE_EMAC->EMAC_USRIO = AT91C_EMAC_CLKEN | AT91C_EMAC_RMII;
}

//-----------------------------------------------------------------------------
/// Read PHY register.
/// Return 1 if successfully, 0 if timeout.
/// \param PhyAddress PHY Address
/// \param Address Register Address
/// \param pValue Pointer to a 32 bit location to store read data
/// \param retry The retry times, 0 to wait forever until complete.
//-----------------------------------------------------------------------------
unsigned char EMAC_ReadPhy(unsigned char PhyAddress,
                           unsigned char Address,
                           unsigned int *pValue,
                           unsigned int retry)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品丝袜中出| 国产精品白丝在线| 国产农村妇女毛片精品久久麻豆| 国产精品久久久久天堂| 亚洲国产精品久久艾草纯爱 | 亚洲成人免费av| 国产精品 欧美精品| 在线观看亚洲精品视频| 欧美韩国一区二区| 精品在线观看视频| 欧美午夜一区二区三区| 综合电影一区二区三区| 国产一区中文字幕| 欧美精品一卡二卡| 亚洲国产中文字幕| 91首页免费视频| 国产欧美日韩另类一区| 国内精品写真在线观看| 在线成人av网站| 三级不卡在线观看| 欧美日韩国产小视频在线观看| 国产精品国产馆在线真实露脸| 韩国av一区二区三区在线观看| 制服丝袜中文字幕亚洲| 亚洲线精品一区二区三区八戒| 91视频免费看| 一区二区三区日韩精品| 91麻豆福利精品推荐| 国产精品网站一区| av电影天堂一区二区在线观看| 国产香蕉久久精品综合网| 狠狠色丁香久久婷婷综合_中| 制服丝袜亚洲色图| 免费观看成人av| 日韩欧美一级二级三级| 日韩精品色哟哟| 91精品国产综合久久久蜜臀图片 | 亚洲免费三区一区二区| 91麻豆蜜桃一区二区三区| 亚洲精选视频在线| 欧美日韩一区不卡| 欧美aaa在线| 国产亚洲精久久久久久| 成人免费视频免费观看| 国产精品高潮呻吟久久| 色88888久久久久久影院按摩 | 欧美丰满少妇xxxbbb| 免费成人在线影院| 久久精品一区蜜桃臀影院| proumb性欧美在线观看| 亚洲精品大片www| 在线播放视频一区| 国产黄色91视频| 亚洲日穴在线视频| 3d动漫精品啪啪1区2区免费| 国产在线播放一区三区四| 国产精品对白交换视频| 欧美日本一道本在线视频| 免费不卡在线观看| 中文字幕成人av| 欧美日韩国产另类一区| 国产一区二区三区免费看 | 92精品国产成人观看免费| 亚洲国产日韩av| 久久久午夜电影| 在线观看一区日韩| 韩国av一区二区三区四区| 一区二区在线观看免费视频播放| 欧美久久久久久久久| 床上的激情91.| 天堂午夜影视日韩欧美一区二区| 久久综合网色—综合色88| 91丨porny丨户外露出| 日韩不卡一区二区| 亚洲欧美偷拍三级| 精品日韩一区二区| 欧美在线不卡一区| 国产美女精品人人做人人爽| 亚洲午夜私人影院| 国产精品久久久久久亚洲毛片 | 久久影院午夜论| 97久久精品人人爽人人爽蜜臀| 亚洲成a人片综合在线| 国产视频视频一区| 91精品欧美一区二区三区综合在| www.亚洲色图.com| 黄页视频在线91| 日日夜夜一区二区| 亚洲美女屁股眼交3| 中文字幕不卡在线观看| 欧美一级高清片| 欧美在线free| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 欧美v国产在线一区二区三区| 色哟哟国产精品免费观看| 国产福利电影一区二区三区| 蜜桃视频在线观看一区二区| 亚洲一区在线视频| 成人欧美一区二区三区黑人麻豆| 国产欧美日本一区二区三区| 日韩欧美一级精品久久| 欧美理论片在线| 欧美亚洲自拍偷拍| 色综合天天狠狠| 91视视频在线观看入口直接观看www | 国产精品免费网站在线观看| 日韩欧美中文一区| 日韩一级视频免费观看在线| 欧美日韩久久一区二区| 欧美性生活大片视频| 91视频在线看| 91麻豆国产福利在线观看| www.欧美色图| av一区二区久久| jiyouzz国产精品久久| 高清成人免费视频| 国产成人精品午夜视频免费| 国产精品12区| www.亚洲色图| 一本色道**综合亚洲精品蜜桃冫| 9人人澡人人爽人人精品| 波多野结衣精品在线| www.亚洲激情.com| 色欧美88888久久久久久影院| 99视频精品全部免费在线| 一本久道久久综合中文字幕 | 精品一区二区免费视频| 麻豆成人久久精品二区三区红 | 精品系列免费在线观看| 九九热在线视频观看这里只有精品| 日本美女视频一区二区| 国产真实乱偷精品视频免| 日本韩国一区二区三区| 欧美亚洲另类激情小说| 91精品国产一区二区| 日韩一本二本av| 国产日韩欧美一区二区三区综合| 国产精品素人视频| 一级日本不卡的影视| 麻豆精品久久精品色综合| 国产剧情一区在线| 日本韩国一区二区三区视频| 777奇米成人网| 中文字幕免费观看一区| 亚洲一区中文在线| 国产一区二区影院| 色婷婷av一区二区| 久久久噜噜噜久久人人看| 亚洲女与黑人做爰| 激情图区综合网| 91免费看片在线观看| 日韩欧美一级片| 最新高清无码专区| 精品一区二区三区免费毛片爱| 99久久精品免费看国产免费软件| 91麻豆精品国产自产在线观看一区| 久久久天堂av| 日韩成人av影视| 99国产精品久久| 欧美xxxxxxxxx| 亚洲影视在线播放| 国产v日产∨综合v精品视频| 欧美精品黑人性xxxx| ...av二区三区久久精品| 日本成人超碰在线观看| 91日韩在线专区| 久久久国产一区二区三区四区小说 | 日韩成人dvd| 91精品办公室少妇高潮对白| 欧美精品一区二区三区蜜桃| 亚洲福利国产精品| 99久精品国产| 国产精品亲子伦对白| 蜜桃av一区二区| 色老汉av一区二区三区| 久久久久久夜精品精品免费| 午夜精品久久久久久| 成人av手机在线观看| 精品国产1区二区| 蜜臀久久99精品久久久久久9| 日本高清成人免费播放| 国产人成一区二区三区影院| 婷婷成人综合网| 色哟哟在线观看一区二区三区| 久久夜色精品一区| 久久国内精品视频| 欧美三级韩国三级日本三斤| 综合在线观看色| 成人高清在线视频| 中文字幕第一区二区| 国产91在线观看丝袜| 国产亚洲欧洲997久久综合| 久久99久久精品欧美| 日韩亚洲欧美在线| 奇米精品一区二区三区四区| 91精品欧美久久久久久动漫 | 一区二区三区精品在线观看| 99在线视频精品| 亚洲欧美色图小说| 色哟哟欧美精品|