1:subsys_initcall巨集 1
2
3
4
#define __define_initcall(level,fn,id) \ static initcall_t __initcall_##fn##id __used \
__attribute__((__section__(
".initcall"
level
".init"
))) = fn
#define subsys_initcall(fn) __define_initcall("4",fn,4)
2:module_init巨集
module_init
__initcall
device_initcall
__define_initcall("6",fn,6)
通過分析發現,subsys_initcall和module_init這兩個後最終都是呼叫__define_initcall();這個巨集。
核心在啟動過程中需要順序的做很多事,核心如何實現按照先後順序去做很多初始化操作。核心的解決方案就是給核心啟動時要呼叫的所有函式歸類,然後每個類按照一定的次序去呼叫執行。這些分類名就叫.initcalln.init。n的值從1到8。核心開發者在編寫核心**時只要將函式設定合適的級別,這些函式就會被鏈結的時候放入特定的段,核心啟動時再按照段順序去依次執行各個段即可。所以subsys_initcall和module_init的作用是一樣的,都是在核心啟動的時候去載入驅動,不同之處在於核心啟動時執行的順序不同而已。
3:static int __init leds_init(void) 1
2
3
4
5
6
7
8
9
10
static
int
__init leds_init(
void
)
這個函式是作用是通過呼叫class_create函式來建立了乙個類名為「leds」的裝置類,也就是我們/sys/class/下的leds這個資料夾
4:led_class_attrs 1
2
3
4
5
6
7
8
static
struct
device_attribute led_class_attrs = ;
(1)什麼是attribute,對應將來/sys/class/leds/目錄裡的內容,一般是檔案和資料夾。這些檔案其實就是sysfs開放給應用層的一些操作介面(非常類似於/dev/目錄下的那些裝置檔案)
(2)attribute有什麼用,作用就是讓應用程式可以通過/sys/class/leds/目錄下面的屬性檔案來操作驅動進而操作硬體裝置。
(3)attribute其實是另一條驅動實現的路線。有區別於之前講的file_operations那條線。
5:led_classdev_register
這個函式裡面通過呼叫device_create,來建立乙個屬於leds裝置類的裝置,其在系統中的體現就是在/sys/class/leds/裡面會得到相應的裝置節點檔案。其實這個函式就是核心開發者為驅動開發者提供的乙個註冊leds類裝置的乙個介面函式,將來我們在寫驅動去註冊led裝置的時候就是呼叫這個函式去進行註冊的。
6:led_classdev_unregister
通過呼叫device_unregister函式來登出註冊的led裝置,和led_classdev_register函式類似,只是功能相反。
Linux驅動學習 I2C裝置驅動框架原始碼解析
一 引言 二 原始碼分析 i2c核心介紹 i2c driver的註冊 i2c client的註冊 probe i2c裝置構造的四種方法 i2c與cpu通訊方式之前和大家分析了linux中的i2c框架,本章來結合原始碼分析乙個具體的i2c裝置 i2c核心介紹 i2c 核心提供了 i2c匯流排驅動 和 ...
linux驅動學習之非同步通知
非同步通知是裝置狀態改變後主動通知應用程式,這樣應用程式就不需要阻塞或查詢裝置了。應用通過訊號來處理核心的非同步通知,上次使用poll select來查詢裝置的可讀狀態,下面這個例子類似,不同的是當裝置有資料時主動通知應用去讀資料。應用的c 很簡單,主要設定對訊號的處理方式,核心有資料時會收到sig...
linux驅動之spi學習小結
linux spi驅動總體架構 在2.6的linux核心中,spi的驅動架構可以分為如下三個層次 spi 核心層 spi控制器驅動層和spi裝置驅動層。linux 中spi驅動 位於drivers spi目錄。linux spi體系結構圖 本文對驅動框架不做詳細分析 可參見孟浩依然的博文 linux...