天天看點

RTT 網口驅動分析

RTT 網口驅動的核心是這個檔案ethernetif.c

此檔案定義了網口驅動的架構,還有幾個常用的指令,比如list_if set_if() set_dns(),

eth_device_init()- > eth_device_init_with_flag(), 這些函數是在具體網卡晶片的驅動初始化裡調用 的,

比如我用的ksz8851我的驅動初始化是rt_hw_ksz8851a_init()中調用了eth_device_init(),

RTT 網口驅動分析

下面這個網卡核心資料結構體,也很重要的

RTT 網口驅動分析

在rt_hw_ksz8851a_init()及其随後的調用中會初始化裡面大部分内容,而隻有struct netif *netif;成員,是在eth_device_init()中配置設定位址空間并初始化的,

網卡晶片的驅動程式隻要提供eth_rx ,eth_tx 這2個主要函數,基本就可以工作了。這就是RTT以太網驅動的大概結構。

再說說網卡實際收發資料,RTT标準驅動網卡收發資料是各建立了一個線程,etx etr線程,

發送網絡資料比較簡單就不分析了,,接收網絡資料采用了一個巧妙的機制,

首先建立了一個接收郵箱eth_rx_thread_mb,(為什麼不是信号量?),當網卡晶片收到資料時,一般都會産生一個接收中斷,在中斷服務程式裡就可以往這個eth_rx_thread_mb發送資料,發送的郵箱資料為此網卡的資料結構體指針,這樣eth_rx_thread_entry線程收到這個郵件後,判斷出是哪個網卡有資料要接收,就可以通過網卡結構體指針->直接調用哪個網卡的底層接收函數接收原始資料了。正因為是這樣設計,才為我順利的實作了RTT下多網卡奠定了基礎。

我自己實作了ppp 3G/4G驅動并不是這麼寫的,因為是PPPOS,是以就直接實作了PPPOS需要的幾個函數

pppos_output_cb,                                    

pppos_status_cb,

PPP持續接收()線程。

就可以了,并沒有實作标準的RTT網卡驅動。

下一步實作 在RTT标準網卡驅動的基礎上實作ECM,準備更高效率的驅動3G/4G子產品。

繼續閱讀