了解ARM的千兆以太網——RK3588

1. 簡介

????????本文并不重點講解調試內容,重點了解以太網在ARM設計中的框架以及在設備樹以及驅動的一個整體框架。了解作為一個驅動開發人員當拿到一款未開發過的ARM板卡應該怎么去把網卡配置使用起來。

2. 基礎知識介紹

????????在嵌入式ARM中實現以太網的解決方案通常有以下兩種,通常在性能較低的單片機領域其SOC內部是不具備MAC控制器,但又有需求可以使用方案1這種架構,但在高性能的ARM處理器,例如RK3588這種SOC其內部已集成MAC控制器,可以直接選用方案2。

1. SOC 與外部 MAC+PHY 芯片

2. SOC 內部 MAC 外設與外部 PHY 芯片

????????本文重點解方案2,那么在開始之前,先了解PHY芯片與MAC控制器之間的的接口協議RGMII。

先了解RGMII的前身 GMII(Gigabit Media Independant Interface)千兆MII接口。GMII采用8位接口數據,工作時鐘125MHz,因此傳輸速率可達1000Mbps。同時兼容MII所規定的10/100Mbps工作方式。GMII接口數據結構符合IEEE以太網標準,該接口定義見IEEE 802.3-2000。信號定義如下。
????????RGMII(Reduced Gigabit Media Independant Interface)是精簡GMII接口,相對于GMII相比,RGMII具有如下特征:

????????

  • 發送/接收數據線由8條改為4條
  • TX_ER和TX_EN復用,通過TX_CTL傳送
  • RX_ER與RX_DV復用,通過RX_CTL傳送
  • 1 Gbit/s速率下,時鐘頻率為125MHz
  • 100 Mbit/s速率下,時鐘頻率為25MHz
  • 10 Mbit/s速率下,時鐘頻率為2.5MHz
到了這里如果屏幕前的你產生了疑問,那證明你是真的用心了。有留意的朋友會發現,那數據線減少一半,但是時鐘最高還是125MHz,為啥仍然能達到1Gbit/s的數據傳輸速率,這個很好解決,那就是進行時鐘雙邊沿采樣。

????????

? ? ? ? 這里我們還需要了解一個接口:MDIO 全稱是 Management Data Input/Output ,直譯過來就是管理數據輸入輸出接口,是一 個簡單的兩線串行接口,一根 MDIO 數據線,一根 MDC 時鐘線。驅動程序可以通過 MDIO 和 MDC 這兩根線訪問 PHY 芯片的任意一個寄存器。
????????MDIO 接口支持多達 32 PHY 。同一時刻 內只能對一個 PHY 進行操作,那么如何區分這 32 PHY 芯片呢?和 IIC 一樣,使用器件地址即可,PHY 芯片寄存器地址空間為 5 位。同一 MDIO 接口下的所有 PHY 芯片,其器件地址不能沖突,必須保證唯一,具體器件 地址值要查閱相應的 PHY 數據手冊。
? ? ? ? 其實上述框架還并不完整,PHY芯片產生的差分信號是不能直接接入到網線的,還需要通過RJ45接口轉換成標準的物理接口。RJ45 座要與 PHY 芯片連接在一起,但是中間需要一個網絡變壓器,網絡變壓器用于隔離以及濾波等,網絡變壓器也是一個芯片, 但是現在很多 RJ45 座子內部已經集成了網絡變壓器。
????????完整的嵌入式網絡接口硬件如下圖所示:

2. 硬件原理圖

????????有了前面的基礎知識鋪墊,我們從原理圖的硬件連接進一步了解其硬件框架。以RK3588的原理圖為例進行講解:

PHY:?YT8521SH-CA

3. 設備樹硬件描述

? ? ? ? 前面從硬件的角度分析了其框架,那同樣我們也可以在設備樹硬件描述上也能體現出上述框架。

????????MAC控制器設備節點:rk3588.dtsi

????????下面部分通常需要驅動開發人員補充,原因是涉及一些自定義的PHY復位引腳,這些都是自定義的。

????????先看一下引腳復用:rk3588-vccio3-pinctrl.dtsi

? ? ? ? 從上述設備樹節點先分析也是符和前面分析的框架的,對應以太網框架我們先分析到這里。

4. 工作定位

? ? ? ? 到了這里肯能很多朋友會產生疑問,那實際開發過程中我們驅動開發工作人員需要做哪些工作?這里就需要我們清楚我們的定位了,一個千兆網卡在驅動上我們可以劃分為兩大核心部分:MAC控制器驅動+PHY驅動。

