開發環境
技術實現
SylixOS 內核版本1.4.1的網卡驅動框架與之前的版本相比有了很大變化,最主要的就是由之前的netif結構體變成了現在了netdev結構體。這個版本的網卡驅動框架主要由以下幾個部分組成。
網卡驅動框架:網卡驅動入口
在官方提供的imx6Q的BSP工程目錄中,SylixOS文件夾主要由三個子文件夾組成,分別是:bsp, driver, user。如圖 21所示。
圖 21 工程資源文件
bsp文件夾裏是跟整個bsp相關的C文件及相關配置文件等,在startup.s之後運行的第一個C文件爲:bspInit.c,如圖 22所示。
圖 22 bspInit.c
驅動程序一般都存放在driver文件夾中。如圖 23所示。
圖 23 驅動文件夾
網卡驅動代碼在driver下的netif子文件內,打開imx6q_netif.h , 整個網卡驅動對外只提供了一個函數:enetInit ,如圖 24所示。
圖 24 網卡入口函數
enetInit是整個網卡驅動的入口函數,前面說的bspInit.c裏halNetifAttch函數裏會調用這個函數,進行網絡的初始化。如圖 25所示。
圖 25 調用enetInit
網卡驅動框架:網卡驅動實現
在當前版本的SylixOS 裏,網卡驅動主要是實現netdev這樣一個結構體,結構體裏的成員如圖 26所示。
圖 26 netdev
這個結構體裏的內容主要可以分爲以下兩類:
配置信息相關
除了netdev_funcs結構體指針變量drv之外,其他的成員都可以分到這一類中,在驅動程序裏,只需根據具體情況,對這一類的成員進行對應的賦值即可。如圖 27所示。
圖 27 配置信息相關
驅動程序相關
這一類的就一個成員,即netdev_funcs結構體指針。它裏面定義了所有驅動程序需要實現的內容,這個結構體的定義如圖 28所示。
圖 28 netdev_funcs
一般,實現了init,transmit,receive這三個成員後,網卡基本就可以正常工作。這三個函數的功能如下:
.init : 進行整個網卡的初始化內容,裏面可以包括MAC控制器的初始化,PHY的初始化,描述符的初始化,中斷的綁定等等;
.transmit : 上層協議發送數據時,最後調用的就這個函數,因此,它要是實現網卡驅動的發送功能。
.receive : 當網卡收到數據時,會調用這個函數進行接收,同時,它裏面還需要實現將收到的信息傳到上層協議棧中去的功能。
網卡驅動框架:在系統中添加網卡信息
完成了上述內容之後,整個網卡驅動的內容也已經填充到netdev這個結構體中去了,最後只需要調用netdev_add函數就可以在系統中添加我們實現的這個網卡信息,如圖 29所示。
圖 29 netdev_add
網卡驅動框架:連接監測線程
在網卡驅動裏,可以創建一個線程,用來監測當前網絡的連接狀態,如圖 210所示。
圖 210 監測線程
參考資料
無