Linux驅動和固件有何區別


    作為一個驅動開發者, 你可能發現你面對一個設備必須在它能支持工作前下載固件到它里面. 硬件市場的許多地方的競爭是如此得強烈, 以至於甚至一點用作設備控制固件的 EEPROM 的成本制造商都不願意花費.
因此固件發布在隨硬件一起的一張 CD 上, 並且操作系統負責傳送固件到設備自身.

    硬件越來越復雜,硬件的許多功能使用了程序實現,與直接硬件實現相比,固件擁有處理復雜事物的靈活性和便於升級、維護等優點。固件(firmware)就是這樣的一段在設備硬件自身中執行的程序,通過固件標准驅動程序才能實現特定機器的操作,如:光驅、刻錄機等都有內部的固件。固件一般存放在設備上的flash存儲器中,但出於成本和靈活性考慮,許多設備都將固件的映像(image)以文件的形式存放在硬盤中,設備驅動程序初始化時再裝載到設備內部的存儲器中。這樣,方便了固件的升級,並省略了設備的flash存儲器。

一、驅動和固件的區別
    從計算機領域來說,驅動和固件從來沒有過明確的定義,就好像今天我們說內存,大部分人用來表示SDRAM,但也有人把Android里的“固化的Flash/Storage"稱為“內存”,你不能說這樣說就錯了,因為這確實
是一種“內部存儲”。但在Linux Kernel中,Driver和Firmware是有明確含義的.

1、驅動
    Driver是控制被操作系統管理的外部設備(Device)的代碼段。很多時候Driver會被實現為LKM,但這不是必要條件。driver通過driver_register()注冊到總線(bus_type)上,代表系統具備了驅動某種設備
(device)的能力。當某個device被注冊到同樣的總線的時候(通常是總線枚舉的時候發現了這個設備),總線驅動會對driver和device會通過一定的策略進行binding(即進行匹配),如果Binding成功,總線
驅動會調用driver的probe()函數,把設備的信息(例如端口,中斷號等)傳遞給驅動,驅動就可以對真實的物理部件進行初始化,並把對該設備的控制接口注冊到Linux的其他子系統上(例如字符設備,v4l2子
系統等)。這樣操作系統的其他部分就可以通過這些通用的接口來訪問設備了。

2、固件
    Firmware,是表示運行在非“控制處理器”(指不直接運行操作系統的處理器,例如外設中的處理器,或者被用於bare metal的主處理器的其中一些核)中的程序。這些程序很多時候使用和操作系統所運行的處理
器完全不同的指令集。這些程序以二進制形式存在於Linux內核的源代碼樹中,生成目標系統的時候,通常拷貝在/lib/firmware目錄下。當driver對device進行初始化的時候,通過request_firmware()等接口,
在一個用戶態helper程序的幫助下,可以把指定的firmware加載到內存中,由驅動傳輸到指定的設備上。

    所以,總的來說,其實driver和firmware沒有什么直接的關系,但firmware通常由驅動去加載。我們討論的那個OS,一般不需要理解firmware是什么,只是把它當做數據。firmware是什么,只有使用這些數據的
那個設備才知道。好比你用一個電話,電話中有一個軟件,這個軟件你完全不關心如何工作的,你換這個軟件的時候,就可以叫這個軟件是“固件”,但如果你用了一個智能手機,你要細細關系什么是上面的應
用程序,Android平台,插件之類的細節內容,你可能就不叫這個東西叫“固件”了。

二、固件如何工作
固件子系統使用 sysfs 和熱插拔機制. 當調用 request_firmware, 一個新目錄在 /sys/class/firmware 下使用你的驅動的名子被創建. 那個目錄包含 3 個屬性:
loading 這個屬性應當被加載固件的用戶空間進程設置為 1. 當加載進程完成, 它應當設為 0. 寫一個值 -1 到 loading 會中止固件加載進程.

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM