本文的led驅動使用了核心提供的led框架介面,這種驅動實現與普通字元裝置驅動有著本質的區別。此外還融合了platform和gpiolib,需要結合這兩者來分析本驅動。
該驅動本質是:通過讀寫/sys/class/leds/***內的檔案,觸發led_classdev(裝置體)內的函式,從而實現操作硬體。
整體關係:
如果要使用核心的框架來寫驅動的話,必須要在menuconfig中新增框架模組,這樣才能夠呼叫框架介面函式 比如新增led的框架。device drivers —>led support 選y —> led class support 選y led class support下還有很多板級的led支援。我們就不用去勾選了led-class_comment.c這個檔案提供了有關led驅動框架的介面,裡面是led框架模組 leds_init是框架模組的載入函式,它主要負責建立led裝置類。類的名字是「leds」,而類的本質是乙個leds_class型別的結構體
static struct class *leds_class;//先定義指標
static int __init leds_init(void)
當「leds」這個類建立完後 ,我們就能夠在/sys/class/中找到leds這個類,建立完類我們才能建立「屬於這個類的裝置」,可以認為類是建立裝置的前提 這裡主要是通過 leds_class->dev_attrs規定裝置檔案的種類和樣式。dev_attrs是裝置屬性的意思,通過給它賦乙個特殊的資料結構(裡面包含了外設的硬體操作),我們就能夠在應用層通過/sys/class/leds/***裡的檔案間接訪問這個特殊的資料結構從而達到操作硬體的目的。**為:static struct device_attribute led_class_attrs = ;該結構體陣列設定了led硬體操作的物件和方法。分析可知,led類裝置的操作物件一共由3個brightness、max_brightness、trigger。意思是」led的亮滅狀態「、」led最高亮度值「、」led閃爍狀態「。對應的操作規則有讀寫,即show和store。除了led最高亮度值,它只能讀不能寫,因為它只是乙個引數罷了,而不是可以操作硬體。這些操作規則內部其實呼叫了裝置體led_classdev內的具體操作函式,也就是說當使用者層試圖寫brightness這個物件時,會觸發操作規則led_brightness_store。這個規則內部會呼叫我們裝置體內的具體函式。由前面那副圖可以很好的理解這個原理#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*設個全域性變數。用來給s5pv210_led_set傳參*/
unsigned int gpio_num = 0;
/*裝置體led_classdev內操作函式的具體實現*/
static void s5pv210_led_set(struct led_classdev *led_cdev,
enum led_brightness value)//引數value是列舉。0、127、255分別代表滅、半亮、全亮
else
}/*建立(例項化)裝置體*/
static struct led_classdev x210led;
/*自留地格式...提供給probe和release函式..讓它們可以解析platdata*/
extern struct s5pv210_led_platdata ;
/*platform驅動的probe(探測)函式與remove函式*/
static int s5pv210_led_probe(struct platform_device *pdev)
/*申請乙個gpio引腳資源*/
ret = gpio_request(pdata->gpio, pdata->name);
if (ret)
/*申請完後可以利用介面設定該gpio。也可以直接操作暫存器來設定*/
gpio_direction_output(pdata->gpio, 1);
return 0;
/*倒影式錯誤處理流程*/
out_err_1:
led_classdev_unregister(&x210led);
out_err_0:
return -einval;
}static int s5pv210_led_remove(struct platform_device *pdev)
/*定義我們的platform_driver。注意name要和platform_device中相同*/
static struct platform_driver s5pv210_led_driver = ,
};/*模組與解除安裝載入函式*/
static int __init s5pv210_led_init(void)
static void __exit s5pv210_led_exit(void)
module_init(s5pv210_led_init);
module_exit(s5pv210_led_exit);
/*模組描述資訊*/
module_license("gpl");
module_author("taurenking");
module_description("s5pv210 led driver");
module_alias("s5pv210 led driver");
總結流程 基於驅動框架寫led驅動
原文 1 參考s3c24xx led.c 2 關鍵點就是led classdev register 用這個led驅動框架中的註冊介面去註冊我們的led驅動,我們通過看sys class leds 目錄下的有沒有我們註冊的這個裝置驅動的名字。3 我們呼叫led classdev register這個l...
乙個簡單的LED驅動 不基於驅動框架
驅動 include include include include include include include static int led major 1 static struct class led mark class null static struct device led mar...
驅動框架之LED
1 驅動開發工程師 2 核心維護者 1 介面標準化 2 核心開發者應該盡量降低驅動開發者難度 1 驅動框架 2 核心維護者在核心中設計了一些 統一管控系統資源的 體系 3 一些特定的介面函式 一些特定的資料結構,這些是驅動框架的直接表現。1 drivers leds目錄 2 drivers leds...