? ? ? ? 通常MAC控制器驅動由原廠BSP工程師提供,不需要我們手搓。我們需要重點關注的是PHY驅動,當然由于業內早已建立了標準,內核源碼已提供了一套通用的PHY驅動,這套PHY驅動至少能讓網卡工作起來,不同的PHY廠商也會兼容這套標準。通常不同的廠商還會基于這套通用的驅動自定義屬于他們自己的一套驅動實現更加完善的功能。

5. PHY驅動分析

????????分析PHY驅動之前先補充一個知識點就是,MDIO 接口支持多達 32 個 PHY,它們是通過地址來區分的,通過不同的 PHY 芯片地址來對不同的 PHY 操作,YT8521SH通過設置PHYAD0引腳來設置其PHY地址。

下拉則地址為0x00000:

上拉則地址為0x00001:

? ? ? ? 有了上述的PHY地址了解之后,我們再回頭看看設備樹節點是如何體現PHY地址的,在前面設備樹MAC控制器節點里面有“phy-handle屬性指定了phy,而phy節點的定義則掛載在了MDIO總線下。rgmii_phy0: phy@0節點名稱的@后面的數值就是 PHY 地址。

????????由于網絡驅動框架比較復雜,如果這里貼代碼展開講解,估計很多朋友就繃不住了,因此我們同樣是采樣框架學習法,了解驅動框架,重點了解我們作為驅動開發者通常需要做哪些工作即可。

? ? ? ? 本文我們不展開講解MAC控制器驅動,這里直接拋出答案:MAC控制器驅動無非就是解析設備樹節點,初始化MAC控制器、通過"phy-handle"屬性解析PHY節點相關信息,做一系列的RGMII接口初始化,最終注冊MDIO總線,注冊PHY設備。

? ? ? ? 講解PHY驅動之前,先了解PHY子系統。PHY 子系統就是用于 PHY 設備相關內容的,分為 PHY 設備和 PHY 驅動,和 platform 總線一樣,PHY 子系統也是一個設備、總線和驅動模型,這里的總線對應的就是MDIO總線。

????????PHY 設備:

????????Linux 內核使用 phy_device 結構體來表示 PHY 設備,結構體定義 在 include/linux/phy.h

????????PHY 設備的注冊過程一般是先調用 get_phy_device 函數獲取 PHY 設備,在通過函數phy_device_register 注冊phy_device。

? ? ? ? 這里需要注意一點的是,PHY設備與PHY驅動匹配并不是通過compatible屬性或name屬性進行匹配的,而是通過PHY ID。? ?

????????PHY 驅動:

????????PHY 驅動使用結構體 phy_driver 表示,結構體也定義在 include/linux/phy.h 文件中

?

????????可以看出,phy_driver 重點是大量的函數,編寫 PHY 驅動的主要工作就是實現這些函數, 但是不一定全部實現。PHY 驅動的注冊使用 phy_driver_register 函數。

????????phy_driver 里面有兩個 成員變量 phy_id phy_id_mask,表示此驅動所匹配的 PHY 芯片 ID 以及 ID 掩碼,PHY 驅動編寫人員需要給這兩個成員變量賦值。phy_device 也有一個 phy_id 成員變量,表示此 PHY 芯 片的 IDphy_device 里面的 phy_id 是在注冊 PHY 設備的時候調用 get_phy_id 函數直接讀取 PHY 芯片內部 ID 寄存器得到的!很明顯 PHY 驅動和 PHY 設備中的 ID 要一樣,這樣才能匹配 起來。如果 PHY 設備和 PHY 驅動匹配,那么就使用指定的 PHY 驅動,如果不匹配的話就使用Linux 內核自帶的通用 PHY 驅動。

????????MDIO 總線:
????????PHY 子系統也是遵循設備、總線、驅動模型的,設備和驅動就是 phy_device 和 phy_driver。總線就是 MDIO 總線,因為 PHY 芯片是通過 MIDO 接口來管理的, MDIO 總線最主要的工作就是匹配 PHY 設備和 PHY 驅動。MDIO 總線數據結構在文件 drivers/net/phy/mdio_bus.c 中有如下定義。

?

????????重點是總線的匹配函數為 mdio_bus_match,主要完成device和driver的匹配工作。
????????通用 PHY 驅動:

????????通用的PHY驅動?drivers/net/phy/phy_device.c

?

????????phy_init 是整個 PHY 子系統的入口函數,調用 phy_driver_register 函數向內核直接注冊一個通用 PHY 驅動:genphy_driver,也就是通用 PHY 驅動,也就是說 Linux 系統啟動以后默認就已經存在了通用 PHY 驅動。

