您好,登錄后才能下訂單哦!
這篇文章主要介紹了樹莓派4有線網卡驅動調試的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
從樹莓派底層玩家的角度上來看,樹莓派4算的上一款比較好的開發板。在樹莓派4之前,有線網卡的驅動都是接在USB設備上,也就是說之前的樹莓派都是必須啟用了USB協議,然后再開啟網卡,這樣網速的差別以及網絡處理效率上的差別也就不敢恭維了。博通bcm的網卡芯片還是不錯的,這次為樹莓派4適配和千兆以太網口,配上樹莓派4的a72的4核的芯片,真的算是非常的良心的開發板了。學習網絡編程,除了熟悉各種TCP,UDP的協議之外,如果能夠了解底層驅動的工作原理,那也算是錦上添花的事情。本文主要針對樹莓派4有線網卡的驅動模型,以及數據收發的方式,進行梳理總結,同時學習一些比較好的網卡設計模式。
對于樹莓派4的有線網卡來說,網上的資料相當的匱乏,我只能通過零星的碎片化的資料去推測樹莓派網卡的行為,結合uboot與Linux的代碼,將其適配到rt-thread的lwip協議棧上,完成樹莓派的聯網功能。相關的代碼可以參考
https://github.com/RT-Thread/rt-thread/blob/master/bsp/raspberry-pi/raspi4-32/driver/drv_eth.c
樹莓派4搭載的是Broadcom GENETv5
也就是博通第五代的genet,具體來說適配的是Broadcom? BCM54213PE單端口GRMII千兆以太網收發器,具體的芯片手冊可以通過下面的地址進行下載
https://gitee.com/bigmagic/raspi_sd_fw/blob/master/doc/raspi4/BCM54213PE_datasheet.PDF
這是一款三速1000BASE-T / 100BASE-TX / 10BASE-T千兆以太網(GbE)收發器,集成在單個CMOS芯片中。BCM54213PE是一款高度集成的解決方案,集成了數字自適應均衡器,ADC,鎖相環,線路驅動器,編碼器,解碼器,回聲消除器,串擾消除器以及所有必需的支持電路。BCM54213PE基于Broadcom公認的數字信號處理器技術,完全符合RGMII標準,可與行業標準的以太網MAC和交換機控制器兼容。
在寫任何代碼實現的時候都應該有設計,設計的好壞直接決定最后成型的效果。而調試驅動也不要走一步看一步,應該用高屋建瓴的思維去看待問題的解決辦法,先做什么,后做什么,兩者之間的關聯是什么,復雜模塊的調試往往涉及到幾個器件的耦合,而這些耦合的特性往往就是驅動調試的線索。和玩游戲一樣,順著一個一個的線索,終將解決驅動的通路。
而調試網卡驅動的時候,也必須注意兩個東西一個是串行管理數據總線接口(MDIO),另外就是芯片與網卡的控制器寄存器。
MDIO接口是兩根數據線,MDC和MDIO,通過這兩根線,微控制器可以訪問物理層芯片中介紹的寄存器組,這些寄存器組則決定了物理層的連接的相關信息,比如查詢到的網口的速率,網口的狀態等等。
第二個就是和芯片直接相關的數據處理寄存器,例如DMA控制,中斷控制等等。
要想調通網卡數據,上面兩點都是需要理解和掌握的。
在調試過程中,我發現網絡網口是由路由器網絡網口速度匹配的,所以需要由MDIO進行通信,查詢網卡芯片的狀態,從而判斷當前連接的路由器是千兆網卡還是百兆網卡。如果不進行判斷,那如果速率不匹配是無法進行上層數據通信的。
另外就是上電之后,有線以太網數據收發器內部是有收發計數的,而這個計數z值會與我后面的DMA鏈表直接關聯,所以每次初始化之后,都需要清除計數,這個需要一點時間,需要延時一下,最好做個判斷,直到清空為止。
上面是兩個關鍵的細節,其他的流程倒也沒什么特別需要注意的。接著就需要理解DMA數據鏈表的結構了。
在樹莓派4上,管理網絡數據收發是由DMA鏈表組成的結構體。每個收發鏈表共有256個DMA描述符,每個描述符分別記錄著
1.高位地址(64位地址的高32位)
2.低位地址(64位地址的低32位)
3.接收的最大長度信息
關于接收的順序,如果之前沒有接受到任何數據,當一幀網絡數據包到來時,DMA鏈表會從0偏移處的DMA鏈表開始取數據,然后將接收到的數據放到DMA描述符申明的地址處。
需要注意的是,對于接收的DMA描述符,每個描述符指向的應該都是一段非cache區的地址,因為往往cache的使用會引起內存一致性的問題,而通過cache數據的寫回也可以解決這個問題。我們在分配內存的時候,可以分配一整段的空間,比如由256個描述符,假設每個接收包的最大長度為2K,則需要分配512K的連續的內存空間來進行數據的接收,每當一個包過來后,指針會自動指向下個dma描述符,這個是由硬件完成,與軟件無關。另外一個指針則是判斷當前讀到了哪個dma描述符,隨著數據量的不斷累積,數據會一直存在下個描述符中,并不會由于處理速度跟不上而導致丟包情況的發生。
這種設計是很好的,避免了網絡數據多而快導致的丟包問題的產生,同時通過指針的偏移又大大簡化數據讀出的模型。
而數據的發送則不用設計的如此復雜,當然硬件上也是有著這個描述符的,對于簡單的應用,直接用一個描述符去填充需要發送的數據即可,交給DMA,然后等待發送中斷的到來。
樹莓派4上有著標準的GIC,對于中斷的處理更加的通用化。
查詢其數據手冊,可以看到中斷號為29,這里只是一個外設中斷號而已,還要經過GIC的分發,所以按照GIC的路由規則
最后可以算出其中斷號為160+29,有了這個中斷號,然后配置bcm2711的有線以太網中斷控制器,打開DMA接收完成和發送完成中斷就可以產生相關的中斷了。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“樹莓派4有線網卡驅動調試的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。