openwrt/target/linux/bcm27xx/patches-5.10/950-0507-overlays-gpio-led-...

192 lines
7.5 KiB
Diff

From 095bad7f310809a951735d03be9d06938524a6bc Mon Sep 17 00:00:00 2001
From: Assaf Gordon <assafgordon@gmail.com>
Date: Fri, 12 Mar 2021 00:13:07 -0700
Subject: [PATCH] overlays: gpio-led: new overlay
Add generic connection between the kernel's LED framework and
RPI's GPIO pins.
Signed-off-by: Assaf Gordon <assafgordon@gmail.com>
---
arch/arm/boot/dts/overlays/Makefile | 1 +
arch/arm/boot/dts/overlays/README | 56 +++++++++++
.../boot/dts/overlays/gpio-led-overlay.dts | 97 +++++++++++++++++++
3 files changed, 154 insertions(+)
create mode 100755 arch/arm/boot/dts/overlays/gpio-led-overlay.dts
--- a/arch/arm/boot/dts/overlays/Makefile
+++ b/arch/arm/boot/dts/overlays/Makefile
@@ -54,6 +54,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
gpio-ir.dtbo \
gpio-ir-tx.dtbo \
gpio-key.dtbo \
+ gpio-led.dtbo \
gpio-no-bank0-irq.dtbo \
gpio-no-irq.dtbo \
gpio-poweroff.dtbo \
--- a/arch/arm/boot/dts/overlays/README
+++ b/arch/arm/boot/dts/overlays/README
@@ -914,6 +914,62 @@ Params: gpio GPIO pin
keycode Set the key code for the button
+
+Name: gpio-led
+Info: This is a generic overlay for activating LEDs (or any other component)
+ by a GPIO pin. Multiple LEDs can be set up using multiple calls to the
+ overlay. While there are many existing methods to activate LEDs on the
+ RPi, this method offers some advantages:
+ 1) Does not require any userspace programs.
+ 2) LEDs can be connected to the kernel's led-trigger framework,
+ and drive the LED based on triggers such as cpu load, heartbeat,
+ kernel panic, key input, timers and others.
+ 3) LED can be tied to the input state of another GPIO pin.
+ 4) The LED is setup early during the kernel boot process (useful
+ for cpu/heartbeat/panic triggers).
+
+ Typical electrical connection is:
+ RPI-GPIO.19 -> LED -> 300ohm resister -> RPI-GND
+ The GPIO pin number can be changed with the 'gpio=' parameter.
+
+ To control an LED from userspace, write a 0 or 1 value:
+ echo 1 > /sys/class/leds/myled1/brightness
+ The 'myled1' name can be changed with the 'label=' parameter.
+
+ To connect the LED to a kernel trigger from userspace:
+ echo cpu > /sys/class/leds/myled1/trigger
+ echo heartbeat > /sys/class/leds/myled1/trigger
+ echo none > /sys/class/leds/myled1/trigger
+ To connect the LED to GPIO.26 pin (physical pin 37):
+ echo gpio > /sys/class/leds/myled1/trigger
+ echo 26 > /sys/class/leds/myled1/gpio
+ Available triggers:
+ cat /sys/class/leds/myled1/trigger
+
+ More information about the Linux kernel LED/Trigger system:
+ https://www.kernel.org/doc/Documentation/leds/leds-class.rst
+ https://www.kernel.org/doc/Documentation/leds/ledtrig-oneshot.rst
+Load: dtoverlay=gpio-led,<param>=<val>
+Params: gpio GPIO pin connected to the LED (default 19)
+ label The label for this LED. It will appear under
+ /sys/class/leds/<label> . Default 'myled1'.
+ trigger Set the led-trigger to connect to this LED.
+ default 'none' (LED is user-controlled).
+ Some possible triggers:
+ cpu - CPU load (all CPUs)
+ cpu0 - CPU load of first CPU.
+ mmc - disk activity (all disks)
+ panic - turn on on kernel panic
+ heartbeat - indicate system health
+ gpio - connect to a GPIO input pin (note:
+ currently the GPIO PIN can not be set
+ using overlay parameters, must be
+ done in userspace, see examples above.
+ active_low Set to 1 to turn invert the LED control
+ (writing 0 to /sys/class/leds/XXX/brightness
+ will turn on the GPIO/LED). Default '0'.
+
+
Name: gpio-no-bank0-irq
Info: Use this overlay to disable GPIO interrupts for GPIOs in bank 0 (0-27),
which can be useful for UIO drivers.
--- /dev/null
+++ b/arch/arm/boot/dts/overlays/gpio-led-overlay.dts
@@ -0,0 +1,97 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * gpio-led - generic connection of kernel's LED framework to the RPI's GPIO.
+ * Copyright (C) 2021 House Gordon Software Company Ltd. <assafgordon@gmail.com>
+ *
+ * Based on information from:
+ * https://mjoldfield.com/atelier/2017/03/rpi-devicetree.html
+ * https://www.raspberrypi.org/documentation/configuration/device-tree.md
+ * https://www.kernel.org/doc/html/latest/leds/index.html
+ *
+ * compile with:
+ * dtc -@ -Hepapr -I dts -O dtb -o gpio-led.dtbo gpio-led-overlay.dts
+ *
+ * There will be some warnings (can be ignored):
+ * Warning (label_is_string): /__overrides__:label: property is not a string
+ * Warning (unit_address_vs_reg): /fragment@0/__overlay__/led_pins@0:
+ * node has a unit name, but no reg property
+ * Warning (unit_address_vs_reg): /fragment@1/__overlay__/leds@0:
+ * node has a unit name, but no reg property
+ * Warning (gpios_property): /__overrides__: Missing property
+ * '#gpio-cells' in node /fragment@1/__overlay__/leds@0/led
+ * or bad phandle (referred from gpio[0])
+ *
+ * Typical electrical connection is:
+ * RPI-GPIO.19 -> LED -> 300ohm resister -> RPI-GND
+ * The GPIO pin number can be changed with the 'gpio=' parameter.
+ *
+ * Test from user-space with:
+ * # if nothing is shown, the overlay file isn't found in /boot/overlays
+ * dtoverlay -a | grep gpio-led
+ *
+ * # Load the overlay
+ * dtoverlay gpio-led label=moo gpio=19
+ *
+ * # if nothing is shown, the overlay wasn't loaded successfully
+ * dtoverlay -l | grep gpio-led
+ *
+ * echo 1 > /sys/class/leds/moo/brightness
+ * echo 0 > /sys/class/leds/moo/brightness
+ * echo cpu > /sys/class/leds/moo/trigger
+ * echo heartbeat > /sys/class/leds/moo/trigger
+ *
+ * # unload the overlay
+ * dtoverlay -r gpio-led
+ *
+ * To load in /boot/config.txt add lines such as:
+ * dtoverlay=gpio-led,gpio=19,label=heart,trigger=heartbeat
+ * dtoverlay=gpio-led,gpio=26,label=brain,trigger=cpu
+ */
+
+/dts-v1/;
+/plugin/;
+
+/ {
+ compatible = "brcm,bcm2835";
+
+ fragment@0 {
+ // Configure the gpio pin controller
+ target = <&gpio>;
+ __overlay__ {
+ led_pin: led_pins@19 {
+ brcm,pins = <19>; // gpio number
+ brcm,function = <1>; // 0 = input, 1 = output
+ brcm,pull = <0>; // 0 = none, 1 = pull down, 2 = pull up
+ };
+ };
+ };
+ fragment@1 {
+ target-path = "/";
+ __overlay__ {
+ leds: leds@0 {
+ compatible = "gpio-leds";
+ pinctrl-names = "default";
+ pinctrl-0 = <&led_pin>;
+ status = "okay";
+
+ led: led {
+ label = "myled1";
+ gpios = <&gpio 19 0>;
+ linux,default-trigger = "none";
+ };
+ };
+ };
+ };
+
+ __overrides__ {
+ gpio = <&led>,"gpios:4",
+ <&leds>,"reg:0",
+ <&led_pin>,"brcm,pins:0",
+ <&led_pin>,"reg:0";
+ label = <&led>,"label";
+ active_low = <&led>,"gpios:8";
+ trigger = <&led>,"linux,default-trigger";
+ };
+
+};
+