? ? ? ? PHY 廠商驅動:

????????YT8521SH PHY驅動: drivers/net/phy/motorcomm.c

????????此驅動里面的成員函數有一些是 PHY廠商自己編寫的,有一些是直接用的通用 PHY 驅動的, 比如genphy_config_aneg
總結: 通常驅動人員需要操作的就是PHY驅動。關于MAC控制器是如何回調到PHY驅動的接口函數過程其實我們并不關心,我們更多的關注是如何在PHY驅動配置我們需要的網絡功能。

? ? ? ? 說實話,網口驅動知識內容非常多,講到這里個人都差點忘了我們寫這篇文章的最終目的,兩個目的:

1. 如果要配置PHY芯片的某個功能,直接在PHY驅動操作就可以了。

2.需要學會如何在設備樹里面補充完善PHY驅動相關的內容。

????????第一點上面基本講解完了,下面重點講解第二點,回到最開始設備樹節點描述。先提出問題?首先我們是如何知道補充以下內容?

????????以RK3588為例:

參考官方手冊,除此之外還可以參考官板對網卡的配置。

Rockchip_Developer_Guide_Linux_GMAC_CN.pdf

Rockchip_Developer_Guide_Linux_GMAC_Mode_Configuration_CN.pdf

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63374.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63374.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63374.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Springboot家政服務管理系統

摘 要 科技進步的飛速發展引起人們日常生活的巨大變化,電子信息技術的飛速發展使得電子信息技術的各個領域的應用水平得到普及和應用。信息時代的到來已成為不可阻擋的時尚潮流,人類發展的歷史正進入一個新時代。在現實運用中,應用軟件的工作…

DC-9筆記

靶機信息 官網:DC: 9 ~ VulnHub 只有一個flag,官網上沒給其他提示 信息收集 nmap 192.168.66.2-254nmap 192.168.66.146 -A -p-開放了80端口,22端口是filtered的,被過濾? NMAP 六種端口狀態解讀_nmap filtered-CSDN博客 那來看看http服務吧 http(80) 頁腳是空白的,插件也…

STM32-筆記3-驅動蜂鳴器

1、復制03項目,重命名為04項目 打開04項目的Drivers/BSP/led文件夾,把led文件夾更改為beep文件夾,改文件夾內部的.c和.h文件更改為beep.c和beep.h文件,如下圖所示。 2、打開工程文件 出現彈窗,顯示找不到xx文件&#…

PHP開發日志 ━━ 基礎知識:四種不同的變量返回方式該如何調用

最近在給框架升級,其中涉及到古早的緩存系統升級,現在準備區分類型為混合、變量和普通文件,那么變量用什么形式存儲到緩存才能給后續開發帶來便利和通用性呢?于是就涉及到了本文的php基礎知識。 好吧,又是一個無用的知…

概率論得學習和整理30: 用EXCEL 描述泊松分布 poisson distribution

目錄 1 泊松分布的基本內容 1.1 泊松分布的關鍵點 1.1.1 屬于離散分布 1.1.2 泊松分布的特點:每個子區間內概率相等 , λ就是平均概率 1.2 核心參數 1.3 pmf公式 1.4 期望和方差 2 例1:用EXCEL計算泊松分布的概率 3 比較λ不同值時…

Java中的垃圾收集器

文章目錄 1. 理解不同類型的垃圾收集器1.1 Serial 收集器1.2 Parallel (吞吐量) 收集器1.3 CMS (Concurrent Mark-Sweep) 收集器1.4 G1 (Garbage First) 收集器1.5 ZGC 和 Shenandoah GC1.6 Epsilon GC1.7 ParNew 收集器1.8 Zing (Azul Systems) 2. 優化垃圾收集器的選擇和配置…

測試工程師八股文05|功能測試、業務測試

一、基礎概念 1、軟件測試分類 1??按照軟件產生的階段劃分 單元測試:針對程序源代碼進行測試【開發自測】集成測試:針對模塊之間功能交互進行測試系統測試:對整個系統(功能、非功能)進行全面測試驗收測試&#xff…

圖(dfs與bfs)算法2

進度:15/100 原題1: 給你一棵二叉樹的根節點 root ,翻轉這棵二叉樹,并返回其根節點。 (力扣的圖) 原題2: 給定二叉樹的根節點 root ,返回所有左葉子之和。 原題3: 給…

《鴻蒙開發-答案之書》字符串占位符格式化

