Firmware 載入原理分析

2021-06-19 16:44:12 字數 1913 閱讀 1482

前言      

前段時間移植 wifi 驅動到 android 的核心上,發現 firmware 的載入始終出錯,問了幾個人,都不是很了解,沒辦法,只好自己研究一下。

從本質上來說, firmware 需要做的事情包括兩件:

2,  使用者態程式把使用者態的資料 copy 到核心層;

3,  核心把核心態的資料寫到裝置上,比如 wifi 模組裡;

其中第三步應該不難,關鍵是看看, linux 裡面是如何實現第

一、二步的;

簡單的說,它的機制分成以下幾部分:

1,  通過一定的方式,通知使用者態程式,比如 init 程式,如圖所示:

顯然是通過 kobject_uevent 的方式通知的應用層,它的機制我有空再詳細解釋,簡單的說,就是往乙個 socket 廣播乙個訊息,只需要在應用層開啟 socket 監聽netlink_kobject_uevent組的訊息,就可以收到了。

使用者態的 init 是如何做的?

handle_firmware_event 來處理;

這個圖基本上就是兩個檔案被創立的過程,以及當這兩個檔案被使用者態程式訪問的時候將要被呼叫的函式,比如對於標誌檔案,如果往裡面寫入資料,將會觸發函式firmware_loading_store函式,如果往 bin 檔案裡面寫入資料將會觸發 bin 檔案型別的 write 函式;

使用者態寫資料的過程大約是這樣的:當使用者態收到 kobj_add 訊息的時候最終將會呼叫 handle_firmware_event 的函式;

它的過程就是:

a, 先往標誌檔案裡面寫 1 ;

b, 從使用者空間讀取資料;

c, 往核心建立的檔案裡面寫資料;

d, 如果成功寫入 0 ,否則寫入 -1 ;

下面看看核心是如何接受這些檔案的,前面提到核心建立了乙個 bin 檔案,用來接收使用者態的資料,下面看看這個過程:

還有乙個步驟,這個 bb->buffer 本身是如何與 wifi 驅動互動的呢?這只是乙個中間層,它的資料必須要寫到 wifi 的驅動才應該算完整,而這一步其實就是通過 flush_write 來完成的,下面看看這個過程:

這裡可以清楚的看到, flush_write 做的事情就是把 bb->buffer 的內容 copy 到 wifi driver 分配的空間 fw->data 裡面去了,至此,使用者態的資料已經完整的寫到了 wifi 的 driver 空間了;

3,  核心態的資料到 wifi 模組

這個就比較簡單了,通過函式 sdio_writesb 利用 sdio 匯流排把資料寫到模組裡面去了;

firmware 的載入主要是利用了 uevent 的通訊機制實現使用者態和核心態的互動,另外還涉及了 sys 檔案系統裡的檔案建立 , 我載入 wifi firmware 始終出錯的原因是 android 的檔案系統要求把 wifi 的 firmware helper 放到 /etc/firmware 裡面,而把真正的 firmware sd8686.bin 放到 /etc/firmware/mrvl 裡面,估計是 marvel 修改後的結果,結論就是,這個設計真醜;

Hibernate中的懶載入原理分析

當使用session中的load方法查詢資料庫中的記錄時,我們返回的是乙個 物件,而不是真正需要的那個物件 例如資料庫中存有個student表,我們有cn.binyulan.doman.student的領域物件,如果查詢id值為 200626313 的studentstu student sessi...

jvm原理 簡單的程式載入分析

package com.bzu.csh 類載入器載入.class檔案 初始化static宣告,並不賦值 呼叫類 static宣告賦值由上到下 程式開始執行,首先執行main方法,執行main方法第一條語句,呼叫singleton類的靜態方法,這裡呼叫singleton類的靜態方法就是主動使用sing...

ListView載入原理

listveiw 用來展示列表的view。介面卡 用來把資料對映到listview上 資料 具體的將被對映的字串,或者基本元件。listview的工作原理如下 listview 針對每個item,要求 adapter 返回乙個檢視 getview 也就是說listview在開始繪製的時候,系統首先呼...