飛騰E2000板載乙太網適配

来源:https://www.cnblogs.com/forwards/archive/2023/11/29/17864696.html
-Advertisement-
Play Games

飛騰E2000板載乙太網適配e20005.4.18macbyt85211. 設備樹移植2. MACB驅動移植3. 網路連通性調試3-1. MACB驅動環回測試3-2. YT8521 PHY工作模式及電壓確認3-3. YT8521 PHY環回測試3-4. YT8521 PHY tx delay調整 飛 ...


飛騰E2000板載乙太網適配

e20005.4.18macbyt8521


飛騰E2000嵌入式板卡的MAC晶元對應linux通用macb驅動,外接YT8521 PHY晶元。飛騰在5.10內核上進行過適配,現將其移植到麒麟5.4內核。

本文參考資料:
飛騰5.10內核源碼
飛騰E2000乙太網驅動註冊和使用簡介
飛騰騰瓏E2000軟體編程手冊V0.6.pdf
YT8521S初始化配置相關ver2.1.pdf
YT8521SH-CA_YT8521SC-CA_Datasheet_v1.02.pdf

1. 設備樹移植

phy-mode為MAC晶元與PHY晶元物理層的連接方式,這涉及到真實的物理連接方式,本文所用的硬體採用rgmii模式。

註:rgmii模式下,tx clk由mac提供,rx clK由phy提供。

macb0: ethernet@3200c000 {
		compatible = "cdns,phytium-gem-1.0";
		reg = <0x0 0x3200c000 0x0 0x2000>;
		interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
						<GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>,
						...
						<GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>,
						<GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
		clock-names = "pclk", "hclk", "tx_clk", "tsu_clk";
		clocks = <&sysclk_250mhz>, <&sysclk_48mhz>, <&sysclk_48mhz>, <&sysclk_250mhz>;
		magic-packet;
		status = "okay";
		phy-mode = "rgmii";
        use-mii;
        };

2. MACB驅動移植

飛騰5.10 macb驅動無法直接替換麒麟5.4 macb驅動,因此需要進行手動移植。
根據設備樹知道硬體通過cdns,phytium-gem-1.0進行匹配,因此需要在macb_dt_ids中新增cdns,phytium-gem-1.0條目,並將phytium_gem1p0_config移植到麒麟5.4內核中。

drivers/net/ethernet/cadence/macb_main.c:

static const struct macb_config phytium_gem1p0_config = {
	.caps = MACB_CAPS_GIGABIT_MODE_AVAILABLE |
			MACB_CAPS_JUMBO |
			MACB_CAPS_GEM_HAS_PTP |
			MACB_CAPS_BD_RD_PREFETCH |
			MACB_CAPS_SEL_CLK,
	.dma_burst_length = 16,
	.clk_init = phytium_clk_init,
	.init = phytium_init,
	.jumbo_max_len = 16360,
	.sel_clk_hw = phytium_gem1p0_sel_clk,
};

static const struct of_device_id macb_dt_ids[] = {
	...
	{ .compatible = "cdns,phytium-gem-1.0", .data = &phytium_gem1p0_config },
	...
}

由於麒麟5.4 macb驅動與飛騰5.10 macb驅動有所差別,僅移植以上部分還不夠。
根據phytium_gem1p0_config的定義,其中包含了.sel_clk_hw = phytium_gem1p0_sel_clk,但在麒麟5.4 macb驅動中並未定義和使用phytium_gem1p0_sel_clk函數。
查看飛騰5.10內核phytium_gem1p0_sel_clk函數實現及調用,發現當caps & MACB_CAPS_SEL_CLK成立時該函數才會被調用,並且在麒麟5.4內核中存在功能等價的替代函數phytium_gem_sel_clk,該替代函數只有caps & MACB_CAPS_SEL_CLK_HW成立時才被調用。

飛騰5.10

drivers/net/ethernet/cadence/macb_main.c:
static void macb_mac_link_up(struct phylink_config *config,
			     struct phy_device *phy,
			     unsigned int mode, phy_interface_t interface,
			     int speed, int duplex,
			     bool tx_pause, bool rx_pause)
{
... ...
			if (bp->caps & MACB_CAPS_SEL_CLK)
					bp->sel_clk_hw(bp, speed);
... ...
}

麒麟5.4

static void macb_handle_link_change(struct net_device *dev)
{
... ...
                        if (bp->caps & MACB_CAPS_SEL_CLK_HW)
                                phytium_gem_sel_clk(bp);
... ...
}

