<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于DWC_ether_qos的以太網驅動開發-MDIO驅動編寫與測試

嵌入式USB開發 ? 來源:嵌入式USB開發 ? 作者:嵌入式USB開發 ? 2023-08-30 09:37 ? 次閱讀

本文轉自公眾號歡迎關注

一.前言

以太網驅動的編寫與調試往往從MDIO接口開始,MDIO是MAC訪問PHY的接口。實現通過MDIO對PHY進行操作才能配置PHY,所以實現MDIO讀寫是第一步。DWC_ether_qos提供了SMA模塊,操作兩個寄存器即可實現PHY寄存器的讀寫,比較簡單方便,且支持C45和C22兩種模式,另外有比較靈活的配置參數后面會詳講。

二.SMA模塊介紹

DWC_ether_qos中SMA(Station Management Agent)是一種雙線站管理接口(MIM:Station Management interface),即MDIO管理接口,通過SMA模塊即MDIO接口可以訪問PHY的寄存器。

其具備以下特征:

l時鐘

IEEE 802.3中規定,MDC的最大操作頻率(gmi_MDC_o)是2.5MHz。在DWC_ether_qos中,gmii_mdc_o時鐘是從csr_i分頻得到的,通過MAC_MDIO_Address寄存器中的CR字段配置,

要注意該分頻值一般要使得MDC滿足不大于2.5MHz的要求。如果系統支持更高的頻率該分頻也可以分頻到大于2.5MHz的頻率。

l模式選擇:MAC_MDIO_Address 的C45E 配置使用C45還是C22格式。

l前導抑制:MAC_MDIO_Address的PSE控制是否發送只有一個bit的前導的幀。

l時鐘保持與連續傳輸:MAC_MDIO_Address 的NTC可以配置MDIO幀發送完后時鐘保持07個CLK。在此基礎上還可以配置MAC_MDIO_Address 的BTB使能連續傳輸,此時不等07個時鐘保持結束,Busy信號就會發送完幀后立即清除,軟件可以開始下一次傳輸,否則需要等到配置的0~7個保持時鐘之后Busy才會清除。BTB必須在NTC大于0時才能使能。

三. MDIO幀結構

MDIO幀的一些特征:

MDC一般是1MHz~2.5MHz。

MDIO引腳需要一個1.5k歐姆的上拉電阻,以在空閑和周轉期間保持MDIO高電平。

MDC下降沿修改數據,上升沿鎖存數據,這樣使得數據的建立和保持時間都是半個周期。

高位先發送,高字節先發送。

參考

IEEE 802.3,Section 22.2.4.5

**3.1 **Clause 45

SMA支持在該模式下操作時的讀后遞增地址。

MAC_MDIO_Address 的C45E 配置為1使用C45.

