嵌入式Linux驅動開發從基礎到框架

2021-10-09 16:46:22 字數 1906 閱讀 3819

想講好嵌入式linux的驅動開發並不容易,各位業界大神從最基礎的字元驅動到中斷併發再到驅動框架、應用層呼叫。但是總覺得業界寫的書都是點到為止,可能也有篇幅過長、嵌入式linux驅動框架碎片化的考慮。在一眾嵌入式linux驅動書中筆者最推崇宋寶華的《linux裝置驅動開發詳解》,但他完全可以更進一步上公升到驅動框架個例(比如usb wifi模組驅動)和應用層呼叫。有些書從c語言基礎談起,真是莫名其妙,不懂c語言應該去學c語言而不是來學驅動。

1、基礎和原料

驅動程式本身也是程式,所有程式都有基礎和呼叫原料庫(最底層的編譯器呼叫彙編指令集)。所以為了寫出驅動程式第一步是要了解寫的規則(基礎)和呼叫庫(原料)。

寫驅動的規則,一般的書開局乙個字元驅動講到最後就沒了,其實字元驅動只是引子。驅動的基礎其實太多了。首先是分離分層和裝置書概念,但這個是非常具體的,什麼東西放裝置樹以及裝置樹如何在開機階段被解析註冊進匯流排的,驅動是如何註冊進匯流排的,驅動如何提供裝置名和主次裝置號給應用層呼叫(核心這裡看到是驅動,應用層那裡看到乙個個裝置檔案)等等。很多人以為驅動就裝置樹、匯流排、驅動三個具體的檔案包打天下,要是這樣只能寫出簡單的字元驅動,從這三大塊很容易分出非常多的檔案。然後是中斷遮蔽、原子操作、鎖、訊號量、互斥體、阻塞、非阻塞、非同步和同步、中斷等純粹的程式原理性東西,這個跟硬體基本沒有關係,是程式設計在驅動開發裡的高階體現。最後就是原料了,一本linux核心api手冊也只是字典,活用還是要多看**。

熟悉了基礎和原料,大概就能寫出比較複雜的字元驅動了,但離真正用得上還很遠。總體來說在了解驅動的基礎和原料後還是要實際看幾個大型的驅動才有收穫。

2、驅動框架

很多人以為寫個字元驅動就差不多了,再加個阻塞非阻塞就頂天了,這樣的驅動絕不會被合併到核心裝置樹里,soc廠也不會放進自己的sdk裡發布,因為缺少實際可用的框架包裝。linux的驅動框架種類繁多、單種內容多,比如乙個看似很簡單的gpio驅動卻要包裝sysfs檔案系統框架、再配合pinctrl,產生了非常多的原始檔,一般人早就雲裡霧裡了。而且應用層介面也是被包進驅動框架裡的,比如gpio被包進sysfs後在應用就是通過/sys裡的檔案屬性操作的。

驅動的框架可以分為簡單框架和複雜框架。簡單框架就是類似sysfs(kobject, ktype, kset)、udev(kobject, ktype, kset)、proc還有usb、i2c、spi等這種一對一的,就是一種驅動就用一種框架。但是在日益複雜的外設面前簡單框架基本要被複雜框架套用才能在現實中用上,比如乙個usb驅動外面不掛成u盤或wifi能用嗎?複雜框架包括input、wifi、framebuffer等等。

驅動框架這個真沒法自己寫出來,能看懂改**已經不錯,更何況現在除了論壇,書本專門講的很少。

3、應用層呼叫

核心對於應用層真是厚愛,所有難寫的**全在核心層,應用層除了對裝置檔案和屬性檔案來幾個open、read、write、ioctl等,好像沒別的。舉個例子framework框架的驅動在底層夠複雜了吧,看看在應用層的介面,稍微了解點屬性控制的,不難寫出顯示程式了吧。如果用上成熟的qt和tslib,完全可以忽略硬體了。

應用層簡單不代表驅動在做應用層介面時簡單,很多人以為實現乙個file_operation結構體就好了,但是如何實現呢?同步非同步、阻塞非阻塞、ioctl屬性如何實現呢等等。

4、驅動重點不是從無到有而是移植修改

現在的寫驅動的書好像真能教人從無到有寫出乙個驅動,但可惜除了簡單的gpio控制基本用不了。極少有人能單槍匹馬實現從無到有寫出乙個驅動,而且這些一般都在晶元廠或者給linux核心提供**的大牛。普通開發者就是拷貝,修改,除錯,不行就改改。但要達到知道改**的程度也要大量學習。

嵌入式linux核心層的開發遠不如微控制器程式靈活,微控制器領域因為碎片化超級嚴重各種rtos、框架、狀態機等等滿天飛。也正因為如此可能很多人覺得過於簡單,業內大量程式設計師轉安卓系統底層開發尤其是framework層開發。

嵌入式Linux驅動開發 簡要備忘

一 搭建編譯環境 1.從天嵌盤拷出 linux 2.6.30.4 20100531.tar.bz2 到 opt下,並解壓到當前目錄 2.shell到目錄 embedsky linux 2.6.30.4 3.cp config embedsky w43 config 4.make menuconfig...

嵌入式Linux裝置驅動開發 1

使用者程序是通過裝置檔案來與實際的硬體打交道。每個裝置檔案都有其檔案屬性 c b 如表示是字元裝置還是塊裝置。另外每個檔案都有兩個裝置號,第乙個是主裝置號,用於標識驅動程式 第二個是從裝置號,用於標識使用同一裝置驅動的不同的硬體裝置。裝置檔案的主裝置號必須與裝置驅動程式在登記時申請的主裝置號一致,否...

嵌入式Linux驅動開發之helloword心得

自從選擇了物聯網這個專業,智慧型xx的字樣牽動著每乙個學習這個專業的孩子。大家興致勃勃的來到了學校,結果一切想象和自己的設想並不一樣。想象中的各種智慧型般夢幻的場景變成了真實的高數 電路 模電等等諸如此類!不知道這個世界什麼時候變得如此的浮躁,當大家的一段時間的努力看不到結果的時候就往往會不太感興趣...