From: Jacek Anaszewski <jacek.anaszewski@gmail.com>
To: "Vesa Jääskeläinen" <dachaac@gmail.com>,
"Dan Murphy" <dmurphy@ti.com>, "Pavel Machek" <pavel@ucw.cz>
Cc: robh+dt@kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-leds@vger.kernel.org
Subject: Re: [PATCH 2/2] leds: lp5024: Add the LP5024/18 RGB LED driver
Date: Fri, 4 Jan 2019 20:12:53 +0100 [thread overview]
Message-ID: <cf6c0025-36e7-197b-b27a-1f31fb45cc38@gmail.com> (raw)
In-Reply-To: <c9f8965a-90f4-b456-8225-c70694c9f071@gmail.com>
Hi Vesa,
On 1/4/19 12:19 AM, Vesa Jääskeläinen wrote:
> Hi Jacek,
>
> Comments below.
>
> On 04/01/2019 0.05, Jacek Anaszewski wrote:
>> Hi Vesa,
>>
>> Thank you for sharing your ideas.
>>
>> Please find my comment below.
>>
>> On 1/1/19 2:45 PM, Vesa Jääskeläinen wrote:
>>> Hi All,
>>>
>>> On 20/12/2018 14.40, Vesa Jääskeläinen wrote:
>>>> Idea was to define preset colors in device tree as an example when
>>>> you are dealing with multi-color LEDs without PWM. In that case you
>>>> only have GPIOs to control and then have a problem what does those
>>>> GPIO's mean.
>>>>
>>>> With preset definitions one can use color names to act as a shortcut
>>>> to configure GPIO's to proper state for that particular color.
>>>>
>>>> For more flexible setups where you have PWM or such control you have
>>>> larger space of available colors. In this case you need to somehow
>>>> define also meaning of those controls.
>>>>
>>>> Also we may not have LED with only red, green and blue elements.
>>>> There might in example be amber, ultraviolet, white elements.
>>>>
>>>> This is where device tree is concerned. It helps us craft the
>>>> logical definition for LED so that we can control it from user space
>>>> in common way.
>>>>
>>>> Now the next problem then is how does user space work then.
>>>>
>>>> For multi-color LEDs it it important to change the color atomically
>>>> so that no wrong colors are being shown as user space got
>>>> interrupted when controlling it.
>>>>
>>>> Also we have brightness setting that would be useful for PWM
>>>> controlled LEDs.
>>>>
>>>> Setting color is easy when you use preset names then you only need
>>>> to deal with brightness value (eg. RGB -> HSV * brightness -> RGB).
>>>> Of course here additional problem is other color elements are they
>>>> then scaled according to brightness value?.
>>>>
>>>> Setting color as "raw" values is then next problem. In order to do
>>>> it atomically it needs to be one atomic activation and could be eg.
>>>> one write to "color" sysfs entry with combination of all color
>>>> elements and perhaps additionally also brightness value. Next
>>>> question is then what is the format for such entry then? What are
>>>> the value ranges? In here we can utilize device tree definition to
>>>> help define what kind of LED we do have and what kind of
>>>> capabilities it does have.
>>>>
>>>> Additional problem risen also in discussion was non-linearity of
>>>> some control mechanisms vs. perceived color. So there might be a
>>>> need for curve mapping similarly what is with backlight control and
>>>> that would be defined either in device tree and possibly in user
>>>> space if there is a need for that. I suppose golden curve definition
>>>> in device tree should be good enough.
>>>>
>>>> Then there was additional discussion about possible animation
>>>> support but I would leave that for future design as that would then
>>>> be utilizing the same framework.
>>>>
>>>> I suppose color space handling and that kind of stuff should be in
>>>> some led core functionality and then raw control should be part of
>>>> physical led driver.
>>>>
>>>> I was planning to play with it during holiday season but lets see
>>>> how it goes. Feel free to also experiment with the idea.
>>>
>>> I was playing with this and got some results with PWM LED driver. I
>>> would like to get feedback now even thou it is not yet ready for
>>> patch sending.
>>>
>>> They still need more work but the idea can be seen here:
>>> https://github.com/vesajaaskelainen/linux/tree/wip-multi-color-led
>>>
>>> This branch is now based on Linux kernel 4.20 release.
>>>
>>> Consider that branch as volatile as I will forcibly update it when
>>> there are updates.
>>>
>>> From there specifically in commits (while they last):
>>>
>>> drivers: leds: Add core support for multi color element LEDs
>>> https://github.com/vesajaaskelainen/linux/commit/55d553906d0a158591435bb6323a318462079d59
>>>
>>>
>>> WIP: drivers: leds: leds-pwm: Add multi color element LED support.
>>> https://github.com/vesajaaskelainen/linux/commit/efccef08cbf3b2e1e49b95b69ff81cd380519fe3
>>>
>>>
>>> What is there now:
>>>
>>> - led-core supports color elements
>>> - led-class supports users space configuration
>>> - both led-core and led-class are driver agnostic so they should be
>>> treated as generic code.
>>> - leds-pwm: my testing code with PWM led.
>>> - no HSV support for brightness as there could be multiple color
>>> elements out from traditional red-green-blue space or odd
>>> combinations of colors and they are a bit hard to map to HSV formula
>>> (and it needs fixed point math).
>>> - no color presets that could be optionally be selected
>>> - when I configure led trigger to heartbeat it actually blinks with
>>> color specified -- thou trigger gets zeroed out with one sets new
>>> color or brightness as that was previous functionality with brightness.
>>> - some documentation added
>>> - code should pass checkpatch
>>>
>>> What I was planning to do next:
>>>
>>> - cleanup PWM LED driver so that it works with and without
>>> LED_MULTI_COLOR_LED being defined.
>>> - improve documentation
>>> - try out how my other device behaves which have dual color element
>>> LED controlled with GPIO's and see how it would integrate to gpio-led
>>> driver.
>>>
>>> I would like to get feedback on:
>>> - Device tree idea
>>> - Internal logic
>>> - Should the trigger be really reseted when one changes value of
>>> brightness? I would think it should function like setting brightness
>>> entry from sysfs would set current brightness for trigger when it is
>>> lit. Setting color should change color and brightness and it should
>>> be active from there one until trigger is disabled from trigger sysfs
>>> node.
>>>
>>> My testing device has RGB LED with all color elements controlled with
>>> individual PWM channels from TI's AM335x's integrated PWM controller.
>>>
>>> In device tree I have following:
>>>
>>> multi-color-leds {
>>> compatible = "pwm-leds";
>>>
>>> status-led {
>>> label = "status";
>>>
>>> element-red {
>>> pwms = <&ehrpwm0 0 100000 0>;
>>> };
>>> element-green {
>>> pwms = <&ehrpwm1 0 100000 0>;
>>> };
>>> element-blue {
>>> pwms = <&ehrpwm1 1 100000 0>;
>>> };
>>> };
>>> };
>>>
>>> For my second test device I was planning to replace "pwms" with
>>> "gpios" or such entries.
>>>
>>> In user space one can use it like:
>>>
>>> # --- start of snippet ---
>>>
>>> hostname ~ # cd /sys/class/leds/
>>> hostname leds # ls
>>> status
>>> hostname leds # cd status
>>> hostname status # ls
>>> brightness color device max_brightness
>>> max_color power subsystem trigger uevent
>>> hostname status # cat color
>>> brightness=0 red=0 green=0 blue=0
>>
>> This breaks one-value-per-file sysfs rule.
>
> I believe you are referring to this text in:
> https://www.kernel.org/doc/Documentation/filesystems/sysfs.txt
>
> "Attributes should be ASCII text files, preferably with only one value
> per file. It is noted that it may not be efficient to contain only one
> value per file, so it is socially acceptable to express an array of
> values of the same type."
>
> I suppose if one would just make it an array of values (separated by
> space) and then one file with string array of color element names and on
> file with maximum value array it could be within those words.
>
> The it would be something like:
>
> $ echo "23 54 32" > color
Go ahead, but first convince Pavel, and then Greg :-)
I'd personally would not have much against, especially that the
list of values will not grow for that one like in case of old patch set
[0] where Pavel and Greg thwarted my similar attempt.
> $ cat max_color
> 255 255 255
>
> $ cat color_names
> red green blue
>
> In addition to this -- one could also export individual color element
> files.
>
>> Regarding led_scale_color_elements() - I checked it in GIMP and
>> the results are not satisfactory when increasing brightness.
>> Even if we managed to fix it, the result would not be guaranteed
>> to be the same across all devices.
>
> No and they will never be the same. I was told by our hardware expert
> that it is rather impossible to get linearly behaving LED control
> without special curve fitting trimmed for particular hardware and LED
> component in use. And if you go and change LED component/vendor it would
> need to be "calibrated" again if such accuracy would be required. Also
> LEDs age and that has also effect on this.
>> This is still the same problem.
>>
>> I have another proposal, being a mix of what has been discussed so far:
>>
>> RGB LED class will expose following files:
>> a) available by default:
>> - red, green, blue
>> Writing any of these file will result in writing corresponding
>> device register.
>
> Problem with this is that we are basically back at square one and one
> cannot do "atomic" color change with this.
>
> In order to set or activate new values one would need "load values" file
> or such that when writing to it would activate new values. However it
> becomes quite clumsy interface at that point as you need to handle
> multiple writes to multiple files and makes those operations rather slow.
>
> Then we have color presets left that could kinda solve the issue on
> setting the color to fixed values atomically.
That's why I proposed "color_space" file that is also a part of my
proposed design below.
> Of course one direction is what happened with gpio driver was own device
> node with ioctl's allowing more faster and more fancier control.
>
>> - color_space: it would accept color space, e,g. "hsv", that would
>> have to be supported by LED RGB core; setting color
>> space would create relevant files, e.g. for hsv
>> hue. saturation, brightness, and remove default ones
>> other "color spaces" could be defined in DT as
>> proposed by Vesa; reading this file would print
>> available color spaces
>>
>> b) available conditionally:
>> - brightness
>> It will be exposed by devices that have hardware support for
>> changing color brightness, like lp5024, or it will be made
>> available after setting relevant color space, like "hsv", or
>> other color presets defined in DT
>>
>> I think it will be flexible enough to meet everyone's needs.
>>
>> Current triggers would work only when brightness file is available.
>
> Or we could transition it in that case to simulated "on/off" type of
> thing. As that is what triggers more or less use.
>
> When "on" LED would have its configured color and when "off" LED would
> be turned off (eg. values of zero).
Yeah, it would be even better solution.
[0] https://www.spinics.net/lists/devicetree/msg69730.html
--
Best regards,
Jacek Anaszewski
next prev parent reply other threads:[~2019-01-04 19:12 UTC|newest]
Thread overview: 106+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-19 16:26 [PATCH 0/2] LP5024/18 LED introduction Dan Murphy
2018-12-19 16:26 ` [PATCH 1/2] dt: bindings: lp5024: Introduce the lp5024 and lp5018 RGB driver Dan Murphy
2018-12-28 23:53 ` Rob Herring
2018-12-31 18:54 ` Dan Murphy
2019-01-08 20:33 ` Jacek Anaszewski
2019-01-08 20:53 ` Dan Murphy
2019-01-08 21:16 ` Jacek Anaszewski
2019-01-08 21:22 ` Dan Murphy
2019-01-09 20:12 ` Jacek Anaszewski
2019-01-09 21:12 ` Dan Murphy
2019-01-09 21:28 ` Jacek Anaszewski
2019-01-09 21:31 ` Dan Murphy
2019-01-10 18:44 ` Jacek Anaszewski
2019-01-10 19:22 ` Dan Murphy
2019-01-10 19:57 ` Jacek Anaszewski
2019-01-10 20:43 ` Dan Murphy
2019-01-10 22:03 ` Jacek Anaszewski
2019-01-10 23:51 ` Dan Murphy
2019-01-11 12:38 ` Dan Murphy
2019-01-11 21:52 ` Jacek Anaszewski
2019-01-12 17:09 ` Dan Murphy
2019-01-12 19:48 ` Jacek Anaszewski
2019-01-14 12:27 ` Dan Murphy
2019-01-14 20:11 ` Jacek Anaszewski
2019-01-14 20:14 ` Dan Murphy
2019-01-14 20:28 ` Jacek Anaszewski
2019-01-14 20:29 ` Dan Murphy
2018-12-19 16:26 ` [PATCH 2/2] leds: lp5024: Add the LP5024/18 RGB LED driver Dan Murphy
2018-12-19 19:04 ` Dan Murphy
2018-12-19 19:34 ` Pavel Machek
2018-12-19 19:41 ` Dan Murphy
2018-12-19 20:10 ` Pavel Machek
2018-12-19 20:41 ` Dan Murphy
2018-12-19 21:36 ` Jacek Anaszewski
2018-12-19 21:50 ` Dan Murphy
2018-12-20 12:40 ` Vesa Jääskeläinen
2018-12-20 13:56 ` Dan Murphy
2019-01-01 13:45 ` Vesa Jääskeläinen
2019-01-03 22:05 ` Jacek Anaszewski
2019-01-03 23:19 ` Vesa Jääskeläinen
2019-01-03 23:34 ` Pavel Machek
2019-01-04 19:49 ` Vesa Jääskeläinen
2019-01-04 20:43 ` Pavel Machek
2019-01-04 19:12 ` Jacek Anaszewski [this message]
2019-01-04 20:12 ` Pavel Machek
2019-01-04 21:37 ` Jacek Anaszewski
2019-01-04 22:07 ` Pavel Machek
2019-01-05 12:16 ` Jacek Anaszewski
2019-01-05 12:31 ` Pavel Machek
2019-01-05 13:16 ` Jacek Anaszewski
2019-01-05 22:12 ` Generic RGB LED support was " Pavel Machek
2019-01-06 15:52 ` Jacek Anaszewski
2019-01-07 19:13 ` Jacek Anaszewski
2019-01-07 19:36 ` Dan Murphy
2019-01-07 20:59 ` Jacek Anaszewski
2019-01-07 21:14 ` Dan Murphy
2019-01-08 21:18 ` Jacek Anaszewski
2019-01-08 21:25 ` Dan Murphy
2019-01-10 12:46 ` Dan Murphy
2019-01-10 19:23 ` Jacek Anaszewski
2019-01-10 19:58 ` Dan Murphy
2019-01-10 21:02 ` Jacek Anaszewski
2019-01-10 21:07 ` Dan Murphy
2019-01-08 22:59 ` Pavel Machek
2019-01-09 7:11 ` Vesa Jääskeläinen
2019-01-13 16:37 ` Jacek Anaszewski
2019-01-05 0:39 ` Vesa Jääskeläinen
2019-01-07 19:34 ` Dan Murphy
2019-01-09 6:20 ` Vesa Jääskeläinen
2019-01-07 21:13 ` Jacek Anaszewski
2019-01-07 21:15 ` Dan Murphy
2019-01-09 6:46 ` Vesa Jääskeläinen
2019-01-13 16:36 ` Jacek Anaszewski
2018-12-20 20:31 ` Jacek Anaszewski
2018-12-21 7:32 ` Jacek Anaszewski
2018-12-21 13:05 ` Dan Murphy
2018-12-29 18:28 ` Jacek Anaszewski
2018-12-29 19:07 ` Pavel Machek
2018-12-30 17:09 ` Jacek Anaszewski
2018-12-30 17:35 ` Pavel Machek
2018-12-31 15:43 ` Jacek Anaszewski
2018-12-31 15:47 ` Jacek Anaszewski
2018-12-31 19:15 ` Dan Murphy
2019-01-01 14:42 ` Jacek Anaszewski
2019-01-01 18:11 ` Dan Murphy
2019-01-01 22:06 ` Jacek Anaszewski
2018-12-31 16:28 ` Pavel Machek
2019-01-01 14:26 ` Jacek Anaszewski
2018-12-19 22:03 ` Pavel Machek
2018-12-19 22:08 ` Dan Murphy
2018-12-19 22:27 ` Pavel Machek
2018-12-20 1:31 ` Dan Murphy
2018-12-20 9:06 ` Pavel Machek
2018-12-20 14:03 ` Dan Murphy
2019-01-08 21:10 ` Jacek Anaszewski
2019-01-08 21:17 ` Dan Murphy
2019-07-22 20:59 ` Backlight in motorola Droid 4 Pavel Machek
2019-07-23 15:53 ` Dan Murphy
2019-07-24 8:22 ` Pavel Machek
2019-07-24 12:45 ` Pavel Machek
2019-07-24 15:10 ` Dan Murphy
2019-07-24 15:22 ` Dan Murphy
2019-07-26 14:38 ` Dan Murphy
2019-07-29 22:00 ` Pavel Machek
2019-07-30 18:21 ` Dan Murphy
2019-07-30 21:52 ` Pavel Machek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cf6c0025-36e7-197b-b27a-1f31fb45cc38@gmail.com \
--to=jacek.anaszewski@gmail.com \
--cc=dachaac@gmail.com \
--cc=devicetree@vger.kernel.org \
--cc=dmurphy@ti.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-leds@vger.kernel.org \
--cc=pavel@ucw.cz \
--cc=robh+dt@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).