做爲一個驅動開發者, 你可能發現你面對一個設備必須在它能支持工做前下載固件到它裏面. 硬件市場的許多地方的競爭是如此得強烈, 以致於甚至一點用做設備控制固件的 EEPROM 的成本製造商都不肯意花費.
所以固件發佈在隨硬件一塊兒的一張 CD 上, 而且操做系統負責傳送固件到設備自身.html
硬件愈來愈複雜,硬件的許多功能使用了程序實現,與直接硬件實現相比,固件擁有處理復瑣事物的靈活性和便於升級、維護等優勢。固件(firmware)就是這樣的一段在設備硬件自身中執行的程序,經過固件標準驅動程序才能實現特定機器的操做,如:光驅、刻錄機等都有內部的固件。固件通常存放在設備上的flash存儲器中,但出於成本和靈活性考慮,許多設備都將固件的映像(image)以文件的形式存放在硬盤中,設備驅動程序初始化時再裝載到設備內部的存儲器中。這樣,方便了固件的升級,並省略了設備的flash存儲器。函數
1、驅動和固件的區別
從計算機領域來講,驅動和固件歷來沒有過明確的定義,就好像今天咱們說內存,大部分人用來表示SDRAM,但也有人把Android裏的「固化的Flash/Storage"稱爲「內存」,你不能說這樣說就錯了,由於這確實
是一種「內部存儲」。但在Linux Kernel中,Driver和Firmware是有明確含義的.操作系統
一、驅動
Driver是控制被操做系統管理的外部設備(Device)的代碼段。不少時候Driver會被實現爲LKM,但這不是必要條件。driver經過driver_register()註冊到總線(bus_type)上,表明系統具有了驅動某種設備
(device)的能力。當某個device被註冊到一樣的總線的時候(一般是總線枚舉的時候發現了這個設備),總線驅動會對driver和device會經過必定的策略進行binding(即進行匹配),若是Binding成功,總線
驅動會調用driver的probe()函數,把設備的信息(例如端口,中斷號等)傳遞給驅動,驅動就能夠對真實的物理部件進行初始化,並把對該設備的控制接口註冊到Linux的其餘子系統上(例如字符設備,v4l2子
系統等)。這樣操做系統的其餘部分就能夠經過這些通用的接口來訪問設備了。.net
二、固件
Firmware,是表示運行在非「控制處理器」(指不直接運行操做系統的處理器,例如外設中的處理器,或者被用於bare metal的主處理器的其中一些核)中的程序。這些程序不少時候使用和操做系統所運行的處理
器徹底不一樣的指令集。這些程序以二進制形式存在於Linux內核的源代碼樹中,生成目標系統的時候,一般拷貝在/lib/firmware目錄下。當driver對device進行初始化的時候,經過request_firmware()等接口,
在一個用戶態helper程序的幫助下,能夠把指定的firmware加載到內存中,由驅動傳輸到指定的設備上。插件
因此,總的來講,其實driver和firmware沒有什麼直接的關係,但firmware一般由驅動去加載。咱們討論的那個OS,通常不須要理解firmware是什麼,只是把它當作數據。firmware是什麼,只有使用這些數據的
那個設備才知道。比如你用一個電話,電話中有一個軟件,這個軟件你徹底不關心如何工做的,你換這個軟件的時候,就能夠叫這個軟件是「固件」,但若是你用了一個智能手機,你要細細關係什麼是上面的應
用程序,Android平臺,插件之類的細節內容,你可能就不叫這個東西叫「固件」了。htm
2、固件如何工做
固件子系統使用 sysfs 和熱插拔機制. 當調用 request_firmware, 一個新目錄在 /sys/class/firmware 下使用你的驅動的名子被建立. 那個目錄包含 3 個屬性:
loading 這個屬性應當被加載固件的用戶空間進程設置爲 1. 當加載進程完成, 它應當設爲 0. 寫一個值 -1 到 loading 會停止固件加載進程.blog
data 是一個二進制的接收固件數據自身的屬性. 在設置 loading 後, 用戶空間進程應當寫固件到這個屬性.接口
device 這個屬性是一個符號鏈接到 /sys/devices 下面的被關聯入口項進程
一旦建立了 sysfs 入口項, 內核爲你的設備產生一個熱插拔事件. 傳遞給熱插拔處理者的環境包括一個變量 FIRMWARE, 它被設置爲提供給 request_firmware 的名子. 這個處理者應當定位固件文件, 而且拷貝
它到內核使用提供的屬性. 若是這個文件沒法找到, 處理者應當設置 loading 屬性爲 -1.
若是一個固件請求在 10 秒內沒有被服務, 內核就放棄並返回一個失敗狀態給驅動. 超時週期可經過 sysfs 屬性 /sys/class/firmware/timeout 屬性改變.
使用 request_firmware 接口容許你隨你的驅動發佈設備固件. 當正確地集成到熱插拔機制, 固件加載子系統容許設備簡化工做"在盒子以外" 顯然這是處理問題的最好方法.
可是, 請容許咱們提出多一條警告: 設備固件沒有製造商的許可不該當發佈. 許多製造商會贊成在合理的條款下許可它們的固件, 若是客氣地請求; 一些其餘的可能不何在. 不管如何, 在沒有許可時拷貝和發佈
它們的固件是對版權法的破壞而且招致麻煩.事件
參考文檔:
https://blog.csdn.net/qq_26093511/article/details/78900945
https://community.hpe.com/t5/%E5%B7%A5%E4%B8%9A%E6%A0%87%E5%87%86%E6%9C%8D%E5%8A%A1%E5%99%A8/Dl580G7%E7%BD%91%E5%8D%A1%E5%9B%BA%E4%BB%B6%E7%89%88%E6%9C%AC%E8%BF%87%E4%BD%8E%E5%AF%BC%E8%87%B4%E7%9A%84%E9%97%AE%E9%A2%98/td-p/5564313?profile.language=zh-CN#.XGOI1_kzaUk
http://cloud.zhiding.cn/2019/0121/3115287.shtml