文章目錄
使用驅動框架的優勢
leds驅動框架相關
常用接口
led_classdev_register函數
led_classdev_unregister函數
在驅動中的使用
在用戶空間操作led
總結
點擊下方閱讀原文可訪問文中超鏈接
在前面已經用創建通用字符設備的方式完成了led的操作,本次總結記錄的是使用linux內核提供的leds驅動框架來點亮led燈,不同于前面應用程序通過設備節點來訪問,不過也是在應用程序中通過打開文件來訪問的。
使用驅動框架的優勢
linux內核為各種硬件進行分類,然后針對各類硬件實現一套比較標準的驅動框架,其中每類硬件共有屬性那一部分由內核開發者負責實現和維護,然后給驅動開發者留出接口用來完成具體硬件的特定操作部分。更加簡化了驅動開發者的編碼工作。
leds驅動框架相關
相關的源代碼位于drivers/leds/目錄內,頭文件位于include/linux/目錄內。
如果要使用leds驅動框架,首先要在內核中開啟相關的配置宏:
Device Drivers --->
[*] LED Support --->
<*> LED Class Support
啟動內核后可以在/sys/class/目錄下看到leds類,這也就是驅動框架中內核開發者完成的那一部分,之前是需要驅動開發者自己創建的,現在對于驅動開發者來說就只需要調用相關的接口創建設備即可。
常用接口
位于頭文件:include/linux/leds.h
led_classdev_register函數
用以在leds類下面創建設備。
static inline int led_classdev_register(struct device *parent,
struct led_classdev *led_cdev)
led_classdev_unregister函數
用以刪除在leds類下面創建的設備。
void led_classdev_unregister(struct led_classdev *led_cdev)
在驅動中的使用
從下面的代碼中可以看出比之前的代碼要簡化很多,只需要調用一個注冊設備的接口就可以了,省去了之前手動創建字符設備、設備類、file_operations結構(驅動框架未使用file_operations結構完成硬件操作,而是使用的另外一種方法)等步驟。
/*定義一個設備*/
struct led_classdev cdev;
static void s5pv210_led_brightness_set(struct led_classdev *led_cdev, enum led_brightness brightness)
{
unsigned int tmp;
if(brightness)
{
/*
硬件操作點亮led燈
*/
}
else
{
/*
硬件操作熄滅led燈
*/
}
}
static int __init test_init(void)
{
int ret = 0;
/*
省略其它操作
*/
/*填充定義的設備*/
cdev.brightness_set = s5pv210_led_brightness_set;
cdev.brightness = LED_OFF;
cdev.name = "led3";
cdev.flags |= LED_CORE_SUSPENDRESUME;
ret = led_classdev_register(NULL,&cdev);
if(ret < 0)
{
ret = -EINVAL;
}
return ret;
}
static void __exit test_exit(void)
{
led_classdev_unregister(&cdev);
/*
省略其它操作
*/
}
在用戶空間操作led
使用了驅動框架后可以不需要編寫應用程序就可以測試led是否能正常被點亮與熄滅,這些都可以在sysfs文件系統中完成。在裝載驅動后可以在/sys/class/leds/目錄下看到對應的led設備目錄,如本文中的led3(填充設備時的設備名字段)。
# ls /sys/class/leds/led3
brightness power uevent
max_brightness subsystem
使用echo命令操作led燈:
# 點亮led
echo 1 > brightness
# 熄滅led
echo 0 > brightness