Led驅動架構理解

2021-10-05 08:55:23 字數 2181 閱讀 8799

作為乙個驅動工程師,每每遇到問題,總是抓耳撓腮,查詢許久。是否有一些本質的特性,能讓工作變得輕鬆? 如果有,那可能是對驅動本質的理解,對器件工作特性的熟悉,首先了解本質基於2.6.3核心的led驅動框架來分析,並記錄。

以下是瀏覽led驅動的記錄,首先按照驅動模組理解的慣例,先看看init函式

static int __init leds_init(void)

函式 class_create() 建立乙個新的類在"/sys"目錄下,類名叫 」leds」,並返回這個新生成的類。然後在對該類的的電源管理函式、類的屬性做初始化。關於類的初始化,led 的定義是:

static struct device_attribute led_class_attrs = ;
正如注釋所陳述的那樣,結構體 「device_attribute」 是用來匯出裝置屬性的

/* inte***ce for exporting device attributes */

struct device_attribute ;

對於一切裝置皆檔案的linux來說,裝置的屬性無非就是讀寫,所以,匯出裝置屬性的結構體有讀函式 [ssize_t  (*show)(struct device *dev, struct_device_attribute *attr, chat *buf)]  和寫函式 [ssize_t  (*store)(struct device *dev, struct_device_attribute *attr, chat *buf, size_t count)]。其中 dev,對應要被操作的dev, attr 對應要讀寫的屬性,buf對應需要裝置做什麼,具體的功能還需要裝置驅動開發者實現。比如,輸入1 或者on 對應led的亮,這裡,1/on 就是 buf 的內容,dev 是led, 亮是attr。

結構體 struct attribute 是 使用者的操作許可權,由於linux是多檔案系統(儘管嵌入式很多裝置都是單使用者——root),所有這個屬性規定者不同使用者、使用者組對裝置的訪問許可權。

看完init,接著看看exit函式

static void __exit leds_exit(void)

即為登出已經註冊了的led類。

裝置驅動介面函式:

(1)led 裝置結構體

struct led_classdev ;
裝置結構體體,是核心驅動開發者(開發匯流排、驅動架構者)開放給裝置驅動工程師的裝置介面,用以抽象出乙個裝置在核心中,或者用以連線裝置驅動程式到核心驅動中的,從而使得應用開發者編寫應用程式時,能準確無誤的呼叫到驅動中相關的函式,從而操作硬體。比如 struct led_class中, 函式指標 「void        (*brightness_set)(struct led_classdev *led_cdev, enum led_brightness brightness)   」是led驅動實現後,當使用者空間操作前文所述的 store(寫方法時),就會呼叫,呼叫關係如下:

static ssize_t led_brightness_store(struct device *dev,

struct device_attribute *attr, const char *buf, size_t size)

return ret;

}static inline void led_set_brightness(struct led_classdev *led_cdev,

enum led_brightness value)

關於 trigger 還沒有接觸過,猜想它的應用場景是諸如 當有裝置接入,顯示狀態這一類的,比如網口的燈那種。

(2) 註冊裝置

int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)

首先呼叫 device_create ()建立裝置、註冊在sys下並返回。

(3)led裝置登出

void led_classdev_unregister(struct led_classdev *led_cdev)

基本上來說,led的框架就這些,主要的是裝置驅動的實現、讀寫方法的定義。深入分析就是核心機制的東西了。

wifi驅動的理解(1) 驅動架構

在分析wifi驅動前,分享一下個人對linux驅動的一些了解,其實縱觀linux眾多的裝置驅動,幾乎都是以匯流排為載體,所有的資料傳輸都是基於匯流排形式的,即使裝置沒有所謂的匯流排介面,但是linux還是會給它新增一條虛擬匯流排,如platform匯流排等 介於wifi的驅動實在是太龐大了,同時又是...

led點燈驅動

核心版本 linux 2.6.32.2 開發板 mini2440 include include include include include include include include include include include include define device name le...

LED驅動程式設計

通用輸入輸出介面的簡稱,s2440一共有130個gpio口,分為a j共9組 gpa,gpb,gpc gpj 通過設定相應的暫存器,可以選擇某個gpio口是用於輸入,輸出還是特定其他特殊功能。例如可以設定gph6口用於輸入輸出,或者是串列埠 每組gpio gpa gpj 都可以通過3個暫存器來控制與...