Vesa

On 1/19/19 1:11 PM, Vesa Jääskeläinen wrote:
> Hi Jacek et al,
> 
> On 17/01/2019 23.08, Jacek Anaszewski wrote:
>> On 1/16/19 11:55 AM, Pavel Machek wrote:
>>> Hi!
>>>
>>>> On 1/15/19 4:22 PM, Pavel Machek wrote:
>>>>> Hi!
>>>>>
>>>>>>> +The 24-bit RGB value passed in follows the pattern 0xXXRRGGBB
>>>>>>> +XX - Do not care ignored by the driver
>>>>>>> +RR - is the 8 bit Red LED value
>>>>>>> +GG - is the 8 bit Green LED value
>>>>>>> +BB - is the 8 bit Blue LED value
>>>>>>> +
>>>>>>> +Example:
>>>>>>> +LED module output 4 of the LP5024 will be a yellow color:
>>>>>>> +echo 0xe6de00 > /sys/class/leds/lp5024\:led4_mod/color
>>>>>>> +
>>>>>>> +LED module output 4 of the LP5024 will be dimmed 50%:
>>>>>>> +echo 0x80 > /sys/class/leds/lp5024\:led4_mod/brightness
>>>>>>> +
>>>>>>> +LED banked RGBs of the LP5036 will be a white color:
>>>>>>> +echo 0xffffff > /sys/class/leds/lp5036\:led_banked/color
>>>>>>
>>>>>> This part with example cans remain in Documentation/leds if you
>>>>>>> like.
>>>>>
>>>>> Does it actually work like that on hardware?
>>>>
>>>> What?
>>>
>>> If you do echo 0xffffff > /sys/class/leds/lp5036\:led_banked/color,
>>> does it actually produce white? With all the different RGB modules
>>> manufacturers can use with lp5024P?
>>>
>>> If you do echo 0xe6de00 > /sys/class/leds/lp5024\:led4_mod/color, does
>>> it actually produce yellow, with all the different RGB modules
>>> manufacturers can use with lp5024P?
>>
>> Vesa proposed using icc-profiles to make the colors looking similar
>> on various LEDs. It was in reply to your message with requirements
>> for RGB LED class.
>>
>> For this device we can however do without it. Videos showing the
>> performance of this particular device with a reference design using
>> RGB LEDs prove it works nice.
>>
>>>>> Is it supposed to support "normal" RGB colors as seen on monitors?
>>>>
>>>> Monitors are not an application for this part.
>>>
>>> You did not answer the question. When you talk about yellow, is it
>>> same yellow the rest of world talks about?
>>>
>>>>> Because 100% PWM on all channels does not result in white on hardware
>>>>> I have.
>>>>
>>>> I don't know I am usually blinded by the light and have no diffuser over
>>>> the LEDs to disperse the light so when I look I see all 3 colors.
>>>
>>> How can we have useful discussion about colors when you don't see the
>>> colors?
>>>
>>> Place a piece of paper over the LEDs....
>>>
>>>>> But...
>>>>>
>>>>> I believe we should have a reasonable design before we do something
>>>>> like this. There's no guarantee someone will not use lp50xx with just
>>>>> the white LEDs for example. How will this work? Plus existing hardware
>>>>> already uses three separate LEDs for RGB LED. Why not provide same
>>>>> interface?
>>>>
>>>> Which existing hardware?  Are they using this part?
>>>
>>> Nokia N900. They are not using this part, but any interface we invent
>>> should work there, too.
>>>
>>>> <rant>
>>>> Why are we delaying getting the RGB framework or HSV in?
>>>> I would rather design against something you want instead of having
>>>> everyone complain about every implementation I post.
>>>> </rant>
>>>
>>> Because you insist on creating new kernel interfaces, when existing
>>> interfaces work, and are doing that badly.
>>>
>>> Because your patches are of lower quality than is acceptable for linux
>>> kernel.
>>
>> Lets keep things civil please.
>>
>> This sentence should look familiar to you - it's not the first time
>> you resort to this type of narration.
>>
>>> Because you don't seem to be reading the emails.
>>>
>>> I sent list of requirements for RGB led support. This does not meet
>>> them.
>>
>> And you didn't respond to the comments from Vesa. The requirements
>> has not been acclaimed.
>>
>>>> It is not a normal RGB driver.  The device collates the individual RGB
>>>> clusters into a single brightness register and you can modify the 
>>>> intensity of the individual
>>>> LEDs via other registers.  If brightness is 0 then the cluster is OFF 
>>>> regardless of the color
>>>> set in the individual registers.
>>>
>>> I understand that. So just set cluster brightness to 255 and you have
>>> normal RGB driver you can control with existing interfaces. You don't
>>> have to use every feature your hardware has.
>>
>> This feature is one of the core advantages of this device.
>>
>>> You did not answer the "what if someone uses this with all white LEDs"
>>> question.
>>>
>>> You know what? First, submit driver with similar functionality to
>>> existing RGB drivers, using same interface existing drivers are
>>> using. When that is accepted, we can talk about extending
>>> kernel<->user interfaces.
>>
>> This stands in contradiction with my request.
>>
>> Provided there will be no other NAKs, I am eager to accept the
>> interface with color and brightness files.
>>
>> Moreover, I think that RGB LED class with configurable
>> brightness-model, and with possible color range adjustments via
>> icc-profiles or something similar, is the best solution that has been 
>> proposed so far. It is just flexible.
>>
>> I'd like to capitalize on the ideas shared in this thread and have
>> finally LED RGB class materialized.
>>
> 
> I have now updated my github code with my understanding of the discussion:
> https://github.com/vesajaaskelainen/linux/tree/wip-multi-color-led
> 

