linux-leds.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Vesa Jääskeläinen" <dachaac@gmail.com>
To: Pavel Machek <pavel@ucw.cz>,
	Jacek Anaszewski <jacek.anaszewski@gmail.com>
Cc: Dan Murphy <dmurphy@ti.com>,
	robh+dt@kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-leds@vger.kernel.org
Subject: Re: Generic RGB LED support was Re: [PATCH 2/2] leds: lp5024: Add the LP5024/18 RGB LED driver
Date: Wed, 9 Jan 2019 09:11:03 +0200	[thread overview]
Message-ID: <1c53d379-64e5-4e72-5236-de8db77a5048@gmail.com> (raw)
In-Reply-To: <20190108225952.GA13299@amd>

Hi Pavel,

On 09/01/2019 0.59, Pavel Machek wrote:
> Hi!
> 
>>>>> Grab yourself an RGB LED and play with it; you'll see what the
>>>>> problems are. It is hard to explain colors over email...
>>>>
>>>> Video [0] gives some overview of lp5024 capabilities.
>>>>
>>>> I don't see any problems in exposing separate red,green,blue
>>>> files and brightness for the devices with hardware support for
>>>> that.
>>>
>>> Well, that's what we do today, as three separate LEDs, right?
>>
>> No. It doesn't allow for setting color intensity by having
>> the color fixed beforehand. Below is relevant excerpt from
>> the lp5024 documentation. This is not something that can be
>> mapped to RGB color space, but rather to HSV/HSL, with the
>> reservation that the hardware implementation uses PWM
>> for setting color intensity.
> 
> So they have feature where they have independent controls for each
> channel, then one common control per three channels. Other chips have
> common control for all the LEDs, for example. We don't support that
> currently; lets focus on the RGB thing first.
> 
>>> I don't have problem with that, either; other drivers already do
>>> that. He's free to use existing same interface.
>>>
>>> But that is insufficient, as it does not allow simple stuff, such as
>>> turning led "white".
>>>
>>> So... perhaps we should agree on requirements, first, and then we can
>>> discuss solutions?
>>>
>>> Requirements for RGB LED interface:
>>>
>>> 1) Userspace should be able to set the white color
>>>
>>> 2) Userspace should be able to arbitrary color from well known list
>>> and it should approximately match what would CRT, LCD or OLED monitor display
>>
>> The difference is that monitor display driver is pre-calibrated
>> for given display by the manufacturer. With the LED controllers the
>> manufacturer has no control over what LEDs will be connected to the
>> iouts. Therefore it should be not surprising that colors produced
>> by custom LEDs are not as user would expect when comparing to
>> the RGB color displayed on the monitor display.
> 
> It is true that _chip_ manufacturer can not know what LEDs will be
> connected. But _system_ manufacturer can and should know that, and
> should tell be able to tell us in the dts.
> 
>> This renders your requirement 2) infeasible with use of custom LEDs
>> any fixed algorithm, since the final effect will always heavily depend
>> on the LED circuit design.
> 
> Depending on LED circuit design and actual LEDs connected is okay.. we
> just need to get information from _system_ designer (not chip
> designer), and pass it to a place where color is computed.
> 
>>> a) RGB LEDs are usually not balanced. Setting 100% PWM on
>>> red/green/blue channels will result in nothing close to white
>>> light. In fact, to get white light on N900, blue and green channel's
>>> PWM needs to be set pretty low, as in 5%.
>>>
>>> b) LED class does not define any relation between "brightness" in
>>> sysfs and ammount of light in lumens. Some drivers use close to linear
>>> relation, some use exponential relation. Human eyes percieve logarithm
>>> of lumens. RGB color model uses even more complex function.
>>
>> One general question: do you have any solutions in store?
> 
> I played with LEDs on N900 over the weekend, yes.
> 
> And getting reasonable colors seems to be possible, when a) and b) are
> solved... a) seems to be more important than b).
> 
> Now... this does not tell us how we should design kernel<->user
> interface, but it should tell us that main goals - 1) and 2) are
> possible.

I was thinking about this calibration and color correctness thing and I 
am thinking a bit that it should be partly in kernel and partly in user 
space.

For displays and printers there are defined icc-profiles that define how 
colors are mapped to particular device in cases when you want to have 
accurate color representation. In theory to get accurate LED output one 
could model LEDs with icc profile and then pick your color and convert 
it with icc profile to actual raw hardware values. Then this raw 
hardware value could be written from user space to kernel.

In kernel we could provide raw hardware value support and in case of PWM 
IC controlled LEDs we could provide curve mapping to linearize the 
behavior of values entered to enable use in cases where close enough is 
good enough.

Eg. if you want to have "white" then you have your color space picker 
like sRGB(255,255,255). Then you would define icc profile it might 
translate to hardware raw values 253%, 230%, 225%.

Then you would write this to kernel with:

# set red, green and blue color elements
echo "253 230 225" > color

In this case however behavior of brightness node is challening in 
accuracy domain. Britghtness value 255 would of course provide 1:1 
mapping in this case.

To go right to correct color and brightness at one go we could have 
optional brightness at the end of color value array:

# set red, green and blue color element and brightness setting:
echo "253 230 225 255" > color

If you want to have fancier behavior for brightness in your system then 
we probably need to have configurable brightness model.

- hardware, like in lp5024 case would map to hardware register (would be 
omitted if there is no such register)
- onoff, would act like light switch ON/OFF eg. either configured value 
or all zeroes.
- scaled, would multiply the color elements
- hsl, would use hsl formula
- and this can be extended later with some other models and allows us to 
start with with some models now.

We could define this in devicetree and from sysfs a bit like with trigger:

$ cat brightness_model
[hardware] onoff scaled hsl

$ echo "hsl" > brightness_model

$ cat brightness_model
hardware onoff scaled [hsl]

Then we could have "color_names" or such sysfs entry to determine allow 
user space auto detection of led elements):

$ cat color_names
red green blue

I suppose this model would provide flexibilty for multiple cases. Make 
it simple for most uses, allow accuracy with icc profiles for advanced 
users, would allow atomic color setting.

I have updated (not yet in github) my tests to use color array model and 
color_names already and can play with brightness_model thing if this is 
something that is good path?

What do you think?

Thanks,
Vesa Jääskeläinen

  reply	other threads:[~2019-01-09  7:11 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
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 [this message]
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=1c53d379-64e5-4e72-5236-de8db77a5048@gmail.com \
    --to=dachaac@gmail.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dmurphy@ti.com \
    --cc=jacek.anaszewski@gmail.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).