綜上,最終驅動的移植方案是使用phytium_gem_sel_clk + MACB_CAPS_SEL_CLK_HW替代phytium_gem1p0_sel_clk + MACB_CAPS_SEL_CLK如下:

drivers/net/ethernet/cadence/macb_main.c:

static const struct macb_config phytium_gem1p0_config = {
	.caps = MACB_CAPS_GIGABIT_MODE_AVAILABLE |
			MACB_CAPS_JUMBO |
			MACB_CAPS_GEM_HAS_PTP |
			MACB_CAPS_BD_RD_PREFETCH |
			MACB_CAPS_SEL_CLK_HW,
	.dma_burst_length = 16,
	.clk_init = phytium_clk_init,
	.init = phytium_init,
	.jumbo_max_len = 16360,
	//.sel_clk_hw = phytium_gem1p0_sel_clk,
};

static const struct of_device_id macb_dt_ids[] = {
	...
	{ .compatible = "cdns,phytium-gem-1.0", .data = &phytium_gem1p0_config },
	...
}

3. 網路連通性調試

macb驅動移植成功之後,網路順利UP,但無法ping通.
netstat -i可以看到存在RX-OK、TX-OK計數,並且計數正常累加。這裡基本可以說明MAC層收發是正常的。
利用tcpdump抓包發現,雖然TX-OK正常累加,但對端陪測機無法抓到被測機所發的任何數據包,被測機能抓到陪測機發的數據包,基本確定網路只能收不能發。

3-1. MACB驅動環回測試

飛騰騰瓏E2000軟體編程手冊V0.6.pdf中,乙太網基地址如下:

mac基址
mac基址

在0x00 network_control寄存器中bit1為本地環回寄存器,將該bit位置1。

0x00 network_control
0x00 network_control

devmem2  $((0x32010000+0x00)) h #讀0x00寄存器的值
0x1c
devmem2  $((0x32010000+0x00)) h 0x1e #寫0x00寄存器,將bit1置1.

進行ping環回抓包測試,測試通過,排除MAC層異常

3-2. YT8521 PHY工作模式及電壓確認

硬體工作模式
硬體工作模式

電壓
電壓

phy的工作模式和電壓與硬體強相關,可以通過讀取0xa001擴展配置寄存器,確認phy工作模式與實際物理連接是否一致。

0xa001 擴展配置寄存器
0xa001 擴展配置寄存器

root@kylin:/opt/phytool# ./phytool write eth1/0x0/0x1e  0xa001 && ./phytool eth1/0x0/0x1f
ieee-phy: reg:0x1f val:0x8140

0xa001寄存器的值為0x8140,因此phy的工作模式配置為UTP_TO_RGMII,電壓為3.3v。

3-3. YT8521 PHY環回測試

在YT8521SH-CA_YT8521SC-CA_Datasheet_v1.02.pdf中PHY環回寄存器中,0x00基本控制寄存器bit14位是環回使能位。

0x00 Basic Control Register
0x00 Basic Control Register

需要說明的是在進行環回測試時,需要將PHY Autonet_En關閉,否則網口無法UP。

./phytool write eth1/0x0/0x00 0x4140
./phytool eth1/0x0/0x00

這裡phy 環回測試未通過,可以確定PHY未將數據發送出去,問題在PHY層發送方向

3-4. YT8521 PHY tx delay調整

RGMII模式下,MAC負責提供TX時鐘,PHY提供RX時鐘。通過macb驅動確認1000M帶寬下tx時鐘頻率為125MHz,確認時鐘頻率正常。

drivers/net/ethernet/cadence/macb_main.c:
static void macb_set_tx_clk(struct clk *clk, int speed, struct net_device *dev)
{
... ...
        switch (speed) {
... ...
        case SPEED_1000:
                rate = 125000000;
                break;
        default:
                return;
        }

        rate_rounded = clk_round_rate(clk, rate);
        if (rate_rounded < 0)
                return;

        /* RGMII allows 50 ppm frequency error. Test and warn if this limit
         * is not satisfied.
         */
        ferr = abs(rate_rounded - rate);
        ferr = DIV_ROUND_UP(ferr, rate / 100000);
		
        if (ferr > 5)
                netdev_warn(dev, "unable to generate target frequency: %ld Hz\n",
                            rate);
        if (clk_set_rate(clk, rate_rounded))
                netdev_err(dev, "adjusting tx_clk failed.\n");
}

查看tx clk delay,讀取0xa003寄存器,千兆帶寬tx clk delay時延由bit3:0提供。

0xa003
0xa003

root@kylin:/opt/phytool# ./phytool write eth1/0x0/0x1e  0xa003 && ./phytool eth1/0x0/0x1f
ieee-phy: reg:0x1f val:0x00f1

