Dan,

Thanks for the update.

On 4/28/20 6:03 PM, Dan Murphy wrote:
Introduce a multicolor class that groups colored LEDs
within a LED node.

The multi color class groups monochrome LEDs and allows controlling two
aspects of the final combined color: hue and lightness. The former is
controlled via the intensity file and the latter is controlled
via brightness file.

Signed-off-by: Dan Murphy <dmur...@ti.com>
---
  .../ABI/testing/sysfs-class-led-multicolor    |  34 +++
  Documentation/leds/index.rst                  |   1 +
  Documentation/leds/leds-class-multicolor.rst  |  88 ++++++++
  MAINTAINERS                                   |   8 +
  drivers/leds/Kconfig                          |  10 +
  drivers/leds/Makefile                         |   1 +
  drivers/leds/led-class-multicolor.c           | 210 ++++++++++++++++++
  include/linux/led-class-multicolor.h          | 121 ++++++++++
  8 files changed, 473 insertions(+)
  create mode 100644 Documentation/ABI/testing/sysfs-class-led-multicolor
  create mode 100644 Documentation/leds/leds-class-multicolor.rst
  create mode 100644 drivers/leds/led-class-multicolor.c
  create mode 100644 include/linux/led-class-multicolor.h

diff --git a/Documentation/ABI/testing/sysfs-class-led-multicolor 
b/Documentation/ABI/testing/sysfs-class-led-multicolor
new file mode 100644
index 000000000000..7d33a82a4b07
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-class-led-multicolor
@@ -0,0 +1,34 @@
+What:          /sys/class/leds/<led>/brightness
+Date:          March 2020
+KernelVersion: 5.8
+Contact:       Dan Murphy <dmur...@ti.com>
+Description:   read/write
+               Writing to this file will update all LEDs within the group to a
+               calculated percentage of what each color LED intensity is set
+               to. The percentage is calculated for each grouped LED via the
+               equation below:
+
+               led_brightness = brightness * multi_intensity/max_brightness
+
+               For additional details please refer to
+               Documentation/leds/leds-class-multicolor.rst.
+
+               The value of the color is from 0 to
+               /sys/class/leds/<led>/max_brightness.
+
+What:          /sys/class/leds/<led>/multi_index
+Date:          March 2020
+KernelVersion: 5.8
+Contact:       Dan Murphy <dmur...@ti.com>
+Description:   read
+               The multi_index array, when read, will output the LED colors
+               by name as they are indexed in the multi_intensity file.
+
+What:          /sys/class/leds/<led>/multi_intensity
+Date:          March 2020
+KernelVersion: 5.8
+Contact:       Dan Murphy <dmur...@ti.com>
+Description:   read/write
+               Intensity level for the LED color within the array.
+               The intensities for each color must be entered based on the
+               multi_index array.
diff --git a/Documentation/leds/index.rst b/Documentation/leds/index.rst
index 060f4e485897..bc70c6aa7138 100644
--- a/Documentation/leds/index.rst
+++ b/Documentation/leds/index.rst
@@ -9,6 +9,7 @@ LEDs
leds-class
     leds-class-flash
+   leds-class-multicolor
     ledtrig-oneshot
     ledtrig-transient
     ledtrig-usbport
diff --git a/Documentation/leds/leds-class-multicolor.rst 
b/Documentation/leds/leds-class-multicolor.rst
new file mode 100644
index 000000000000..7e4907a5c87b
--- /dev/null
+++ b/Documentation/leds/leds-class-multicolor.rst
@@ -0,0 +1,88 @@
+====================================
+MultiColor LED handling under Linux
+====================================
+
+Description
+===========
+The multicolor class groups monochrome LEDs and allows controlling two
+aspects of the final combined color: hue and lightness. The former is
+controlled via the multi_intensity array file and the latter is controlled
+via brightness file.
+
+Multicolor Class Control
+========================
+The multicolor class presents files that groups the colors as indexes in an
+array.  These files are children under the LED parent node created by the
+led_class framework.  The led_class framework is documented in led-class.rst
+within this documentation directory.
+
+Each colored LED will be indexed under the multi_* files. The order of the
+colors will be arbitrary. The multi_index file can be read to determine the
+color name to indexed value.
+
+The multi_index file is an array that contains the string list of the colors as
+they are defined in each multi_* array file.
+
+The multi_intensity is an array that can be read or written to for the
+individual color intensities.  All elements within this array must be written 
in
+order for the color LED intensities to be updated.
+
+The num_multi_leds file returns the total number of LEDs that are presented in
+each multi_* array.

It is no longer present in this version.

+
+Directory Layout Example
+========================
+root:/sys/class/leds/multicolor:status# ls -lR
+-rw-r--r--    1 root     root          4096 Oct 19 16:16 brightness
+-r--r--r--    1 root     root          4096 Oct 19 16:16 multi_index
+-rw-r--r--    1 root     root          4096 Oct 19 16:16 multi_intensity

What about max_brightness?

+
+Multicolor Class Brightness Control
+===================================
+The multicolor class framework will calculate each monochrome LEDs intensity.
+
+The brightness level for each LED is calculated based on the color LED
+intensity setting divided by the parent max_brightness setting multiplied by

Parent is counter-intuitive in this case. I'd call it global.

+the requested brightness.
+
+led_brightness = brightness * multi_intensity/max_brightness
+
+Example:
+A user first writes the multi_intensity file with the brightness levels
+for each LED that are necessary to achieve a certain color output from a
+multicolor LED group.
+
+cat /sys/class/leds/multicolor:status/multi_index
+green blue red
+
+echo 43 226 138 > /sys/class/leds/multicolor:status/multi_intensity
+
+red -
+       intensity = 138
+       max_brightness = 255
+green -
+       intensity = 43
+       max_brightness = 255
+blue -
+       intensity = 226
+       max_brightness = 255
+
+The user can control the brightness of that multicolor LED group by writing the
+parent 'brightness' control.  Assuming a max_brightness of 255 the user

s/parent/global/

+may want to dim the LED color group to half.  The user would write a value of
+128 to the parent brightness file then the values written to each LED will be

Ditto.

+adjusted base on this value.
+
+cat /sys/class/leds/multicolor:status/max_brightness
+255
+echo 128 > /sys/class/leds/multicolor:status/brightness
+
+adjusted_red_value = 128 * 138/255 = 69
+adjusted_green_value = 128 * 43/255 = 21
+adjusted_blue_value = 128 * 226/255 = 113
+
+Reading the parent brightness file will return the current brightness value of

Ditto.

--
Best regards,
Jacek Anaszewski

Reply via email to