簡介
? ? ? ? Linux內(nèi)核已經(jīng)集成LED燈驅(qū)動拱镐。Linux內(nèi)核的LED燈驅(qū)動采用platform框架茉继,因此我們只需要在設(shè)備樹文件中添加相應(yīng)LED節(jié)點即可携御;接下來我們學習如何在全志 a40i平臺下使用Linux內(nèi)核自帶的LED驅(qū)動來驅(qū)動 board 上LED。
開發(fā)環(huán)境介紹
- 主機操作系統(tǒng):Ubuntu14.04 64位
- 目標平臺:A40I (ARM Cortex-A7)
- 交叉工具鏈:arm-linux-gnueabi臀蛛,gcc5.3.1
- 內(nèi)核版本:3.10
使能Linux內(nèi)核自帶的LED驅(qū)動
? ? ? ? 使用Linux內(nèi)核自帶的LED燈驅(qū)動首先需要配置Linux內(nèi)核尿扯,使能自帶的LED燈驅(qū)動求晶;使能方法如下:
Step1. 打開Linux配置菜單
make ARCH=arm menuconfig
Step2. 打開LED驅(qū)動配置項
Device Drivers --->
[*] LED Support --->
<*> LED Support for GPIO connected LEDs
選擇 “LED Support for GPIO connected LEDs”,將其編譯進內(nèi)核衷笋,也即是在此選項上按下“Y”鍵(或通過空格鍵選擇)芳杏,使此選型前面變成“<*>”,如下圖所示:
在““LED Support for GPIO connected LEDs”上按下“h”鍵,打開幫助信息爵赵,如下圖:
從上圖可以看出吝秕,把Linux內(nèi)核自帶LED驅(qū)動編譯進內(nèi)核以后 ,CONFIG_LEDS_GPIO就會等于y空幻,Linux會根據(jù)CONFIG_LEDS_GPIO的值來選擇如何編譯LED燈驅(qū)動郭膛,如果為“y”,就將其編譯進內(nèi)核氛悬。
配置好Linux內(nèi)核后退出配置界面则剃,打開“.config”,可以看到CONFIG_LEDS_GPIO=y
Step3. 添加設(shè)備樹節(jié)點
根據(jù)內(nèi)核提供的LED設(shè)備樹節(jié)點添加參考說明文檔:
Documentation/devicetree/bindings/leds/leds-gpio.txt;
在設(shè)備樹文件中添加LED設(shè)備節(jié)點:
leds {
compatible = "gpio-leds";
pinctrl-names = "default";
status = "okay";
com: com-led {
label = "com";
gpios = <&pio PH 21 1 1 1 0>;
defaults-state = "off";
};
};
①如捅、創(chuàng)建LED燈設(shè)備leds棍现,如果板子上有多個LED燈的話,每個LED燈作為leds的子節(jié)點即可镜遣;
②己肮、leds節(jié)點的compatible屬性值必須為“gpio-leds”,由驅(qū)動文件決定悲关;
③谎僻、label,每個子節(jié)點都可以設(shè)置一個lable屬性寓辱,一般label屬性表示LED燈的名字艘绍,在sysfs中的表現(xiàn)如:/sys/class/leds/com
④、defaults-state:設(shè)置默認屬性值秫筏;on诱鞠,默認打開;off这敬,默認關(guān)閉航夺;keep,LED燈保持當前模式崔涂;
⑤阳掐、gpios屬性值:表示LED燈所使用的引腳,在不同的平臺下冷蚂,可能會有不同的配置語法缭保,對于a40i平臺,詳細參考A40I Pinctrl(GPIO)接口使用說明書V1.0.pdf:
應(yīng)用測試
使用了LED子系統(tǒng)驅(qū)動的設(shè)備帝雇,會被展現(xiàn)在/sys/class/leds目錄下
Func1.腳本測試
打開COM LED燈:
echo 1 > /sys/class/leds/com/brightness
關(guān)閉COM LED燈:
echo 0 > /sys/class/leds/com/brightness
Func2.系統(tǒng)調(diào)用測試
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
//ARM 開發(fā)板LED設(shè)備的路徑
#define LED_DEV_PATH "/sys/class/leds/com/brightness"
int main(int argc, char *argv[])
{
int res = 0;
int fd;
printf("This is the led demo\n");
//獲取LED燈的設(shè)備文件描述符
fd = open(LED_DEV_PATH , O_WRONLY);
if(fd< 0){
printf("Fail to Open %s device\n", LED_DEV_PATH );
exit(1);
}
while(1)
{
write(fd, "255", 3);
sleep(1);
write(fd, "0", 1);
sleep(1);
}
close(fd);
}