對leds-gpio驅動有乙個整體概念。
一、概述
leds-gpio封裝得十分好,只需要提供可正常使用的gpio即可。另外還具備觸發器功能,其實就是控制led的亮滅(及頻率)。比如default-on是點亮led燈的觸發器,沒有取消前一直亮著。heartbeat是心跳觸發器,經筆者實踐,此觸發器是快速閃爍2次,然後滅掉,滅掉時間較亮的時間長。timer為定時觸發器,即1hz內亮滅。其它還有如ide硬碟、mmc、cpu觸發器,就不一一介紹了。
leds驅動位於drivers/leds目錄。leds-gpio驅動名稱為「leds-gpio」,驅動檔案為drivers/leds/leds-gpio.c。
觸發器驅動位於drivers/leds/trigger目錄。
二、核心配置
本文基於linux 3.17.1版本核心進行分析。
device drivers->
-*- led support --->
led class support # 與使用者空間互動的
led support for gpio connected leds # 可為模組,也可編譯到核心中
-*- led trigger support ---> #觸發器,最好編譯到核心中(即選項「*」)
<*> led timer trigger
<*> led one-shot trigger
<*> led heartbeat trigger
<*> led backlight trigger
[*] led cpu trigger
<*> led gpio trigger
<*> led default on trigger
從配置中看到,筆者將led觸發器全部編譯到核心中。這樣方便使用和選擇。
三、裝置註冊及使用
3.1 led相關結構體
驅動開發者使用gpio_led對led進行賦值,包括led名稱、gpio引腳號、燈亮是哪個電平,還有預設狀態。gpio_led結構體定義如下:
struct gpio_led ;
另外還要填寫gpio_led_platform_data結構體,其定義如下:
struct gpio_led_platform_data ;
乙個例項如下:
static struct gpio_led gpio_leds = ,,};
static struct gpio_led_platform_data gpio_led_info = ;
從結構體中知道,系統有2個led,乙個紅燈,乙個綠燈,都是低電平燈亮。
3.2 led平台裝置
leds-gpio驅動定義如下(drivers/leds/leds-gpio.c):
static struct platform_driver gpio_led_driver = ,
};module_platform_driver(gpio_led_driver);
從gpio_led_driver結構體中可以看到驅動名稱為leds-gpio。因此要使用這個驅動,必須另外定義乙個platform裝置,並呼叫函式platform_device_register註冊。本文例項如下:
最後,註冊leds裝置——建議在板子的gpio正常工作之後再進行註冊。
platform_device_register(&leds_gpio); // 註冊leds裝置
注意,如果是以modules形式動態載入的話,必須要適合的地方如remove函式在解除安裝leds裝置:
platform_device_unregister(&leds_gpio); // 解除安裝leds裝置
四、應用例項
led裝置和驅動都正常情況下,系統啟動後,會產生/sys/bus/platform/devices/leds-gpio/leds目錄,其下分別有red和green兩個子目錄。可以分別對不同的紅色led和綠色led做操作。
4.1 亮滅led
將1或0寫入brightness檔案即可控制亮滅。
示例如下:
echo 0 > /sys/bus/platform/devices/leds-gpio/leds/green/brightness
echo 0 > /sys/bus/platform/devices/leds-gpio/leds/red/brightness
echo 1 > /sys/bus/platform/devices/leds-gpio/leds/green/brightness
echo 1 > /sys/bus/platform/devices/leds-gpio/leds/red/brightness
4.1 觸發器
直接檢視trigger檔案,即可知道當前系統支援的觸發器,示例:
cat /sys/bus/platform/devices/leds-gpio/leds/red/trigger
[none] timer oneshot heartbeat backlight gpio cpu0 default-on mmc0 mmc1 mmc2
在前面的驅動中注釋掉了trigger,所以現在是none。
設定觸發器很簡單,使用ecoh將需要的觸發器名稱寫入trigger檔案即可。注意,寫入的字串一定是trigger檔案已經存在的,否則會提示引數非法。寫入心跳觸發器示例:
echo heartbeat > /sys/bus/platform/devices/leds-gpio/leds/red/trigger
此時板子上紅燈應會閃爍。
再次檢視:
cat /sys/bus/platform/devices/leds-gpio/leds/red/trigger
none timer oneshot [heartbeat] backlight gpio cpu0 default-on mmc0 mmc1 mmc2
設定值已經生效了。
參考資源:
1、核心原始碼官網:
2、核心原始碼查詢:
一、前言
用於非pmic的led,linux內部有對應的庫可以直接呼叫。
二、config檔案
config_leds_trigger_timer=y
config_leds_gpio=y
使能核心的led gpio模組
三、dts描述
新增gpio-led的具體描述
gpio-leds ;
};四、許可權新增
gpio-led中亮滅時間的節點預設為644,因此需要補充加上讀寫許可權
//drivers/leds/trigger/ledtrig-timer.c
static device_attr(delay_on, 0666, led_delay_on_show, led_delay_on_store);
static device_attr(delay_off, 0666, led_delay_off_show, led_delay_off_store);
但是直接這樣修改,會發現核心編譯會報錯誤,這是因為修改/sys檔案系統下的檔案許可權,會受到verify_octal_permissions的許可權檢查。詳細內容檢視include/linux/kernel.**件中的定義
//include/linux/kernel.h
#define verify_octal_permissions(perms) \
(build_bug_on_zero((perms) < 0) + \
build_bug_on_zero((perms) > 0777) + \
/* user_readable >= group_readable >= other_readable */ \
build_bug_on_zero((((perms) >> 6) & 4) < (((perms) >> 3) & 4)) + \ build_bug_on_zero((((perms) >> 3) & 4) < ((perms) & 4)) + \
/* user_writable >= group_writable */ \
build_bug_on_zero((((perms) >> 6) & 2) < (((perms) >> 3) & 2)) + \
/* other_writable? generally considered a bad idea. */ \
build_bug_on_zero((perms) & 2) + \
(perms))
這裡從注釋上也看的比較清晰許可權的要求:
1.user perms >= group perms >= other perms
即所有者許可權》=組使用者許可權》=其他人許可權
也就是說 類似0466的這種許可權是不允許的
2. other writable? generally considered a bad idea.
不允許其他使用者寫的許可權
build_bug_on_zero(e) 表示的就是若表示式e結果為0,則編譯通過,該巨集的值也為0;若表示式e的結果不為0,則編譯不通過。
因此只需要將最後乙個檢查:其他使用者可寫,這一項刪除即可
build_bug_on_zero((perms) & 2) + /
五、測試功能
//10hz 閃爍
echo timer > /sys/class/leds/led-blink/trigger
echo 50> /sys/class/leds/led-blink/delay_on
echo 50> /sys/class/leds/led-blink/delay_off
Linux中的時鐘概念Linux中的時鐘概念
linux的時鐘中斷中涉及至二個全域性變數乙個是xtime,另乙個則是jiffies。有乙個與時間有關的時鐘 實時時鐘 rtc 這是乙個硬體時鐘,用來持久存放系統時間,系統關閉後靠主機板上的微型電池保持計時。系統啟動時,核心 通過讀取rtc來初始化wall time,並存放在xtime變數中,即xt...
Linux 中 的程序
1.fork 與vfork 的區別 vfork 使用中父子程序共享虛擬記憶體空間,fork 則不是 vfork保證子程序先執行 而fork的父子程序執行順序是不定的,它取決於核心的排程演算法 example 1 include include include int main else printf...
linux中的查詢
無論在哪個作業系統,查詢都是常用操作,本文說一下linux中的查詢。1.find find最常用,引數也一大把,舉個最常用的 find type f name c exec grep l 這個就是在當前目錄 查詢所有含有 字串的c程式原始檔,通過這個例子,大家應該會用了。find功能很強大,有興趣自...