简介

要想了解leds-gpio子系统需要先了解下pinctrl子系统,简单来说pinctrl子系统用于帮助我们管理芯片引脚并自动完成引脚的初始化,而我们要做的只是在设备树中按照规定的格式写出想要的配置参数。

pinctrl子系统
用于对设备树中相关pin属性的实现,工作内容如下:

  • 获取设备树中的pin信息。
  • 根据获取到的pin信息来设置pin的复用功能。
  • 根据获取到的pin信息来设置pin的电气特性,比如上/下拉、速度、驱动能力等。
gpio子系统

gpio子系统用于初始化GPIO并且提供相应的API函数,比如设置输入输出、读取GPIO的值等。gpio_direction_output、gpio_free等等,在gpio.h中。

pinctrl子系统和gpio 子系统在驱动目录下分别有个对应的 .c 文件

分析

在内核源码中/driver目录中,搜索"gpio-leds"内容,找到对应的驱动leds-gpio.c中的compatible与设备树中的compatible一致。这样设备树中的配置才能与gpio-leds 联系在一起,具体的可以了解platform 框架,其实就是devices (硬件相关代码)和drviers(驱动程序) 分开。

设备树文件中led 描述如下
led.png
系统中proc/device-tree 显示的文件夹是各个设备树节点信息。如下图可以看到led目录下有个 blue 目录这个就是具体的设备,我们可以根据需求在设备树文件中blue 同级增加其他 led 设备描述来增加设备。
     其中linux,default-trigger = “heartbeet”; 用来设置这个led 设备触发条件的。如果不写默认是无出发。
proc.png
由于设备树中有 led 设备,此时 如下图 leds 目录下会有heartbeat 目录。目录下文件如图:
heartbeat.png
操作
亮灭控制
brightness文件 写入0 led 熄灭 或者写入1~255led 点亮,因为不是pwm 控制所以不会有亮度变化。
例如
echo 0 > brightness  //写入0
cat brightness  //查看写入是否成功或者当前状态
触发条件选择
在编译内核的时候又有选择需要支持什么类型的触发。
config.png
在不更改触发条件时,输出触发条件可以看出现在选择的是heartbeat
cat_heart.png
写入不同触发条件会有不同现象,当写入none led不会出现闪烁现象这时可以通过上面说明进行控制led 亮灭。