0xa003 bit3:0 預設為1,時延150ps,根據YT8521S初始化配置相關ver2.1.pdf資料,業內預設rgmii模式下tx clk delay預設為750ps。

phy delay
phy delay

修改0xa003寄存器為750ps,千兆依然不通,從150ps增加到450ps時,可以ping通,但存在丟包的情況,繼續增加時延到1200ps(8*150ps)時,可以ping通,ping未看到丟包,千兆帶寬測試正常。

./phytool write eth1/0x0/0x1e  0xa003
./phytool write eth1/0x0/0x1f 0x00f8  

附:

時鐘精度(Frequency Tolerance):時鐘精度一般是25℃下測量額時鐘相對於標準頻率的偏差,單位ppm(百萬分之一),例如測得精度為±15ppm,時鐘頻率為25MHz,周期為1/25MHz=40ns,精度偏差為40ns×(±15/1000000)=0.6ps
時鐘溫漂(Frequency versus Temperature Characteristics):由於晶振材料和工藝限制,致使時鐘在不同的溫度下精度會有較大偏差,單位也為ppm。例如溫漂為±100ppm,時鐘頻率為25MHz,周期為1/25MHz=40ns,精度偏差為40ns×(±100/1000000)=4ps
時鐘抖動(Jitter):晶振源固有的雜訊和干擾通常會帶來時鐘信號的周期性偏差。單位一般為ps

本文來自博客園,作者:StepForwards,轉載請註明原文鏈接:https://www.cnblogs.com/forwards/p/17864696.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 通過實現一個簡易版本的跳錶,可以加深了對Python編程的理解。跳錶是一種跳躍式的數據結構,通過索引層提供快速查找的能力,提高了查找的效率。在實現跳錶的過程中,會更加熟悉了Python的語法和特性,並且可以更加靈活地運用它來解決實際問題。 ...
  • 1、定義 Cron表達式是一種用於定義定時任務的格式化字元串。它被廣泛用於Unix、Linux和類Unix系統中,用於在指定的時間執行預定的任務。Cron表達式由6個欄位組成,每個欄位通過空格分隔開。 在本文中,我們將學習如何理解和編寫Cron表達式。 Cron表達式的格式如下: * * * * * ...
  • 一般在會議、教學或培訓活動中,我們都會選擇PPT文檔來進行內容展示。與PDF文檔相比,PPT文檔具有較強的可編輯性,可以隨時增刪元素,並且還可以設置豐富多樣的動畫效果來吸引觀眾註意。那麼如何通過C#將PDF文檔轉為PPT文檔呢?本文將教大家僅使用3行代碼就實現這一功能。 PDF轉PPT所需工具: S ...
  • 本文簡介 MixCoreCMS是一個基於.NET Core框架的開源內容管理系統(CMS),提供了豐富的的基礎功能和插件,是一款面向未來的企業 Web CMS,可輕鬆構建任何類型的應用程式。集成了Google Analytics分析,以及友好的Seo功能,非常適合用於創建企業網站、內容系統、個人博客 ...
  • 一. C#使用場景介紹 C#是微軟公司發佈的一種由C和C++衍生出來的面向對象的編程語言、運行於.NET Framework和.NET Core(完全開源,跨平臺)之上的高級程式設計語言。 二. 開發流程 1. 創建項目:打開Visual Studio後右側選擇“創建新項目”,然後選擇“C# Win ...
  • 1、系統用戶管理 用戶的分類(用戶的ID): UID:用戶的身份標識符,每個用戶都會被分配一個獨特的ID 系統用戶(服務用戶):0 ~ 999 之間 普通用戶:1000 ~ 6000之間 用戶名和UID信息通常存儲在/etc/passwd文件中 用戶的存在是為了能更好的控制系統許可權 1 root:x ...
  • 在Linux或Unix下,如果你看見別人使用kill %1 或者kill %n (n為一個具體的數字)命令,你知道kill %n 這種帶%號的用法是幹嘛嗎?其實kill %n 表示kill掉後臺程式(也可以說是作業),其中n表示Job的編號(number),而不是進程的進程號,下麵我們來簡單演示一下 ...
  • 硬體:一個樹莓派4B、一臺筆記本電腦(以win10系統為例,做樹莓派顯示屏) 1 下載工具軟體 1.1 下載樹莓派鏡像燒錄器Raspberry Pi Imager。 該軟體是把Raspberry Pi OS安裝(燒錄)到TD卡上的工具。 樹莓派官網鏈接。根據下載Raspberry Pi Imager ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...