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(),

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

在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模塊。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章