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

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

?? dm9161.c

?? at91sam9260-ek library file
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* ----------------------------------------------------------------------------
 *         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.
 * ----------------------------------------------------------------------------
 */

// components/ethernet/dm9161/dm9161.c

//-----------------------------------------------------------------------------
//         Headers
//-----------------------------------------------------------------------------
#include "dm9161.h"
#include "dm9161_define.h"
#include <pio/pio.h>
#include <rstc/rstc.h>
#include <emac/emac.h>
#include <utility/trace.h>
#include <utility/assert.h>

//-----------------------------------------------------------------------------
//         Definitions
//-----------------------------------------------------------------------------

/// Default max retry count
#define DM9161_RETRY_MAX            100000



//-----------------------------------------------------------------------------
/// Dump all the useful registers
/// \param pDm          Pointer to the Dm9161 instance
//-----------------------------------------------------------------------------
static void DM9161_DumpRegisters(Dm9161 * pDm)
{
    unsigned char phyAddress;
    unsigned int retryMax;
    unsigned int value;

    trace_LOG(trace_DEBUG, "DM9161_DumpRegisters\n\r");
    ASSERT(pDm, "F: DM9161_DumpRegisters\n\r");

    EMAC_EnableMdio();
    phyAddress = pDm->phyAddress;
    retryMax = pDm->retryMax;

    trace_LOG(trace_INFO, "DM9161 (%d) Registers:\n\r", phyAddress);

    EMAC_ReadPhy(phyAddress, DM9161_BMCR, &value, retryMax);
    trace_LOG(trace_INFO, " _BMCR   : 0x%X\n\r", value);
    EMAC_ReadPhy(phyAddress, DM9161_BMSR, &value, retryMax);
    trace_LOG(trace_INFO, " _BMSR   : 0x%X\n\r", value);
    EMAC_ReadPhy(phyAddress, DM9161_ANAR, &value, retryMax);
    trace_LOG(trace_INFO, " _ANAR   : 0x%X\n\r", value);
    EMAC_ReadPhy(phyAddress, DM9161_ANLPAR, &value, retryMax);
    trace_LOG(trace_INFO, " _ANLPAR : 0x%X\n\r", value);
    EMAC_ReadPhy(phyAddress, DM9161_ANER, &value, retryMax);
    trace_LOG(trace_INFO, " _ANER   : 0x%X\n\r", value);
    EMAC_ReadPhy(phyAddress, DM9161_DSCR, &value, retryMax);
    trace_LOG(trace_INFO, " _DSCR   : 0x%X\n\r", value);
    EMAC_ReadPhy(phyAddress, DM9161_DSCSR, &value, retryMax);
    trace_LOG(trace_INFO, " _DSCSR  : 0x%X\n\r", value);
    EMAC_ReadPhy(phyAddress, DM9161_10BTCSR, &value, retryMax);
    trace_LOG(trace_INFO, " _10BTCSR: 0x%X\n\r", value);
    EMAC_ReadPhy(phyAddress, DM9161_PWDOR, &value, retryMax);
    trace_LOG(trace_INFO, " _PWDOR  : 0x%X\n\r", value);
    EMAC_ReadPhy(phyAddress, DM9161_CONFIGR, &value, retryMax);
    trace_LOG(trace_INFO, " _CONFIGR: 0x%X\n\r", value);
    EMAC_ReadPhy(phyAddress, DM9161_MDINTR, &value, retryMax);
    trace_LOG(trace_INFO, " _MDINTR : 0x%X\n\r", value);
    EMAC_ReadPhy(phyAddress, DM9161_RECR, &value, retryMax);
    trace_LOG(trace_INFO, " _RECR   : 0x%X\n\r", value);
    EMAC_ReadPhy(phyAddress, DM9161_DISCR, &value, retryMax);
    trace_LOG(trace_INFO, " _DISCR  : 0x%X\n\r", value);
    EMAC_ReadPhy(phyAddress, DM9161_RLSR, &value, retryMax);
    trace_LOG(trace_INFO, " _RLSR   : 0x%X\n\r", value);

    EMAC_DisableMdio();
}