字段描述
IDLEgmii_mdc_o無時鐘,MDIO處于高阻態。通過外部MDIO上拉到高電平
PREAMBLE32 個連續的1,前導抑制模式則只有一個bit。
START包開始2’b00
OPCODE操作碼■ 2’b00 讀寫地址寄存器■ 2’b01 讀寫數據, 讀寫完地址不遞增■ 2’b10 讀寫數據,讀寫完地址自動遞增■ 2’b11 讀寫數據,僅寫完地址自動遞增
PHY ADDR5-bit 的PHY地址,可以編碼最多32 個PHY。
DEV ADDR5-bit 設備地址可以編碼32個設備。
TATurnaround寄存器地址和幀的數據字段之間的2位時間間隔,以避免在讀取事務期間發生爭用?!?2’bZ0: 讀時 第一個bit MAC和PHY都處于高組態,第二個bit是PHY拉低?!?2’b10: 寫時 10都是MAC驅動。Z 表示三態
DATA/ADDRESS16-bit 值: 對于地址周期(OPCODE = 2'b00), 表示下一個周期需要訪問的寄存器地址. 對于數據寫周期,表示需要寫入寄存器的數據內容. 對于read,post-read遞增幀,表示從PHY讀出的寄存器內容.

完成一次C45寄存器讀寫需要兩步,第一步發送地址包,第二步再讀寫

圖片

**3.2 ****Clause **22

MAC_MDIO_Address 的C45E 配置為0使用C22.

幀結構如下

字段描述
IDLEgmii_mdc_o無時鐘,MDIO處于高阻態。通過外部MDIO上拉到高電平。
PREAMBLE32 個連續的1,前導抑制模式則只有一個bit。
START包開始2’b01
OPCODE■ 2’b01 寫■ 2’b10 讀
PHY ADDR5-bit 的PHY地址,可以編碼最多32 個PHY。
REG ADDR5-bit 寄存器地址可以編碼32個寄存器。尋址對應指定MMD的某一個寄存器。
TATurnaround寄存器地址和幀的數據字段之間的2位時間間隔,以避免在讀取事務期間發生爭用?!?2’bZ0: 讀時 第一個bit MAC和PHY都處于高組態,第二個bit是PHY拉低?!?2’b10: 寫時 10都是MAC驅動。Z 表示三態
DATA16-bit 值:■ 寫時DWC_ether_qos 驅動MDIO■ 讀時PHY 驅動MDIO

完成C22讀寫只需要一步

圖片

讀寫波形如下

圖片

3.3使用C22模式訪問C45寄存器

使用C22訪問C45寄存器

參考https://www.ieee802.org/3/efm/public/nov02/oam/pannell_oam_1_1102.pdf

用13號寄存器作為命令寄存器,14號寄存器作為寄存器/數據寄存器

圖片

圖片

步驟如下,分為4步完成:

1.C22模式寫寄存器13,高兩位FN為00,低5位DEV設備地址。

2.C22模式將16位寄存器地址寫入14號寄存器。

3.C22模式寫寄存器13,高兩位FN為01或者10或者11,低5位DEV設備地址。

4.讀:轉至步驟5。寫:轉至步驟6

5.C22模式讀14號寄存器的16位內容。

6.C22模式將16位寄存器內容寫入14號寄存器。

四.相關寄存器

MDIO操作僅需要兩個寄存器

MAC_MDIO_Address和MAC_MDIO_Data

4.1 MAC_MDIO_Address

Offset: 0x200

PSE[27]: bit27,置位則只發送1bit的前導,否則發送32位的前導

BTB **[26]: **bit26,NTC 不為0時生效,NTC為0時不能設置為1.

設置為1時,NTC不為0時,MDIO發送完幀不等NTC個時鐘就立即清除GB位,可以立即重新下一次讀寫。

設置為0,則等待NTC保持時鐘之后GB才清除。

**PA[25:21] **5位的PHY地址

RDA[22:16] 對于C22模式的寄存器地址,C45的設備地址MMD。

NTC[14:12] MDIO幀的發送完后,MDC再保持該配置個時鐘。

CR[11:8]:MDC時鐘選擇 一般配置為1~2.5MHz

0000: CSR clock = 60-100 MHz; MDC clock = CSR clock/42
0001: CSR clock = 100-150 MHz; MDC clock = CSR clock/62
0010: CSR clock = 20-35 MHz; MDC clock = CSR clock/16
0011: CSR clock = 35-60 MHz; MDC clock = CSR clock/26
0100: CSR clock = 150-250 MHz; MDC clock = CSR clock/102
0101: CSR clock = 250-300 MHz; MDC clock = CSR clock/124
0110, 0111: Reserved

1000: CSR clock/4
1001: CSR clock/6
1010: CSR clock/8
1011: CSR clock/10
1100: CSR clock/12
1101: CSR clock/14
1110: CSR clock/16
1111: CSR clock/18

SKAP[4]:只有C45E使能時才有,置位時不發送地址包

GOC_1_0[3:2]:

00: Reserved
01: Write
10: Post Read Increment Address for Clause 45 PHY
11: Read

C45E[1]: 使能C45模式

GB[0]: 軟件寫1觸發讀寫操作,讀寫完硬件清零。

4.2 MAC_MDIO_Data

Offset: 0x204

圖片

RA[31:16]:C45E模式時指定16位寄存器地址。

GD[15:0]:讀出或者寫入寄存器的16位值。

五.MDIO讀寫驅動

5.1 寄存器操作接口

實現基本的寄存器級別的操作接口,

后面再對關鍵參數MDC時鐘,NTC,PSE等測試,抓取波形進行驗證。

/*
 * GB_MASK bit0 置位,觸發MDIO操作, 操作完GB_MASK位硬件清零
 */
GMAC_INLINE int gmac_cfg_mdio_address(uint8_t id, uint8_t pse, uint8_t btb, uint8_t phyadd, 
                                    uint8_t reg_dev, uint8_t ntc, uint32_t csrclk,
                                    uint8_t skap, uint8_t cmd, uint8_t c45)
{
    (void)id;
    uint32_t tmp = 0;
    uint8_t csr = GMAC_CLK_60_100MHZ;
    if(csrclk >= 250000000ul)
    {
        csr = GMAC_CLK_250_300MHZ;
    }
    else if(csrclk >= 150000000ul)
    {
        csr = GMAC_CLK_150_250MHZ;
    }
    else if(csrclk >= 100000000ul)
    {
        csr = GMAC_CLK_100_150MHZ;
    }
    else if(csrclk >= 60000000ul)
    {
        csr = GMAC_CLK_60_100MHZ;
    }
    else if(csrclk >= 35000000ul)
    {
        csr = GMAC_CLK_35_60MHZ;
    }
    else
    {
        csr = GMAC_CLK_20_35MHZ;
    }
    tmp = ((uint32_t)csr < < CR_OFFSET) 
            | ((uint32_t)cmd < < GOC_0_OFFSET) 
            | (uint32_t)GB_MASK 
            | (((uint32_t)reg_dev < < RDA_OFFSET) & RDA_MASK) 
            | (((uint32_t)phyadd < < PA_OFFSET) & PA_MASK)
            | (((uint32_t)pse < < PSE_OFFSET) & PSE_MASK)
            | (((uint32_t)btb < < BTB_OFFSET) & BTB_MASK)
            | (((uint32_t)ntc < < NTC_OFFSET) & NTC_MASK)
            | (((uint32_t)skap < < SKAP_OFFSET) & SKAP_MASK)
            | (((uint32_t)c45 < < C45E_OFFSET) & C45E_MASK);
    GMAC_WRITE_REG(CFG_MAC_MDIO_ADDRESS_ADDR, tmp);
    return 0;
}


GMAC_INLINE int gmac_get_mdio_data(uint8_t id, uint16_t* data, uint16_t* regaddr)
{
    (void)id;
    uint32_t tmp = 0;
    tmp = GMAC_READ_REG(CFG_MAC_MDIO_DATA_ADDR);
    if(data != (void*)0)
    {
        *data = (tmp & GD_MASK) > > GD_OFFSET;
    }
    if(regaddr != (void*)0)
    {
        *regaddr = (tmp & REG_ADDR_MASK) > > REG_ADDR_OFFSET;
    }
    return 0;
}


GMAC_INLINE int gmac_set_mdio_data(uint8_t id, uint16_t data, uint16_t regaddr)
{
    (void)id;
    uint32_t tmp = 0;
    tmp = (((uint32_t)regaddr<

1 MDC時鐘

我這里時鐘是60MHz,設置CR為0,即分頻42,理論上60/42=1.429MHz

實測MDC頻率為1.449MHz

圖片

圖片

設置CR為3,即分頻26,理論上60/26=2.31MHz

實測MDC頻率為2.326MHz

圖片

圖片

2 NTC

NTC=0,幀發送完后MDC立即結束

圖片

圖片

NTC=7,幀發送完后MDC保持7個CLK

圖片

圖片

3 PSE

PSE=0,發送32個前導1

圖片

圖片

PSE=1,發送1個前導1,可以看到這個PHY是不支持前導抑制的,即發送1個前導時不能讀寫。

圖片

5.2 C22讀寫

驅動代碼如下

int iot_gmac_mdio_read(uint8_t id, uint8_t phyadd, uint8_t reg, uint16_t *data, uint32_t clk)
{
    int timeout = IOT_GMAC_MDIO_TIMEOUT;
    while(gmac_is_mdio_busy(id) && (timeout-- > 0));
    if(timeout <= 0)
    {
        return -1;
    }


    gmac_cfg_mdio_address(id, 0, 0, phyadd, reg, 0, clk, 0, GMAC_CMD_PHY_RD, 0);


    timeout = IOT_GMAC_MDIO_TIMEOUT;
    while(gmac_is_mdio_busy(id) && (timeout-- > 0));
    if(timeout <= 0)
    {
        return -1;
    }


    gmac_get_mdio_data(id, data, (void*)0);
    return 0;
}


int iot_gmac_mdio_write(uint8_t id, uint8_t phyadd, uint8_t reg, uint16_t data, uint32_t clk)
{
    int timeout = IOT_GMAC_MDIO_TIMEOUT;
    while(gmac_is_mdio_busy(id) && (timeout-- > 0));
    if(timeout <= 0)
    {
        return -1;
    }


    gmac_set_mdio_data(id, data, 0);
    gmac_cfg_mdio_address(id, 0, 0, phyadd, reg, 0, clk, 0, GMAC_CMD_PHY_WR, 0);
    timeout = IOT_GMAC_MDIO_TIMEOUT;
    while(gmac_is_mdio_busy(id) && (timeout-- > 0));
    if(timeout <= 0)
    {
        return -1;
    }


    return 0;
}

如下是往0號寄存器寫0x9040即Reset軟復位PHY

圖片

如下是讀0號寄存器為0x1040即Reset軟復位PHY完成,硬件自清零了Reset位。

圖片

5.3 C45讀寫

驅動代碼如下

int iot_gmac_mdio_readc45(uint8_t id, uint8_t phyadd, uint8_t dev, uint16_t reg, uint16_t *data, uint32_t clk)
{
    int timeout = IOT_GMAC_MDIO_TIMEOUT;
    while(gmac_is_mdio_busy(id) && (timeout-- > 0));
    if(timeout <= 0)
    {
        return -1;
    }
    gmac_set_mdio_data(id, 0, reg);
    gmac_cfg_mdio_address(id, 0, 0, phyadd, dev, 0, clk, 0, GMAC_CMD_PHY_RD, 1);


    timeout = IOT_GMAC_MDIO_TIMEOUT;
    while(gmac_is_mdio_busy(id) && (timeout-- > 0));
    if(timeout <= 0)
    {
        return -1;
    }


    gmac_get_mdio_data(id, data, (void*)0);
    return 0;
}


int iot_gmac_mdio_writec45(uint8_t id, uint8_t phyadd, uint8_t dev, uint16_t reg, uint16_t data, uint32_t clk)
{
    int timeout = IOT_GMAC_MDIO_TIMEOUT;
    while(gmac_is_mdio_busy(id) && (timeout-- > 0));
    if(timeout <= 0)
    {
        return -1;
    }


    gmac_set_mdio_data(id, data, reg);
    gmac_cfg_mdio_address(id, 0, 0, phyadd, dev, 0, clk, 0, GMAC_CMD_PHY_WR, 1);
    timeout = IOT_GMAC_MDIO_TIMEOUT;
    while(gmac_is_mdio_busy(id) && (timeout-- > 0));
    if(timeout <= 0)
    {
        return -1;
    }


    return 0;
}

波形如下:兩個包,一個是地址包,一個是數據包

圖片

圖片

5.4 C22模式讀寫C45寄存器

以下是RTL8211F的MMD寄存器,不支持直接C45模式,但是支持C22模式讀C45寄存器,

通過13和14號寄存器實現。

圖片

驅動代碼如下

int dwc_mdio_c22readc45(uint8_t id, uint8_t phyadd, uint8_t dev, uint16_t reg, uint16_t *data, uint32_t clk)
{
    iot_gmac_mdio_write(id, phyadd, 13, (0< < 14) | dev, clk);
    iot_gmac_mdio_write(id, phyadd, 14, reg, clk);
    iot_gmac_mdio_write(id, phyadd, 13, (1u< < 14) | dev, clk);
    iot_gmac_mdio_read(id, phyadd, 14, data, clk);
    return 0;
}


int dwc_mdio_c22writec45(uint8_t id, uint8_t phyadd, uint8_t dev, uint16_t reg, uint16_t data, uint32_t clk)
{
    iot_gmac_mdio_write(id, phyadd, 13, (0< < 14) | dev, clk);
    iot_gmac_mdio_write(id, phyadd, 14, reg, clk);
    iot_gmac_mdio_write(id, phyadd, 13, (1u< < 14) | dev, clk);
    iot_gmac_mdio_write(id, phyadd, 14, data, clk);
    return 0;
}

測試代碼如下

uint16_t c45reg = 0;
    dwc_mdio_c22writec45(p_ctrl.unit,p_ctrl.phy_addr,3,0,1u< < 10,p_ctrl.clk);
    dwc_mdio_c22readc45(p_ctrl.unit,p_ctrl.phy_addr,3,0,&c45reg,p_ctrl.clk);
    printf("PC1R=%xrn",c45reg);
    c45reg = 0;
    dwc_mdio_c22readc45(p_ctrl.unit,p_ctrl.phy_addr,3,1,&c45reg,p_ctrl.clk);
    printf("PS1R=%xrn",c45reg);
    c45reg = 0;
    dwc_mdio_c22readc45(p_ctrl.unit,p_ctrl.phy_addr,3,20,&c45reg,p_ctrl.clk);
    printf("EEECR=%xrn",c45reg);
    c45reg = 0;
    dwc_mdio_c22readc45(p_ctrl.unit,p_ctrl.phy_addr,3,22,&c45reg,p_ctrl.clk);
    printf("EEEWER=%xrn",c45reg);
    c45reg = 0;
    dwc_mdio_c22readc45(p_ctrl.unit,p_ctrl.phy_addr,7,60,&c45reg,p_ctrl.clk);
    printf("EEEAR=%xrn",c45reg);
    c45reg = 0;
    dwc_mdio_c22readc45(p_ctrl.unit,p_ctrl.phy_addr,7,61,&c45reg,p_ctrl.clk);
    printf("EEELPAR=%xrn",c45reg);

打印結果如下

可以看到PC1R的bit10設置為了1,其他寄存器對照手冊可以看到都是默認值

圖片

波形如下

寫4步完成

圖片

讀4步完成

圖片

六. 總結

以太網驅動編寫調試的第一步都是調通MDIO接口,重點是要去抓取信號分析實際的波形,比如寄存器的每一個參數對應波形的什么變化,這在驅動編寫調試中很重要,一定要對寄存器每一個bit的功能都非常清晰。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 測試
    +關注

    關注

    8

    文章

    4603

    瀏覽量

    125366
  • 嵌入式
    +關注

    關注

    5006

    文章

    18440

    瀏覽量

    292146
  • 以太網
    +關注

    關注

    40

    文章

    5145

    瀏覽量

    167025
  • 寄存器
    +關注

    關注

    30

    文章

    5167

    瀏覽量

    118227
  • 驅動
    +關注

    關注

    12

    文章

    1728

    瀏覽量

    84517
收藏 人收藏

    評論

    相關推薦

    基于DWC_ether_qos以太網驅動開發-LWIP的ICMP模塊介紹與PING收發測

    本文轉自公眾號歡迎關注 https://mp.weixin.qq.com/s/6MTNop3zBKdQ-gabbWo63Q 一. 前言 ICMP即Internet Control Message Protocol因特網控制消息協議。 ICMP是網絡層協議,IP不可分割的一部分。 ICMP用于報告數據報處理中的錯誤,比如以下情況下時發送ICMP消息:當數據報無法到達其目的地時,當網關沒有轉發數據報的緩沖能力時,以及當網關可以指示主機在較短的路由上發送數據時。 互聯網協議的設計并不是絕對可靠的。ICMP這些控制消息的目的是提供有關通信環境中問題的反饋
    的頭像 發表于 09-18 17:51 ?1209次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-LWIP的ICMP模塊介紹與PING收發測

    基于DWC_ether_qos以太網驅動開發-LWIP的ARP模塊介紹

    TCP/IP通訊第一步需要先調通ARP,否則TCP/IP包都不知道MAC地址要發給誰。這一篇來基于LWIP的ARP實現進行相關的分析。
    的頭像 發表于 09-18 09:34 ?1204次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-LWIP的ARP模塊介紹

    車載以太網測試系統測試實例介紹#車載以太網

    車載以太網
    北匯信息POLELINK
    發布于 :2023年09月12日 17:27:48

    基于DWC_ether_qos以太網驅動開發-RTOS環境移植LWIP與性能測試

    本文轉自公眾號,歡迎關注 基于DWC_ether_qos以太網驅動開發-RTOS環境移植LWIP與性能測試 (qq.com) https:
    的頭像 發表于 09-11 11:20 ?1312次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-RTOS環境移植LWIP與性能<b class='flag-5'>測試</b>

    基于DWC_ether_qos以太網驅動開發-LWIP在PC上進行開發調試

    本文轉自公眾號歡迎關注 基于DWC_ether_qos以太網驅動開發-LWIP在PC上進行開發調試 (qq.com) https://mp
    的頭像 發表于 09-11 08:40 ?1360次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-LWIP在PC上進行<b class='flag-5'>開發</b>調試

    基于DWC_ether_qos以太網驅動開發-LWIP的堆(內存池)未對齊導致問題的案例分享

    本文轉自公眾號歡迎關注 https://mp.weixin.qq.com/s/ErIa2ss2YZLGYbSwoJEzog 一.?前言 內存未對齊訪問問題這個已經是老生常談的問題了, 由于LWIP的堆管理中也用到了地址(指針)強制轉換所以也會遇到這個問題。對于老手比較容易發現,對于新手可能會比較疑惑。所以也單獨分享一個案例吧,權當一個小的check list的case。 二.?問題 Lwipopts.h中MEM_ALIGNMENT可以配置堆對齊大小,有問題時是配置為1 #define MEM_ALIGNMENT 1U 異常時打印寄存器如下,當然不同平臺異常時如何獲取上下
    的頭像 發表于 09-09 08:44 ?1305次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-LWIP的堆(內存池)未對齊導致問題的案例分享

    基于DWC_ether_qos以太網驅動開發-LWIP的堆管理介紹

    本文轉自公眾號歡迎關注 基于DWC_ether_qos以太網驅動開發-LWIP的堆管理介紹 (qq.com) https://mp.weixin.qq.com
    的頭像 發表于 09-08 08:40 ?828次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-LWIP的堆管理介紹

    基于DWC_ether_qos以太網驅動開發-無OS環境移植LWIP

    本文轉自公眾號歡迎關注 基于DWC_ether_qos以太網驅動開發-無OS環境移植LWIP (qq.com) https://mp.weixin.qq.com
    的頭像 發表于 09-06 08:40 ?968次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-無OS環境移植LWIP

    基于DWC_ether_qos以太網驅動開發-收發驅動編寫與調試

    本文轉自公眾號,歡迎關注 基于DWC_ether_qos以太網驅動開發-收發驅動編寫與調試 (
    的頭像 發表于 09-05 08:47 ?1557次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-收發<b class='flag-5'>驅動</b><b class='flag-5'>編寫</b>與調試

    基于DWC_ether_qos以太網驅動開發-描述符格式介紹

    前面我們介紹了描述符鏈表的工作模式,重點是了解環形鏈表是如何環形的,以及相關的寄存器。驅動編寫就需要更進一步,了解描述符的具體內容,即4個描述符的每個字段的含義。
    的頭像 發表于 09-04 14:14 ?1213次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-描述符格式介紹

    基于DWC_ether_qos以太網驅動開發-包過濾

    以太網上數據非常多,如果所有數據都接收交給軟件去處理軟件負載會非常重,所以一般只需要接收發給自己的數據即可
    的頭像 發表于 09-02 09:19 ?1014次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-包過濾

    基于DWC_ether_qos以太網驅動開發-軟復位介紹與問題案例

    一般模塊都會有軟復位的功能,軟復位在驅動編寫中很重要。一般初始化時執行軟復位使得模塊進入確定的初始狀態以提高可靠性,異常時也可以重新初始化來恢復,所以軟復位在驅動中一般是必須要做的動作。
    的頭像 發表于 09-02 09:17 ?998次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-軟復位介紹與問題案例

    基于DWC_ether_qos以太網驅動開發-數據流驗證過程

    轉自公眾號歡迎關注 https://mp.weixin.qq.com/s/klrHhaLMM_0W3FGVwHXFkA 基于DWC_ether_qos以太網驅動開發-數據流驗證過程
    的頭像 發表于 08-31 08:41 ?1313次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-數據流驗證過程

    基于DWC_ether_qos以太網驅動開發-描述符鏈表介紹

    本文轉自公眾號歡迎關注 一.描述符概述 1.0 前言 對于DWC Ethernet QoS驅動編寫來說,初始化完成之后,核心操作就是DMA的描述符鏈表配置(linked list
    的頭像 發表于 08-30 09:39 ?3113次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-描述符鏈表介紹

    基于DWC_ether_qos以太網驅動開發-MAC幀格式介紹

    本文轉自公眾號,歡迎關注 基于DWC_ether_qos以太網驅動開發-MAC幀格式介紹 (qq.com) 一.前言 ? 在以太網
    的頭像 發表于 08-30 09:23 ?1417次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-MAC幀格式介紹
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>