Maybe I did not see it but a RFC to the list would be good for discussion 
points.

> Commits:
> - dt-bindings: leds: Introduce linux,default-brightness-model for all leds
> https://github.com/vesajaaskelainen/linux/commit/4ffb21d644056686096226bbede7c8c78b0254c2
> - drivers: leds: Add core support for multi color element LEDs
> https://github.com/vesajaaskelainen/linux/commit/627f38bb78cebc694b8e6d735fb088c87925435d
> - dt-bindings: leds: leds-pwm: Introduce multi color element leds support
> https://github.com/vesajaaskelainen/linux/commit/ef6c5730d621e79ea0b02470caa83bc39439536a
> - WIP: drivers: leds: leds-pwm: Add multi color element LED support.
> https://github.com/vesajaaskelainen/linux/commit/0430a27823d9162926424b32c23be1c53eb9cbe2
> 
> First two commits are common and could be taken before I am happy with the 
> pwm led driver changes. This new conditional feature flag makes it a bit 
> harder. Of course one option would be to require it to be enabled.
> 
> Current set of concepts:
> - brightness-model: hardware, onoff, linear

Seem to be missing logarithmic

>   - could be extended in future with other modes like hsv if wanted
> - led_common_setup_of: helper for setting up common parts of led class device 
> from devicetree.
> - led_color_element_setup_of: helper for setting up color element parts of 
> led class device from devicetree.
> - led_scale_color_elements: single point helper for handling brightness-model.
> - From user space point-of-view atomic changes for color elements and 
> brightness.
> 
> Sysfs interfaces:
> - brightness_model: Change of brightness model on the fly. Similar if as 
> trigger selection.
> - color: configuring all color element values as array of values with support 
> for optional brightness entry as last value.
> - color_names: information for user space about color element values in 
> 'color' array.
> - max_color: information for user space about maximum values for entries in 
> 'color' array.
> 
> Example usage:
> 
> $ cd /sys/class/leds/status
> 
> $ ls
> brightness        brightness_model  color             color_names device      
>       max_brightness    max_color         power subsystem         trigger     
>       uevent
> 
> $ cat brightness_model
> hardware [onoff] linear
> $ cat color_names
> red green blue
> $ cat max_color
> 255 255 255
> $ cat brightness
> 0
> 

What happens if brightness is set?  Is that ignored?
What is the driver supposed to do?
The LP50xx can set brightness independent of color but other devices cannot do 
that.

> # Setting up color to not so bright purple with brightness set to 255
> $ echo "32 0 32 255" > color
> 
> # Setting up color to a bit brighter purple with brightness
> $ echo "128 0 128 255" > color
> 
> # Activate heartbeat blinking
> $ echo "heartbeat" > trigger
> 
> # Now led is blinking with purple color
> 
> # Change color to green
> $ echo "0 255 0" > color
> 
> # Now led is blinking with green color
> 
> And in devicetree I had now:
> 
> multi-color-leds {
>     compatible = "pwm-leds";
> 
>     status-led {
>         label = "status";
>         linux,default-brightness-model = "onoff";
> 
>         element-red {
>             pwms = <&ehrpwm0 0 100000 0>;
>         };
>         element-green {
>             pwms = <&ehrpwm1 0 100000 0>;
>         };
>         element-blue {
>             pwms = <&ehrpwm1 1 100000 0>;
>         };
>     };
> };
> 
> What do you think is this something we agree and could go forward?
> 
> If it is it would be a good idea to get feedback from Dan on how easy it is 
> to use and other possible issues if he takes common commits and tries it out 
> with his lp50xx driver.
> 

The LP50xx pwm is not standard.
It defines a PWM dithering mode which phase shifts the LED outputs and does not 
really control the PWM width of the LEDs.

I can try to stitch this together for testing.  I will need to go through this 
code and docs a bit more.

Dan

> Thanks,
> Vesa Jääskeläinen


-- 
------------------
Dan Murphy

Reply via email to