驅動學習之led class c原始碼分析

2021-09-20 15:46:35 字數 2085 閱讀 1768

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

staticint__init leds_init(void)

這個函式是作用是通過呼叫class_create函式來建立了乙個類名為「leds」的裝置類,也就是我們/sys/class/下的leds這個資料夾

4:led_class_attrs 1

2

3

4

5

6

7

8

staticstructdevice_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...