//-----------------------------------------------------------------------------
/// Find a valid PHY Address ( from 0 to 31 ).
/// Check BMSR register ( not 0 nor 0xFFFF )
/// Return 0xFF when no valid PHY Address found.
/// \param pDm          Pointer to the Dm9161 instance
//-----------------------------------------------------------------------------
static unsigned char DM9161_FindValidPhy(Dm9161 * pDm)
{
    unsigned int  retryMax;
    unsigned int  value=0;
    unsigned char rc;
    unsigned char phyAddress;
    unsigned char cnt;

    trace_LOG(trace_DEBUG, "DM9161_FindValidPhy\n\r");
    ASSERT(pDm, "F: DM9161_FindValidPhy\n\r");

    EMAC_EnableMdio();
    phyAddress = pDm->phyAddress;
    retryMax = pDm->retryMax;

    // Check current phyAddress
    rc = phyAddress;
    if( EMAC_ReadPhy(phyAddress, DM9161_PHYID1, &value, retryMax) == 0 ) {
        trace_LOG(trace_INFO, "DM9161 PROBLEM\n\r");
    }
    trace_LOG(trace_DEBUG, " _PHYID1  : 0x%X, addr: %d\n\r", value, phyAddress);

    // Find another one
    if (value != DM9161_OUI_MSB) {

        rc = 0xFF;
        for(cnt = 0; cnt < 32; cnt ++) {

            phyAddress = (phyAddress + 1) & 0x1F;
            if( EMAC_ReadPhy(phyAddress, DM9161_PHYID1, &value, retryMax) == 0 ) {
                trace_LOG(trace_INFO, "DM9161 PROBLEM\n\r");
            }
            trace_LOG(trace_DEBUG, " _PHYID1  : 0x%X, addr: %d\n\r", value, phyAddress);
            if (value == DM9161_OUI_MSB) {

                rc = phyAddress;
                break;
            }
        }
    }
    
    EMAC_DisableMdio();
    if (rc != 0xFF) {

        trace_LOG(trace_INFO, "** Valid PHY Found: %d\n\r", rc);
        EMAC_ReadPhy(phyAddress, DM9161_DSCSR, &value, retryMax);
        trace_LOG(trace_DEBUG, " _DSCSR  : 0x%X, addr: %d\n\r", value, phyAddress);

    }
    return rc;
}


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

//-----------------------------------------------------------------------------/// Setup the maximum timeout count of the driver.
/// \param pDm   Pointer to the Dm9161 instance/// \param toMax Timeout maxmum count.//-----------------------------------------------------------------------------void DM9161_SetupTimeout(Dm9161 *pDm, unsigned int toMax)
{
    ASSERT(pDm, "F: DM9161_SetupTimeout\n\r");

    pDm->retryMax = toMax;
}

//-----------------------------------------------------------------------------/// Initialize the Dm9161 instance/// \param pDm          Pointer to the Dm9161 instance/// \param pEmac        Pointer to the Emac instance for the Dm9161/// \param phyAddress   The PHY address used to access the PHY
///                     ( pre-defined by pin status on PHY reset )
//-----------------------------------------------------------------------------void DM9161_Init(Dm9161 *pDm, unsigned char phyAddress)
{
    ASSERT(pDm , "F: DM9161_Init\n\r");

    pDm->phyAddress = phyAddress;

    // Initialize timeout by default
    pDm->retryMax = DM9161_RETRY_MAX;
}


//-----------------------------------------------------------------------------/// Issue a SW reset to reset all registers of the PHY/// Return 1 if successfully, 0 if timeout./// \param pDm   Pointer to the Dm9161 instance//-----------------------------------------------------------------------------static unsigned char DM9161_ResetPhy(Dm9161 *pDm)
{
    unsigned int retryMax;
    unsigned int bmcr = DM9161_RESET;
    unsigned char phyAddress;
    unsigned int timeout = 10;
    unsigned char ret = 1;

    ASSERT(pDm, "F: DM9161_ResetPhy");
    trace_LOG(trace_INFO, " DM9161_ResetPhy\n\r");

    phyAddress = pDm->phyAddress;
    retryMax = pDm->retryMax;

    EMAC_EnableMdio();
    bmcr = DM9161_RESET;
    EMAC_WritePhy(phyAddress, DM9161_BMCR, bmcr, retryMax);

    do {
        EMAC_ReadPhy(phyAddress, DM9161_BMCR, &bmcr, retryMax);
        timeout--;
    } while ((bmcr & DM9161_RESET) && timeout);

    EMAC_DisableMdio();

    if (!timeout) {
        ret = 0;
    }

    return( ret );
}

