0%

基于全志A40i进行LED驱动编写

简介

Linux内核已经集成LED灯驱动。Linux内核的LED灯驱动采用platform框架,因此我们只需要在设备树文件中添加相应LED节点即可;接下来我们学习如何在全志a40i平台下使用Linux内核自带的LED驱动来驱动 board 上LED。

开发环境介绍

主机操作系统:Ubuntu14.04 64位
目标平台:A40I (ARM Cortex-A7)
交叉工具链:arm-linux-gnueabi,gcc5.3.1
内核版本:3.10

使能Linux内核自带的LED驱动

使用Linux内核自带的LED灯驱动首先需要配置Linux内核,使能自带的LED灯驱动;使能方法如下:

Step1. 打开Linux配置菜单

1
make ARCH=arm menuconfig

Step2. 打开LED驱动配置项

1
2
3
Device Drivers  ---> 
[*] LED Support --->
<*> LED Support for GPIO connected LEDs

选择 “LED Support for GPIO connected LEDs”,将其编译进内核,也即是在此选项上按下“Y”键(或通过空格键选择),使此选型前面变成“<*>”,如下图所示:

14336242-b87e8d3fc56dba02.webp

在““LED Support for GPIO connected LEDs”上按下“h”键,打开帮助信息,如下图:

14336242-95ab6db64008a575.webp

从上图可以看出,把Linux内核自带LED驱动编译进内核以后,CONFIG_LEDS_GPIO就会等于y,Linux会根据CONFIG_LEDS_GPIO的值来选择如何编译LED灯驱动,如果为“y”,就将其编译进内核。
配置好Linux内核后退出配置界面,打开“.config”,可以看到CONFIG_LEDS_GPIO=y

Step3. 添加设备树节点

根据内核提供的LED设备树节点添加参考说明文档:
Documentation/devicetree/bindings/leds/leds-gpio.txt;
在设备树文件中添加LED设备节点:

1
2
3
4
5
6
7
8
9
10
11
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";
};
};

①、创建LED灯设备leds,如果板子上有多个LED灯的话,每个LED灯作为leds的子节点即可;
②、leds节点的compatible属性值必须为“gpio-leds”,由驱动文件决定;
③、label,每个子节点都可以设置一个lable属性,一般label属性表示LED灯的名字,在sysfs中的表现如:/sys/class/leds/com
④、defaults-state:设置默认属性值;on,默认打开;off,默认关闭;keep,LED灯保持当前模式;
⑤、gpios属性值:表示LED灯所使用的引脚,在不同的平台下,可能会有不同的配置语法,对于a40i平台,详细参考A40I Pinctrl(GPIO)接口使用说明书V1.0.pdf:

应用测试

使用了LED子系统驱动的设备,会被展现在/sys/class/leds目录下

Func1.脚本测试

打开COM LED灯:

1
echo 1 > /sys/class/leds/com/brightness

关闭COM LED灯:

1
echo 0 > /sys/class/leds/com/brightness

Func2.系统调用测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>

//ARM 开发板LED设备的路径
#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灯的设备文件描述符
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);
}

最后编辑于 :2020.03.12 18:36:51
©著作权归作者所有,转载或内容合作请联系作者

作者:JalynFong
链接:https://www.jianshu.com/p/e5ecd92c0787
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。