正點原子【第四期】手把手教你學(xué) Linux之驅(qū)動開發(fā)篇

ARM裸機(jī)開發(fā),基本就是使能對應(yīng)時鐘,設(shè)置管腳復(fù)用,設(shè)置高低電平。
對于linux則是使用linux的各種框架實現(xiàn)功能開發(fā)。

MCU對端口操作,也有固定流程。
使能時鐘
設(shè)置IO復(fù)用
設(shè)置屬性,比如輸入還是輸出
輸出什么,高低電平等等。
而寫linux時,這些功能都是直接調(diào)用。
linux提供了GPIO,I2C,SPI等等的操作函數(shù),設(shè)置屬性,直接調(diào)用,給出讀寫的數(shù)據(jù),地址等等。
但是寫的時候,需要滿足一個驅(qū)動框架。
最終表現(xiàn)為/dev/xxx文件。
對其就有打開,關(guān)閉,讀寫等等。上層應(yīng)用就是使用這些操作來操作設(shè)備。
--------------------------------------------------------------------

字符設(shè)備是不定長的字符(流)讀寫。
塊設(shè)備不按指定的順序訪問,基本絕大多數(shù)存儲設(shè)備都屬于此。
(彈幕中一個很有意思的看法,分類應(yīng)該是有區(qū)分作用,這種可以同時屬于兩個的應(yīng)該是屬性)
--------------------------------------------------------------------------
字符設(shè)備開發(fā):
為了完成開發(fā),需要開發(fā)驅(qū)動 和 一個簡單的應(yīng)用。這樣才能測試。
單片機(jī)中,應(yīng)用驅(qū)動都雜糅在一起。但是linux中是完全分開的。
-----------
在虛擬的內(nèi)存中,用戶空間是0-3G,內(nèi)核空間是3G-4G。
應(yīng)用程序想訪問內(nèi)核資源,只有三種方法,系統(tǒng)調(diào)用,異常和陷入。后面兩個有時也叫硬件中斷和軟件中斷。其中主要就是用系統(tǒng)調(diào)用。
而系統(tǒng)調(diào)用,也不是直接通過調(diào)用,而是通過語言自帶的API函數(shù)來進(jìn)行系統(tǒng)調(diào)用。比如POSIX,API和C的庫函數(shù)等。
比如UNIX類操作系統(tǒng),最長用的一個編程接口就是POSIX。
比如,程序使用open函數(shù),打開一個設(shè)備文件,就是通過C庫調(diào)用。
------------------
應(yīng)用里調(diào)用C庫中的open函數(shù),這個open函數(shù)又調(diào)用系統(tǒng)中的一個可以實現(xiàn)文件打開的函數(shù)。這樣在系統(tǒng)和編程接口中間,加了一層C庫封裝,可以實現(xiàn)一致的編程體驗。
----------------------------------
比如:

__NR_這些就是一些系統(tǒng)調(diào)用函數(shù),那些數(shù)字就是系統(tǒng)調(diào)用號。
實際的調(diào)用方式是“陷入”,也就是軟中斷,進(jìn)入內(nèi)核,然后使用系統(tǒng)調(diào)用號來調(diào)用對應(yīng)的功能。
----------------------------------------------
一切皆文件。應(yīng)用程序調(diào)用open函數(shù)打開一個設(shè)備。比如LED。
對這個文件,有read和write操作。
用write 函數(shù)向/dev/led寫數(shù)據(jù)。比如寫1表示打開,寫0表示關(guān)閉。
關(guān)閉設(shè)備,則是使用close函數(shù)。
--------------------------------------------------
編寫驅(qū)動的時候,需要編寫驅(qū)動對應(yīng)的open,close,write,read函數(shù)。
有一個文件file_operations結(jié)構(gòu)體描述了對于字符設(shè)備的所有操作集合,不過未必需要全部實現(xiàn),常用的就是上面幾個。
驅(qū)動最終是被應(yīng)用調(diào)用。
------------------------------------------------------------
字符設(shè)備驅(qū)動框架:
file_operations結(jié)構(gòu)體 在 /include/linux/fs.h中定義。

可以看到llseek,read,write等指針。