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模組。
RTT驅動實現步驟
裝置驅動實現步驟 1.按照rt thread物件模型,擴充套件一物件有兩種方式 1 定義自己的私有資料結構,然後賦值到rt thread裝置控制空的user data指標上 2 從struct rt device結構中派生。推薦 2.實現i o裝置模組中定義的6個公共裝置介面,開始可以為空函式 返回...
板卡除錯 網口流量分析
服務端例 iperf.exe s u p 12345 i 1 解析 s 作為服務端 u 使用udp通訊 如測試網路流量丟包率,使用udp,預設的tcp模式有重傳機制 p 服務端繫結的埠 i 設定每次報告之間的時間間隔,單位為秒客戶端例 iperf.exe c 192.168.1.123 p 1234...
RTT裝置與驅動之PWM
這裡將pwm當成乙個裝置 pwm簡介 上圖是乙個簡單的 pwm 原理示意圖,假定定時器工作模式為向上計數,當計數值小於閾值時,則輸出一種電平狀態,比如高電平,當計數值大於閾值時則輸出相反的電平狀態,比如低電平。當計數值達到最大值是,計數器從0開始重新計數,又回到最初的電平狀態。高電平持續時間 脈衝寬...