//-----------------------------------------------------------------------------/// Do a HW initialize to the PHY ( via RSTC ) and setup clocks & PIOs
/// This should be called only once to initialize the PHY pre-settings.
/// The PHY address is reset status of CRS,RXD[3:0] (the emacPins' pullups)./// The COL pin is used to select MII mode on reset (pulled up for Reduced MII)/// The RXDV pin is used to select test mode on reset (pulled up for test mode)/// The above pins should be predefined for corresponding settings in resetPins
/// The EMAC peripheral pins are configured after the reset done.
/// Return 1 if RESET OK, 0 if timeout./// \param pDm         Pointer to the Dm9161 instance
/// \param mck         Main clock setting to initialize clock
/// \param resetPins   Pointer to list of PIOs to configure before HW RESET
///                       (for PHY power on reset configuration latch)
/// \param nbResetPins Number of PIO items that should be configured
/// \param emacPins    Pointer to list of PIOs for the EMAC interface
/// \param nbEmacPins  Number of PIO items that should be configured
//-----------------------------------------------------------------------------
unsigned char DM9161_InitPhy(Dm9161       *pDm,
                             unsigned int mck,                             const Pin    *pResetPins,
                             unsigned int nbResetPins,
                             const Pin    *pEmacPins,
                             unsigned int nbEmacPins)
{
    AT91S_RSTC * pRSTC = AT91C_BASE_RSTC;
    unsigned char rc = 1;
    unsigned char phy;

    ASSERT(pDm, "F: DM9161_InitPhy\n\r");

    // Perform RESET
    trace_LOG(trace_DEBUG, "RESET PHY\n\r");

    if (pResetPins) {

        // Configure PINS
        PIO_Configure(pResetPins, nbResetPins);

        // Execute reset
        RSTC_SetExtResetLength(pRSTC, DM9161_RESET_LENGTH);
        RSTC_ExtReset(AT91C_BASE_RSTC);

        // Wait for end hardware reset
        while (!RSTC_GetNrstLevel(pRSTC));
    }

    // Configure EMAC runtime pins
    if (rc) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久国产免费看| 亚洲欧洲日本在线| 97精品国产97久久久久久久久久久久| 日韩欧美激情一区| 不卡av在线网| 五月综合激情网| 国产调教视频一区| 久久久一区二区三区捆绑**| 欧美日韩视频专区在线播放| 美女一区二区视频| 日本伊人午夜精品| 日韩一区中文字幕| 欧美无人高清视频在线观看| 狠狠色丁香久久婷婷综合_中| 亚洲综合999| 精品国产人成亚洲区| 日韩视频免费观看高清在线视频| 日韩精品一区二区三区蜜臀| 91免费在线播放| 久久精品免费看| 毛片av一区二区三区| 亚洲品质自拍视频| 亚洲综合色噜噜狠狠| 中文字幕一区二区三区视频| 亚洲主播在线播放| 免费高清在线视频一区·| 成人激情免费视频| 在线视频你懂得一区| 欧美色图一区二区三区| 欧美一二三四区在线| 91麻豆精品国产91久久久更新时间 | 精品国产第一区二区三区观看体验| 91精品国产色综合久久不卡电影 | 色婷婷av一区二区| 久久精品国产一区二区三区免费看| 亚洲国产成人午夜在线一区| 亚洲日本丝袜连裤袜办公室| 久久精品网站免费观看| 亚洲成a人v欧美综合天堂下载| 日韩中文字幕一区二区三区| 秋霞午夜av一区二区三区| 国产激情一区二区三区四区| 欧美私模裸体表演在线观看| 欧美精品1区2区| 99久久伊人网影院| 91精品国产入口| 欧美性大战xxxxx久久久| 欧美久久免费观看| 亚洲电影一区二区| 91老师片黄在线观看| 日韩免费在线观看| 欧美乱妇20p| 中文字幕在线不卡视频| 国产成人免费高清| 亚洲色图一区二区三区| 青青草91视频| 亚洲欧洲制服丝袜| 久草这里只有精品视频| 午夜不卡av在线| 91麻豆高清视频| 日韩在线一二三区| 欧美一区二区三区免费大片| 婷婷开心久久网| 日本高清不卡视频| 国产精品欧美一区二区三区| 精品系列免费在线观看| 久久嫩草精品久久久久| 暴力调教一区二区三区| 国产亚洲欧美日韩日本| 亚洲成人动漫在线免费观看| 91福利精品第一导航| 免费高清成人在线| 精品欧美久久久| 色综合中文字幕| 久久理论电影网| 日韩电影在线看| 久久久久久久综合日本| 国产美女精品人人做人人爽| 精品国产乱码久久久久久浪潮| 亚洲第一电影网| 欧美日韩精品一区二区三区四区| 三级久久三级久久久| 国产精品黄色在线观看| 成人精品免费网站| 免费成人你懂的| 欧美性大战xxxxx久久久| 不卡视频免费播放| 国产成人在线视频播放| 亚洲美女偷拍久久| 久久综合99re88久久爱| 5月丁香婷婷综合| 欧美日韩成人在线| 精品综合久久久久久8888| 国产精品美女久久久久av爽李琼 | 日韩成人免费在线| 国产精品美女久久久久久久网站| 日韩欧美一区二区久久婷婷| 国产午夜精品理论片a级大结局| 色婷婷av一区二区三区大白胸 | 日本麻豆一区二区三区视频| 国产欧美日产一区| 日韩欧美国产1| 久久精品视频免费| 欧美日韩高清不卡| 欧美日韩一区不卡| 欧美日韩一区二区三区在线看| 亚洲电影激情视频网站| 国产精品网曝门| 国产精品高潮呻吟| 一区二区在线电影| 一区二区三区日本| 9人人澡人人爽人人精品| 一本一道波多野结衣一区二区| 欧美激情中文字幕| 亚洲乱码精品一二三四区日韩在线| 亚洲一区二区三区自拍| jizz一区二区| 久久欧美中文字幕| 精品亚洲成a人| 精品国产乱码久久久久久影片| 亚洲一区二区黄色| 亚洲一区在线观看免费| 成人精品国产免费网站| 精品国产一区二区三区久久久蜜月 | 国产精品三级在线观看| 国产麻豆午夜三级精品| 国产日本亚洲高清| 成人av在线看| 国产精品久久久久久久久快鸭| 国产成人av电影免费在线观看| 亚洲手机成人高清视频| 成人午夜在线播放| 91在线看国产| 国产精品久久久久婷婷| 99国产精品久久久久久久久久| 一区二区三区在线观看欧美| 欧美大片在线观看一区二区| 欧洲av一区二区嗯嗯嗯啊| 亚洲黄色小说网站| 午夜精品影院在线观看| 精品亚洲成av人在线观看| 亚洲少妇屁股交4| 国产欧美日韩在线看| 色国产精品一区在线观看| 亚洲日本在线a| 日韩欧美一级二级三级久久久| 不卡视频一二三四| 亚洲不卡一区二区三区| 国产精品免费丝袜| 中文字幕第一区综合| 欧美色偷偷大香| 成人午夜免费av| 日韩国产在线观看| 亚洲综合自拍偷拍| 日韩电影一区二区三区四区| 亚洲欧洲另类国产综合| 国产精品情趣视频| 日韩精品一区二区三区在线观看| 欧美亚洲综合一区| 一本久久精品一区二区| 最好看的中文字幕久久| 国产亚洲美州欧州综合国| 3atv在线一区二区三区| xf在线a精品一区二区视频网站| 欧美性猛交一区二区三区精品| 91麻豆国产精品久久| 色婷婷综合久久久久中文| 国产乱码精品一品二品| 激情综合一区二区三区| 精品在线观看视频| 久久精品国产亚洲高清剧情介绍| 亚洲一区二区在线免费观看视频| 亚洲精品日韩综合观看成人91| 亚洲国产精品自拍| 麻豆精品久久久| 久久99久久99精品免视看婷婷| 精品一区二区影视| 91视视频在线直接观看在线看网页在线看| 高清国产午夜精品久久久久久| 国产成人亚洲综合a∨婷婷图片| 精品一区二区三区影院在线午夜 | 亚洲第一综合色| 亚洲成人av在线电影| 欧美三级在线看| 日韩欧美色综合| 日韩久久久精品| 午夜免费欧美电影| 国产福利91精品| 欧美zozo另类异族| 欧美视频日韩视频在线观看| 欧美一区永久视频免费观看| 精品裸体舞一区二区三区| 亚洲欧美日本在线| 国产v综合v亚洲欧| 欧美日韩精品欧美日韩精品| ●精品国产综合乱码久久久久| 日韩精品一卡二卡三卡四卡无卡| 久久99深爱久久99精品| 色国产综合视频| 国产视频在线观看一区二区三区 |