linux中leds gpio的問題描述

2021-10-01 16:35:28 字數 4751 閱讀 6482

對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功能很強大,有興趣自...