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

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

?? eth_ocm_phy.c

?? sopc builder 中網絡的eth_ocm核
?? C
字號:
#include "eth_ocm_phy.h"
#include <stdio.h>

static int eth_ocm_wait(int base);

void eth_ocm_set_phy_addr(int base, int phyad, int reg){
    phyad &= ETH_OCM_MIIADDRESS_FIAD_MSK; 
    reg = reg << ETH_OCM_MIIADDRESS_RGAD_OFST; 
    reg &= ETH_OCM_MIIADDRESS_RGAD_MSK;
    phyad |= reg;
    IOWR_ETH_OCM_MIIADDRESS(base, phyad); 
}

void eth_ocm_write_phy_reg(int base, int phyad, int reg, int data){
    eth_ocm_set_phy_addr(base, phyad, reg);
    IOWR_ETH_OCM_MIITX_DATA(base, data);
    IOWR_ETH_OCM_MIICOMMAND(base, ETH_OCM_MIICOMMAND_WCTRLDATA_MSK);
    eth_ocm_wait(base);
}

int  eth_ocm_read_phy_reg(int base, int phyad, int reg){
    int result;

    eth_ocm_set_phy_addr(base, phyad, reg);
    IOWR_ETH_OCM_MIICOMMAND(base, ETH_OCM_MIICOMMAND_RSTAT_MSK);
    eth_ocm_wait(base);
    result = IORD_ETH_OCM_MIIRX_DATA(base);
    return result;
}

static int eth_ocm_wait(int base){
    int temp;
    int i;
    i = 0;
    temp = 1;
    while(temp && i<1000){
        temp = IORD_ETH_OCM_MIISTATUS(base);
        if(temp & ETH_OCM_MIISTATUS_NVALID_MSK)
            printf("Invalid bit set in MII Status register\n");
        temp &= ETH_OCM_MIISTATUS_BUSY_MSK;
        i++;
    }
    if(i == 1000)
        printf("[eth_ocm_set_phy_reg] Failed waiting for MII module to be ready!\n");
        
    return temp;
    
}

#ifdef ETH_OCM_USE_INTERNAL_PHY_INIT
/**
 * Performs PHY initialization and determines link duplex.
 * This is fully vendor specific depending on the PHY you are using.
 *
 * @param  dev Pointer to eth_ocm_dev struct which contains needed base address
 * @return 1 if Link is established in Full duplex.
 *         0 if Link is established in Half duplex.
 */
