Linux PCI驅動框架
就驅動而言:
微控制器 = 硬體操作 -- keil hal庫都可以直接操作暫存器
Linux = 驅動框架 + 硬體操作 --Linux一切皆檔案
文章以PCI為例子來看一下Linux的驅動框架
因為懶用的Typora 圖片是相對路徑, 所以沒把圖床搞到網上, 就一鍵git push了.還是多習慣github吧.
簡單介紹一下 微控制器跟Linux的區別
以下摘自 韋東山老師的筆墨
- 有哪些產品使用微控制器或Linux
所有的電子產品,所用技術都可以認為要麼是微控制器,要麼是Linux;GUI方面主要是QT/Android,它們都是運行於Linux之上的。
也許你不服!不是還有ucos、vxwork、wince、IOS嗎?
我們說的微控制器不使用作業系統。但是使用微控制器裝置肯定遠遠超過Linux。很多人也是先學習微控制器,從微控制器進入電子工程師行業
我們設計一個產品時,是使用微控制器還是Linux,取決於成本:硬體成本、軟體成本、維護成本、升級成本。而不應該根據個人偏好來選擇:我喜歡微控制器,所以就排斥使用Linux;我喜歡Linux,就排斥使用微控制器。為了有更多的選擇,我們需要既懂微控制器,又懂Linux。
- 在硬體操作上微控制器和Linux是類似的
以點燈為例,
無論是微控制器還是Linux,我們要做的事情都一樣:
1.看原理圖,確定引腳是哪一個,確定它輸出什麼電平才可以
2.看晶片手冊,確定要怎麼操作暫存器
3.寫程式
但是,怎麼編寫程式,微控制器和Linux有很大不同。
- 在微控制器中點燈、使用LCD
LED程式裡面的init_led、led_on、led_off函式是你一個人寫的,愛取什麼名就取什麼名,愛怎麼寫就怎麼寫。
LCD程式裡的函式也是你寫的,完全是自由發揮。
很多微控制器專案不是很複雜,2、3個人從上到下統統搞定,裡面的函式大多時間是直接去讀寫暫存器。
很多微控制器專案嚴重依賴於硬體,換一個晶片後怎麼辦?重寫一套程式碼唄。
在微控制器程式裡,沒有應用程式、驅動程式的概念,很可能一個人包攬了硬體設計、模組除錯(或稱之為驅動)、功能開發(或稱之為應用)的全部活。
- 在Linux中點燈、使用LCD
在Linux中,不允許應用開發人員直接去操作硬體,比如你想點個燈,不好意思,你無法直接訪問暫存器;你需要通過驅動程式來訪問暫存器。
為什麼?有幾大原因:
1.Linux系統中執行著眾多程式,必須保證質量差的程式無法破壞系統:
假設你寫的程式比較爛,那我不能讓你去隨便訪問暫存器,把系統搞崩潰了怎麼辦?你本意是去點燈,但是你看錯了暫存器,你把電源關了怎麼辦?
所以這些操作硬體的活,還是交給信得過的人來做吧:交給驅動工程師,他既懂硬體又懂軟體。
2.保證程式的可移植性:
編寫應用程式時,大家都使用統一的函式,以後換一個晶片時,應用程式不用變;只需要根據這個介面提供驅動程式就可以了。
3.團隊協作:
使用Linux系統的專案一般比較大,術業有專攻,一個人不太可能從上到下都全部掌握。比如做人臉識別專案,有擅長做影象處理的,他可不管你要用多少種攝像頭,有影象給他就可以。而多種攝像頭的硬體操作方法各有不同,這些交給驅動程式工程師。
所以,在Linux中應用程式和驅動程式是分開的。
也許你已經大概猜出來了,應用程式怎麼呼叫驅動程式?通過標準的介面:
open:開啟驅動程式。
read/write:讀、寫資料。
ioctl:傳入各種引數,獲得各種引數。
mmap:記憶體對映,比如對映之後,應用程式可以直接讀寫LCD的視訊記憶體。
你看!從這些接口裡,我們根本看不到暫存器的操作。底層的程式驅動會根據這些呼叫,去設定暫存器、操作硬體。
所以,我高大上的應用工程師,幹嘛苦哈哈地去看原理圖、看在片手冊、讀寫暫存器,搞不好還要去除錯硬體BUG。這些髒活、累活就交給驅動工程師吧。客戶的需求千變萬化,我996時間都不夠用了。
我上懂軟體、下懂硬體的驅動工程師,肯定不能把這麼重要的活交給你去做了,把我的系統搞崩潰了怎麼辦。
開玩笑的,有應用工程師、驅動工程師的優劣之分,大家都是為了做出產品。現在有一個趨勢,一個任務從上到下你都需要懂,這就是所謂的全棧工程師。
在Linux中,"一切皆檔案",要訪問某個硬體,也是要開啟檔案、讀寫檔案。應用程式要根據標準的檔案介面:open/read/write/ioctl/mmap
等來訪問驅動程式。
既然如此,怎麼寫驅動程式呢?最簡單的方法就是:APP要呼叫open來開啟驅動程式,那驅動‘程式裡就提供一個xxx_open函式來初始化硬體;APP要呼叫write來寫資料,驅動程式裡就提供一個xxx_write函式來接收資料並操作硬體。
用xxx_open
、xxx_write
來構成一個驅動程式,這就是驅動框架。
怎麼實現這些xxx_open、xxx_write函式?我們要做的事情跟微控制器是類似的,一樣要去看電路圖、看晶片手冊,然後在這些函式裡讀寫暫存器:這稱為硬體操作。
所以,Linux驅動程式= 驅動框架 + 硬體操作
。
有微控制器基礎的人,對硬體操作比較熟悉了,把重點放在驅動框架上就可以。
高能預警:驅動框架可不簡單,對於LED來說是簡單,但是還有更復雜的驅動程式,它要考慮"通用",這很要命。