文章目录
- 1、硬件管脚确定
- 2、设备树配置
- 3、子系统配置
- 4、编译烧录
- 5、验证
- 5.1 设备树验证
- 5.2 驱动加载验证
- 5.3 效果验证
经过前面的层层关卡,终于到了我们的小试牛刀环节!
如何控制
LED
灯的亮灭?又如何实现LED
心跳灯的效果?
下面我以imx6ull
为例来实现!首先说明一点,无论在哪个平台上玩,底层原理万变不离其宗,我只能来总结其套路和方法,其中的细节必有差异!
1、硬件管脚确定
我们来控制LED
的时候,首先第一件事要做的就是明确要操作的LED
硬件设备,查看我们开发板对应的原理图
在这里我们RGB
灯,所对应因较为GPIO_4
、CSI_HSYNC
、CSI_VSYNC
,找到对应到芯片的引脚
可知GPIO_4
为引脚GPIO1_IO04
,CSI_HSYNC
为CSI_HSYNC
,CSI_VSYNC
为引脚CSI_VSYNC
。
2、设备树配置
明确我们的LED
引脚之后,我们就要配置设备树啦!
设备树的作用就是方便管理不同的硬件设备,说大实话就是:配置相关硬件设备,与内核子系统关联起来。
设备树一般怎么写?——照葫芦画瓢!
我们的内核驱动中,已经有各个驱动的设备树示例了,以LED
为例,我们可以参考
Documentation/devicetree/bindings/leds/leds-gpio.txt
Documentation/devicetree/bindings/gpio/gpio.txt
不同平台设备树编写也有所差异,请按照自己的开发板来进行配置。
设备树的相关知识点可以看我们的设备树章节的详解!
配置好的设备树如下:
/*
* Copyright (C) 2019 - All Rights Reserved by
* filename : imx-fire-led-overlay.dts
* brief : Device Tree overlay for EBF6ull led device
* author : embedfire
* date : 2019-11-15
* version : A001
*/
/dts-v1/;
/plugin/;
#include "../imx6ul-pinfunc.h"
#include "../imx6ull-pinfunc.h"
#include "dt-bindings/gpio/gpio.h"
/ {
fragment@0 {
target-path = "/";
__overlay__ {
normal_led{
compatible = "gpio-leds";
red {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_red>;
label = "red";
gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
default-state = "off";
linux,default-trigger = "none";
};
green {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_green>;
label = "green";
gpios = <&gpio4 20 GPIO_ACTIVE_LOW>;
default-state = "off";
linux,default-trigger = "none";
};
blue
{
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_blue>;
label = "blue";
gpios = <&gpio4 19 GPIO_ACTIVE_LOW>;
default-state = "off";
linux,default-trigger = "heartbeat";
};
};
};
};
fragment@1 {
target= <&iomuxc>;
__overlay__{
pinctrl_red:redgrp{
fsl,pins = < MX6UL_PAD_GPIO1_IO04__GPIO1_IO04 0x1b0b0 >;
};
pinctrl_green:grngrp{
fsl,pins = < MX6UL_PAD_CSI_HSYNC__GPIO4_IO20 0x1b0b0 >;
};
pinctrl_blue:bluegrp{
fsl,pins = <MX6UL_PAD_CSI_VSYNC__GPIO4_IO19 0x1b0b0 >;
};
};
};
};
在这里我们说明几个设备树属性:
linux,default-trigger
:该属性为默认触发的方式,我们在这里配置为heartbeat
心跳触发default-state
:该属性为LED
默认状态,即亮灭状态。
3、子系统配置
Linux
子系统默认未打开LED
子系统,如果我们要想使用LED
子系统需要打开如下配置
CONFIG_NEW_LEDS
CONFIG_LEDS_CLASS
CONFIG_LEDS_GPIO
如果需要触发器功能,需要打开:
CONFIG_LEDS_TRIGGERS
在这里我们选择对应的触发器,我们这里选择心跳触发器:
CONFIG_LEDS_TRIGGER_HEARTBEAT
4、编译烧录
到这里,我们已经配置好了LED
子系统所需要的信息,下面我们就进行编译设备树和内核,然后烧录!
这里不同平台也有差异,下面仅供参考。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- npi_v7_defconfig
make ARCH=arm -j4 CROSS_COMPILE=arm-linux-gnueabihf- dtbs
然后把生成的dtbo
替换到系统的指定位置中。
5、验证
烧录进系统之后,我们就到了验证阶段!
5.1 设备树验证
root@npi:~# cat /sys/firmware/devicetree/base/normal_led/
blue/ compatible green/ name red/
root@npi:~# cat /proc/device-tree/normal_led/
blue/ compatible green/ name red/
通过查看我们的devicetree
文件夹下面的节点,我们能够看到我们配置的red
、blue
、green
等节点,说明设备树配置生效!
5.2 驱动加载验证
root@npi:~# ls /sys/class/leds/
blue/ cpu/ green/ mmc0::/ mmc1::/ red/
驱动加载成功之后,我们能够在/sys/class/leds/
下面看到我们的设备节点。
5.3 效果验证
root@npi:~# echo 0 > /sys/class/leds/green/brightness #绿色等灭
root@npi:~# echo 1 > /sys/class/leds/green/brightness #绿色灯亮
root@npi:~# echo 0 > /sys/class/leds/red/brightness #红色等灭
root@npi:~# echo 1 > /sys/class/leds/red/brightness #红色灯亮
# 此时,我们上面将blue灯配置为heartbeat,这里蓝色灯在闪烁
到这里,我们的LED
子系统就告一段落了,同时也非常感谢大家的支持,支持原创,支持董哥!
点赞+关注,永远不迷路