《鴻蒙開發-答案之書》字符串占位符格式化 先在string.json定義: {"name":"message_arrive","value":"We will arrive at %s."}使用,它有兩種使用方式: 方式一: Text($r(app.string.…

Redis bitmaps 使用

應用場景: 記錄id為 1 的用戶,2024年12月簽到情況,并統計; 記錄 1號簽到 zxys-redis:0>setbit 1:202412 1 1 記錄 2號簽到 zxys-redis:0>setbit 1:202412 2 1 記錄 3號未簽到 zxys-redis:0>setbit 1:202412 3 0 …

【微服務】SpringBoot 整合Redis Stack 構建本地向量數據庫相似性查詢

目錄 一、前言 二、向量數據庫介紹 2.1 什么是向量數據庫 2.2 向量數據庫特點 2.3 向量數據庫使用場景 三、常用的向量數據庫解決方案 3.1 Milvus 3.1.1 Milvus是什么 3.1.2 Milvus主要特點 3.2 Faiss 3.2.1 Faiss是什么 3.2.2 Faiss主要特點 3.3 Pinecone 3.3.1 …

【數據庫】大二數據庫復習范圍 (快速版)幫助你快速復習數據庫

第一章 1. 信息=數據+語義 2:數據庫管理系統(database management system, DBMS) 3. 數據庫系統(database system, DBS)由數據庫、數據庫用戶、計算機硬件系統和計算機軟件系統等幾部分組成 4. 數據模型按應用層次可分為概念模型、邏輯模型和物理模型。 5.每個二維表…

FMIKit-Simulink 常見問題解決方案

將解壓后的文件夾添加到 MATLAB 路徑中: addpath(fullfile(pwd, FMIKit-Simulink-3.1));初始化 FMIKit: FMIKit.initialize(); 設置求解器rtwsfcnfmi.tlc、或grtfmi.tlc再CtrlB即可。 幫助文檔可查看導出FUM和導入FMU。 FMIKit-Simulink-3.1\html\index…

UE UMG 多級彈出菜單踩坑

多級彈出菜單 https://www.bilibili.com/video/BV1ub411J7nA 運行時添加 widget 的方法 create widget 然后 add child 到某個組件,比如 canvas 運行時修改 widget 位置的方法 set widget slot position 用起來沒效果 懷疑是因為我沒有傳入 slot 但是暫時不知…

sunset: midnight

https://www.vulnhub.com/entry/sunset-midnight,517/ 主機發現端口掃描 探測存活主機,8是靶機 nmap -sP 192.168.56.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-05 16:49 CST Nmap scan report for 192.168.56.1 …

【PyTorch】動態調整學習率 torch.optim.lr_scheduler.StepLR 調度器

文章目錄 1. torch.optim.lr_scheduler.StepLR 官方文檔詳解2. 使用示例2.1 官方提供使用示例2.2 自己寫代碼測試方法2.2.1 get_last_lr() 方法2.2.2 state_dict() 方法2.2.3 load_state_dict() 保存和加載調度器 3. 思考3.1 為什么需要state_dict()3.2 get_lr() 與 get_last_l…

伊克羅德與九科信息共同發布RPA+AI智能機器人解決方案

12月12日,伊克羅德信息在上海舉辦“創見AI,邁進智能化未來——科技賦能零售電商”活動,與九科信息、亞馬遜云科技共同探討與分享,融合生成式AI技術和智能自動化(RPA,Robotic Process Automation)在電商零售…

hutool一些典型的方法使用筆記

hutool一些典型的方法使用筆記 1 克隆1.1 深克隆 2類型轉換2.1其他類型轉換為字符串2.2 轉換為日期對象2.3 數組轉集合2.4 Unicode和字符串轉換2.5 數字轉中文 文檔地址:https://blog.csdn.net/dxjren/article/details/144468399 1 克隆 1.1 深克隆 定義一個實體類…

QT實戰經驗總結 連載中

QT實戰經驗總結 在看書系統學習后,就開始實戰了,會遇到很多問題1.信號和槽的思考2.在python 或 C 代碼中,對 QML 代碼中控件的調用關于在一個窗口上不斷打開新窗口 在看書系統學習后,就開始實戰了,會遇到很多問題 pyt…

從 CephFS 到 JuiceFS:同程旅行億級文件存儲平臺構建之路

隨著公司業務的快速發展,同程旅行的非結構化的數據突破 10 億,在 2022 年,同程首先完成了對象存儲服務的建設。當時,分布式文件系統方面,同程使用的是 CephFS,隨著數據量的持續增長,CephFS 的高…