drivers/userled: add an interface to support LED effects.

LED effects must be implemented in the lower-half of the LED driver.
The interface is designed to supports the following LED effects:
  - intenisty (PWM)
  - Bling (Timer)
  - Fade in, Fade out (Ramp)
This commit is contained in:
raiden00pl 2023-06-26 17:00:09 +02:00 committed by Alan Carvalho de Assis
parent 6c60c7df07
commit c63b2d5c91
3 changed files with 118 additions and 0 deletions

View File

@ -42,6 +42,12 @@ config USERLED_LOWER_READSTATE
checks the actual state of the pin controlling the LED, checks the actual state of the pin controlling the LED,
which can be used to find malfunctioning LEDs. which can be used to find malfunctioning LEDs.
config USERLED_EFFECTS
bool "LED driver supports LED effects"
default n
---help---
Enable support for LED effects (PWM, blinking, breathing).
endif # USERLED endif # USERLED
config LEDS_APA102 config LEDS_APA102

View File

@ -464,6 +464,53 @@ static int userled_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
} }
break; break;
#ifdef CONFIG_USERLED_EFFECTS
/* Command: ULEDIOC_SUPEFFECT
* Description: Get supported effects of one LED.
* Argument: A write-able pointer to a struct userled_effect_sup_s
* which to return the supported LED effects.
* Return: Zero (OK) on success. Minus one will be returned on
* failure with the errno value set appropriately.
*/
case ULEDIOC_SUPEFFECT:
{
FAR struct userled_effect_sup_s *effect =
(FAR struct userled_effect_sup_s *)((uintptr_t)arg);
if (effect)
{
lower = priv->lu_lower;
DEBUGASSERT(lower != NULL && lower->ll_effect_sup != NULL);
lower->ll_effect_sup(lower, effect);
ret = OK;
}
}
break;
/* Command: ULEDIOC_SETEFFECT
* Description: Set effects for one LED.
* Argument: A read-only pointer to an instance of
* struct userled_effect_set_s.
* Return: Zero (OK) on success. Minus one will be returned on
* failure with the errno value set appropriately.
*/
case ULEDIOC_SETEFFECT:
{
FAR struct userled_effect_set_s *effect =
(FAR struct userled_effect_set_s *)((uintptr_t)arg);
if (effect)
{
lower = priv->lu_lower;
DEBUGASSERT(lower != NULL && lower->ll_effect_set != NULL);
ret = lower->ll_effect_set(lower, effect);
}
}
break;
#endif
default: default:
lederr("ERROR: Unrecognized command: %d\n", cmd); lederr("ERROR: Unrecognized command: %d\n", cmd);
ret = -ENOTTY; ret = -ENOTTY;

View File

@ -74,6 +74,26 @@
#define ULEDIOC_GETALL _ULEDIOC(0x0004) #define ULEDIOC_GETALL _ULEDIOC(0x0004)
/* Command: ULEDIOC_SUPEFFECT
* Description: Get supported effects of one LED.
* Argument: A write-able pointer to a struct userled_effect_sup_s
* which to return the supported LED effects.
* Return: Zero (OK) on success. Minus one will be returned on failure
* with the errno value set appropriately.
*/
#define ULEDIOC_SUPEFFECT _ULEDIOC(0x0005)
/* Command: ULEDIOC_SETEFFECT
* Description: Set effects for one LED.
* Argument: A read-only pointer to an instance of
* struct userled_effect_set_s.
* Return: Zero (OK) on success. Minus one will be returned on failure
* with the errno value set appropriately.
*/
#define ULEDIOC_SETEFFECT _ULEDIOC(0x0006)
/**************************************************************************** /****************************************************************************
* Public Types * Public Types
****************************************************************************/ ****************************************************************************/
@ -97,6 +117,38 @@ struct userled_s
bool ul_on; /* The LED state. true: ON; false: OFF */ bool ul_on; /* The LED state. true: ON; false: OFF */
}; };
#ifdef CONFIG_USERLED_EFFECTS
/* This structure describes LED effects supported by a given LED. */
struct userled_effect_sup_s
{
uint8_t led; /* LED number */
uint8_t int_on:1; /* ON intensity supported */
uint8_t int_off:1; /* OFF intensity supported */
uint8_t t_on:1; /* ON time supported */
uint8_t t_off:1; /* OFF time supported */
uint8_t t_fade:1; /* Fade in supported */
uint8_t t_fall:1; /* Fade out supported */
uint8_t _res:2; /* Reserved */
};
/* This structure describes the LED effect to be set on a given LED. */
struct userled_effect_set_s
{
uint8_t led; /* LED number */
uint8_t int_on; /* ON intesinty [0% - 100%] */
uint8_t int_off; /* OFF intensity [0% - 100%] */
uint32_t t_on; /* ON time [ms] */
uint32_t t_off; /* OFF intensity [ms] */
uint8_t t_fade; /* Fade in setting */
uint8_t t_fall; /* Fade out setting */
};
#endif
/* The user LED driver is a two-part driver: /* The user LED driver is a two-part driver:
* *
* 1) A common upper half driver that provides the common user interface to * 1) A common upper half driver that provides the common user interface to
@ -133,6 +185,19 @@ struct userled_lowerhalf_s
CODE void (*ll_getall)(FAR const struct userled_lowerhalf_s *lower, CODE void (*ll_getall)(FAR const struct userled_lowerhalf_s *lower,
userled_set_t *ledset); userled_set_t *ledset);
#endif #endif
#ifdef CONFIG_USERLED_EFFECTS
/* Return the LED effects supported by a given LED */
CODE void (*ll_effect_sup)(FAR const struct userled_lowerhalf_s *lower,
FAR struct userled_effect_sup_s *supp);
/* Set the effect of one LED */
CODE int (*ll_effect_set)(FAR const struct userled_lowerhalf_s *lower,
FAR struct userled_effect_set_s *effect);
#endif
}; };
/**************************************************************************** /****************************************************************************