int eth_ocm_phy_init(eth_ocm_dev *dev){
    int duplex;     /* 1 = full ; 0 = half*/
    int phyid;
    int phyid2;
    int dat;
    int phyadd;
    int base;
    int found;
    // determine PHY speed: This is PHY dependent and you need to change
    // this according to your PHY's specifications
    duplex = 1;
    dat = 0;
    phyadd = 0;
    found = 0;
    base = dev->base;

    // ------------------------------
    // PHY detection
    // ------------------------------
    phyid = eth_ocm_read_phy_reg(base, dat, ETH_OCM_PHY_ADDR_PHY_ID1);
    for (dat = 0x00; dat < 0xff; dat++){
        phyid = eth_ocm_read_phy_reg(base, dat, ETH_OCM_PHY_ADDR_PHY_ID1);
        phyid2 = eth_ocm_read_phy_reg(base, dat, ETH_OCM_PHY_ADDR_PHY_ID2);

        if (phyid != phyid2 && (phyid2 != 0xffff)){
            printf("[eth_ocm_phy_init] PHY ID 0x%x %x %x\n", dat, phyid, phyid2);
            phyadd = dat;
            dat = 0xff;
        }
    }

    #ifdef ETH_OCM_PHYID_LXT972A
    // ********************
    // Intel LXT972A 10/100
    // ********************
    if((phyid == (ETH_OCM_PHYID_LXT972A >> 16)) && (phyid2 == (ETH_OCM_PHYID_LXT972A & 0xFFFF))) {
        found = 1;
        printf("[eth_ocm_phy_init] Found LXT972A PHY\n");
        dat = eth_ocm_read_phy_reg(base, phyadd, ETH_OCM_PHY_ADDR_ADV);
        printf("[eth_ocm_phy_init] LXT972A Auto-neg capabilities: 0x%x\n",dat);
    }else{
        printf("[eth_ocm_phy_init] LXT972A NOT FOUND!\n");
    }
    #endif

    #ifdef ETH_OCM_PHYID_MVL
    // ***************
    // Marvell 88E1111
    // ***************
    if (phyid == ETH_OCM_PHYID_MVL){
        found = 1;
        printf("[eth_ocm_phy_init] Found Marvell 88E1111 PHY.\n");
        // Disable 1000BASE-T Autonegotiation
        dat = eth_ocm_read_phy_reg(base, phyadd, 0x09);
        dat &= 0xFCFF;
        eth_ocm_write_phy_reg(base, phyadd, 0x09, dat);    
        // Restart autonegotiation
        dat = eth_ocm_read_phy_reg(base, phyadd, ETH_OCM_PHY_ADDR_CONTROL);
        dat |=  PCS_CTL_an_restart;
        eth_ocm_write_phy_reg(base, phyadd, ETH_OCM_PHY_ADDR_CONTROL, dat);
    }
    else{
        printf("[eth_ocm_phy_init] Marvell 88E1111 not found!\n");
    }
    #endif //ifdef ETH_OCM_PHYID_MVL
    
    #ifdef ETH_OCM_PHYID_DP83848C
    // *****************
    // National DP83848C
    // *****************
    if((phyid == (ETH_OCM_PHYID_DP83848C >> 16)) && (phyid2 == (ETH_OCM_PHYID_DP83848C  & 0xFFFF))) {
        found = 1;
        printf("[eth_ocm_phy_init] Found DP83848C PHY\n");
        dat = eth_ocm_read_phy_reg(base, phyadd, ETH_OCM_PHY_ADDR_ADV);
        printf("[eth_ocm_phy_init] DP83848C Auto-neg capabilities: 0x%x\n",dat);
    }else{
        printf("[eth_ocm_phy_init] DP83848C PHY NOT FOUND!\n");
    }
    #endif // ifdef ETH_OCM_PHYID_DP83848C

    if(!found){
        printf("[eth_ocm_phy_init] No PHY found!\n");
        return 0;
    }
    // Issue a PHY reset here and wait for the link
    // autonegotiation complete again... this takes several SECONDS(!)
    // so be very careful not to do it frequently

    // perform this when PHY is configured in loopback or has no link yet.
    if( ((eth_ocm_read_phy_reg(base, phyadd, ETH_OCM_PHY_ADDR_CONTROL)& PCS_CTL_rx_slpbk) != 0) ||
         ((eth_ocm_read_phy_reg(base, phyadd, ETH_OCM_PHY_ADDR_STATUS) & PCS_ST_an_done) == 0) ) {
        eth_ocm_write_phy_reg(base, phyadd, ETH_OCM_PHY_ADDR_CONTROL,PCS_CTL_an_enable | PCS_CTL_sw_reset);    // send PHY reset command
        dprintf("[eth_ocm_phy_init] PHY Reset\n" );
    }
    
    if(!(eth_ocm_read_phy_reg(base, phyadd, ETH_OCM_PHY_ADDR_STATUS)& PCS_ST_an_done)) {
        printf("[eth_ocm_phy_init] Waiting on PHY link...");
        dat=0;
        while( (eth_ocm_read_phy_reg(base, phyadd, ETH_OCM_PHY_ADDR_STATUS) & PCS_ST_an_done) == 0 ){
            if( dat++ > ETH_OCM_PHY_TIMEOUT_THRESHOLD) {
                printf(" Autoneg FAILED, continuing anyway ...\n");
                break;
            }
        }
        printf("OK. x=%d, PHY STATUS=%04x\n",dat, eth_ocm_read_phy_reg(base, phyadd, ETH_OCM_PHY_ADDR_STATUS));
    }

    #ifdef ETH_OCM_PHYID_LXT972A
    // ********************
    // Intel LXT972A 10/100
    // ********************
    
    if((phyid == (ETH_OCM_PHYID_LXT972A >> 16)) && (phyid2 == (ETH_OCM_PHYID_LXT972A & 0xFFFF))) {
        // retrieve link speed from PHY
        dat = eth_ocm_read_phy_reg(base, phyadd, 0x11);
        duplex = (dat >> 9) & 0x01;
    }

    // End Intel LXT972A
    #endif //ifdef ETH_OCM_PHYID_LXT972A

    #ifdef ETH_OCM_PHYID_MVL
    // ***************
    // Marvell 88E1111
    // ***************
    if (phyid == ETH_OCM_PHYID_MVL){
        dat = eth_ocm_read_phy_reg(base, phyadd, 0x11);

        //duplex bit is not valid until resolved bit is set
        while(!(dat & (1 << 11)))
            dat = eth_ocm_read_phy_reg(base, phyadd, 0x11);

        duplex = (dat >> 13) & 0x01;
        if(dat & (1 << 14))
            printf("[eth_ocm_phy_init] WARNING: PHY operating in Gigabit mode\n");
    }
    // End Marvel 88E1111
    #endif // ifdef ETH_OCM_PHY_ID_MVL

    #ifdef ETH_OCM_PHYID_DP83848C
    // *****************
    // National DP83848C
    // *****************
    if((phyid == (ETH_OCM_PHYID_DP83848C >> 16)) && (phyid2 == (ETH_OCM_PHYID_DP83848C  & 0xFFFF))) {
        dat = eth_ocm_read_phy_reg(base, phyadd, 0x10);
        duplex = (dat >> 2) & 0x01;
    }
    #endif

    dprintf("[eth_ocm_phy_init] Full Duplex is %d\n", duplex);
    return duplex;
}
#endif // ifdef ETH_OCM_USE_INTERNAL_PHY_INIT

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产免费成人在线视频| 国产精品国产a| 国产偷国产偷精品高清尤物| 亚洲欧美日本在线| 国产精品综合二区| 欧美日韩免费观看一区三区| 久久精品一区八戒影视| 美女mm1313爽爽久久久蜜臀| 在线看国产日韩| 中文字幕av一区 二区| 国产一区二区中文字幕| 欧美裸体bbwbbwbbw| 亚洲综合丁香婷婷六月香| 成人免费高清视频在线观看| 日韩av中文字幕一区二区三区| 久久99精品国产麻豆婷婷洗澡| av亚洲精华国产精华精华| 欧美精品久久天天躁| 夜夜亚洲天天久久| av亚洲精华国产精华精| 中文字幕成人网| 国产成人在线观看免费网站| 久久午夜电影网| 久久er99热精品一区二区| 欧美精品视频www在线观看| 亚洲制服丝袜av| 欧美午夜精品一区二区三区| 亚洲综合自拍偷拍| 欧美少妇bbb| 亚洲午夜久久久| 欧美日韩你懂的| 日本欧美韩国一区三区| 欧美一区二区三区白人| 日本一不卡视频| www.亚洲精品| 一区二区三区四区av| 日本韩国一区二区三区| 亚洲一本大道在线| 欧美日韩第一区日日骚| 免费久久精品视频| 欧美r级在线观看| 国产成a人亚洲| 国产精品超碰97尤物18| 91黄视频在线观看| 日本亚洲一区二区| 国产三区在线成人av| proumb性欧美在线观看| 亚洲一区二区视频在线| 91精品国产色综合久久不卡蜜臀| 精品一区二区在线观看| 日本一区二区成人在线| 成人av中文字幕| 一区二区高清免费观看影视大全| 91精品国产综合久久久久| 麻豆精品视频在线| 国产农村妇女精品| 欧美亚洲日本一区| 美女mm1313爽爽久久久蜜臀| 中文字幕成人av| 欧美精品一二三区| 成人高清免费观看| 午夜av一区二区| 亚洲国产成人私人影院tom| 欧洲激情一区二区| 久久精品国产澳门| 亚洲欧美视频一区| 精品国产伦一区二区三区观看体验| 成人性色生活片| 视频一区在线视频| 国产精品美女久久久久aⅴ | 亚洲国产精品精华液网站| 欧美夫妻性生活| 成人手机在线视频| 日韩不卡一二三区| 亚洲丝袜美腿综合| 精品粉嫩超白一线天av| 一本久道久久综合中文字幕| 九九国产精品视频| 亚洲综合视频在线观看| 国产日韩欧美精品电影三级在线| 欧美怡红院视频| 成人精品一区二区三区四区| 天堂成人国产精品一区| 亚洲欧美日韩国产手机在线| 欧美精品一区二区三区高清aⅴ| 91官网在线免费观看| 国产91精品免费| 蜜桃视频在线观看一区二区| 一区二区三区精密机械公司| 国产欧美综合在线| 日韩欧美一级二级| 欧美日韩久久一区二区| 色婷婷亚洲综合| 成人午夜碰碰视频| 国产精品亚洲专一区二区三区| 热久久久久久久| 日韩中文字幕一区二区三区| 亚洲精品中文字幕乱码三区| 国产精品毛片久久久久久久| 国产亚洲短视频| 日韩免费高清电影| 91精品在线免费| 7777精品伊人久久久大香线蕉的| 欧美性高清videossexo| 色综合色狠狠综合色| 99re这里都是精品| 成人美女在线视频| 不卡的av电影| 91麻豆高清视频| 91亚洲资源网| 99久久99久久精品免费观看| 97se亚洲国产综合在线| 99久久精品国产麻豆演员表| a4yy欧美一区二区三区| 99精品桃花视频在线观看| 国产一区二区在线视频| 国产福利不卡视频| 国产激情精品久久久第一区二区| 国产福利91精品| av亚洲精华国产精华精华| 91社区在线播放| 欧美在线综合视频| 正在播放亚洲一区| 欧美大胆人体bbbb| 国产欧美日产一区| 最近日韩中文字幕| 午夜精品免费在线| 麻豆精品在线视频| 高清国产午夜精品久久久久久| 成人国产精品免费观看动漫| 在线免费精品视频| 国产馆精品极品| av福利精品导航| 在线观看亚洲精品视频| 制服丝袜中文字幕亚洲| 精品美女一区二区| 国产精品久久久久久久第一福利 | 欧美丰满嫩嫩电影| 日韩美一区二区三区| 国产欧美一区二区精品秋霞影院| 亚洲日穴在线视频| 日韩电影在线免费观看| 韩国女主播一区二区三区| 99这里都是精品| 欧美久久久一区| 国产欧美精品国产国产专区| 亚洲小少妇裸体bbw| 国产乱对白刺激视频不卡| 在线观看国产一区二区| 欧美精品一区二区久久婷婷| 亚洲另类春色国产| 精品在线你懂的| 欧美在线啊v一区| 久久综合99re88久久爱| 一区二区三区在线视频免费| 韩国女主播成人在线| 在线看国产一区| 欧美激情综合五月色丁香小说| 婷婷国产在线综合| 成人福利视频网站| 欧美一区二区国产| 亚洲激情中文1区| 国产suv精品一区二区三区| 欧美顶级少妇做爰| 亚洲天堂精品在线观看| 国产伦理精品不卡| 欧美一区二区三区公司| 亚洲欧美国产高清| 国产91富婆露脸刺激对白| 91精品国产乱码| 一区二区免费在线| av影院午夜一区| 久久精品水蜜桃av综合天堂| 日本成人在线看| 色综合久久88色综合天天6| 久久午夜色播影院免费高清| 日韩高清不卡一区| 欧美日韩美女一区二区| 亚洲激情欧美激情| 99久久婷婷国产综合精品| 国产欧美日韩视频在线观看| 九九九久久久精品| 日韩一区二区麻豆国产| 亚洲电影在线免费观看| 色偷偷久久人人79超碰人人澡| 国产日韩高清在线| 久久精品噜噜噜成人av农村| 欧美久久一二三四区| 亚洲一区二区三区免费视频| 91免费看片在线观看| 国产精品欧美一区二区三区| 成人国产在线观看| 国产欧美视频一区二区| 国产成人av自拍| 国产色爱av资源综合区| 成人在线综合网| 国产精品久久午夜| 99国产欧美久久久精品| 亚洲天堂免费在线观看视频| 91麻豆国产自产在线观看|