【迅為iTop4412學習筆記】4. 匯流排、裝置、驅動,註冊流程
宣告
以下都是我剛開始看驅動視訊的個人強行解讀,如果有誤請指出,共同進步。
本節目標
- 瞭解Linux匯流排、裝置
- 驅動註冊的流程
基本知識
一般的裝置:接入裝置 -> 註冊裝置 -> 註冊驅動
熱插拔裝置:註冊驅動 -> 接入裝置 -> 註冊裝置
檢視命令
#匯流排(i2c,spi,platform)
ls /sys/bus/
# 裝置號
cat /proc/devices
# 雜項裝置號
cat /proc/misc
匯流排裡要注意的是platform是虛擬匯流排,這裡就掛著我們的裝置。
每個裝置都要給他分配一個裝置號,這樣我們才能知道誰是誰,最大可以存255個,但是裝置多了咋整?我萬一有256個呢?那其中一個豈不是丟了?
所以這些裝置都要被安排一下,舉個例子,一個學校1000人,難不成一起上課?肯定不是,要分年級,分班級。這樣下來,1000個人被安排的明明白白,高年級是高年級,低年級是低年級,同年級也是一班二班…根據這個經驗,裝置就分為了主裝置和次裝置。
雜項裝置misc就是個主裝置,他只是一個統稱,並是一個真實的裝置(類似下面說到的platform匯流排是虛擬的,I2C、SPI匯流排是真實的),假如有一些亂七八糟的裝置,如果都分配到主裝置不是佔著茅坑不拉屎嗎?所以直接乾脆都歸類到雜項裝置,假如你要找這些裝置,你直接去雜項裝置misc裡面去找吧,我這主裝置都是主力選手,啥貓貓狗狗都在主裝置佔著,萬一我主力來了沒位置咋整?我想這就是分類的原因吧。(想想Linux真的很嚴格…我覺得OK)
具體流程
裝置都是掛載在匯流排bus上,這個就不說了
我理解的是,說來說去驅動都是控制晶片的GPIO嘛,但是有些引腳我們已經給他固定了用於幹什麼,比如I2C、SPI、USB這些已經很具體的東西,你接進來的必然是I2C裝置,SPI裝置,USB裝置等等,那麼掛載在匯流排bus上姑且稱之為實體匯流排吧。但是其他的GPIO是開放給我們自己去接外設的,但是晶片鬼知道你會接什麼外設?所以他給這些分配了一個匯流排叫虛擬匯流排platform
所以 Linux -> 匯流排 -> 實體匯流排/虛擬匯流排,這就是我們的第一個分叉口。
實體沒啥說的,該是啥是啥。我們主要就圍繞platform虛擬匯流排。
對於虛擬匯流排,我們接入了外設,那麼自然要編寫一個驅動去控制引腳來驅動外設。所以虛擬匯流排裡我們要有Device和Driver
問題又來了,既然platform掛在了這麼多裝置和驅動,這怎麼匹配呢?那麼就分配名字和學號吧,你都指名道姓的叫出了三年級二班,學號01的MrYang同學,還能叫錯人嗎?
註冊裝置,Linux的結構體是platform_device,裡面有 id 和 name等等。
註冊驅動,Linux的結構體是platform_driver,裡面也有 id 和 name等等。
id,name對上了,不就說明這個裝置是用這個驅動來驅動的嗎?
那麼如何讓他們匹配?這就不是我們需要做的事情了,我們把這些資訊寫好,然後註冊給linux,linux會呼叫platform_match來匹配。(啥都要你做了,還要linux幹啥?)
現在設備註冊了,驅動也註冊了,基佬配對也配對成功了,那麼就可以一起去做事了!
Linux就繼續做下一步,呼叫probe進行初始化,比如註冊裝置節點(供上層呼叫),GPIO申請(引腳要空閒才能給你用啊)
以上就基本完成了整個註冊流程
看到的幾個具體講解platform的連結,分享一下
【設備註冊與驅動註冊概念講解】
https://blog.csdn.net/coolwriter/article/details/78011946
【驅動註冊函式講解】
https://blog.csdn.net/ufo714/article/details/8595021