1. 程式人生 > 其它 >Linux PCI驅動框架

Linux PCI驅動框架

就驅動而言:
微控制器 = 硬體操作 -- keil hal庫都可以直接操作暫存器
Linux = 驅動框架 + 硬體操作 --Linux一切皆檔案

文章以PCI為例子來看一下Linux的驅動框架

Linux PCI驅動框架

因為懶用的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_openxxx_write來構成一個驅動程式,這就是驅動框架。

怎麼實現這些xxx_open、xxx_write函式?我們要做的事情跟微控制器是類似的,一樣要去看電路圖、看晶片手冊,然後在這些函式裡讀寫暫存器:這稱為硬體操作。

所以,Linux驅動程式= 驅動框架 + 硬體操作

有微控制器基礎的人,對硬體操作比較熟悉了,把重點放在驅動框架上就可以。

高能預警:驅動框架可不簡單,對於LED來說是簡單,但是還有更復雜的驅動程式,它要考慮"通用",這很要命。