[U-Boot] [PATCH v2 7/9] dm: led: Add support for blinking LEDs

Ziping Chen techping.chan at gmail.com
Wed Apr 12 08:52:54 UTC 2017


2017-04-11 1:34 GMT+08:00 Simon Glass <sjg at chromium.org>:

> Allow LEDs to be blinked if the driver supports it. Enable this for
> sandbox so that the tests run.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> Changes in v2:
> - Control this feature via a new CONFIG_LED_BLINK option
>
>  configs/sandbox_defconfig       |  1 +
>  configs/sandbox_noblk_defconfig |  1 +
>  configs/sandbox_spl_defconfig   |  1 +
>  drivers/led/Kconfig             |  9 +++++++++
>  drivers/led/led-uclass.c        | 12 ++++++++++++
>  include/led.h                   | 35 +++++++++++++++++++++++++++++++++++
>  test/dm/led.c                   | 24 ++++++++++++++++++++++++
>  7 files changed, 83 insertions(+)
>
> diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig
> index 7f3f5ac809..9814ea3b81 100644
> --- a/configs/sandbox_defconfig
> +++ b/configs/sandbox_defconfig
> @@ -83,6 +83,7 @@ CONFIG_I2C_ARB_GPIO_CHALLENGE=y
>  CONFIG_CROS_EC_KEYB=y
>  CONFIG_I8042_KEYB=y
>  CONFIG_LED=y
> +CONFIG_LED_BLINK=y
>  CONFIG_LED_GPIO=y
>  CONFIG_DM_MAILBOX=y
>  CONFIG_SANDBOX_MBOX=y
> diff --git a/configs/sandbox_noblk_defconfig b/configs/sandbox_noblk_
> defconfig
> index 3f8e70d523..bba744332c 100644
> --- a/configs/sandbox_noblk_defconfig
> +++ b/configs/sandbox_noblk_defconfig
> @@ -92,6 +92,7 @@ CONFIG_I2C_ARB_GPIO_CHALLENGE=y
>  CONFIG_CROS_EC_KEYB=y
>  CONFIG_I8042_KEYB=y
>  CONFIG_LED=y
> +CONFIG_LED_BLINK=y
>  CONFIG_LED_GPIO=y
>  CONFIG_CROS_EC=y
>  CONFIG_CROS_EC_I2C=y
> diff --git a/configs/sandbox_spl_defconfig b/configs/sandbox_spl_defconfig
> index ade67143b1..6fe21254fd 100644
> --- a/configs/sandbox_spl_defconfig
> +++ b/configs/sandbox_spl_defconfig
> @@ -94,6 +94,7 @@ CONFIG_I2C_ARB_GPIO_CHALLENGE=y
>  CONFIG_CROS_EC_KEYB=y
>  CONFIG_I8042_KEYB=y
>  CONFIG_LED=y
> +CONFIG_LED_BLINK=y
>  CONFIG_LED_GPIO=y
>  CONFIG_DM_MAILBOX=y
>  CONFIG_SANDBOX_MBOX=y
> diff --git a/drivers/led/Kconfig b/drivers/led/Kconfig
> index 0ef45bc06a..309372ab56 100644
> --- a/drivers/led/Kconfig
> +++ b/drivers/led/Kconfig
> @@ -9,6 +9,15 @@ config LED
>           can provide access to board-specific LEDs. Use of the device tree
>           for configuration is encouraged.
>
> +config LED_BLINK
> +       bool "Support LED blinking"
> +       depends on LED
> +       help
> +         Some drivers can support automatic blinking of LEDs with a given
> +         period, without needing timers or extra code to handle the
> timing.
> +         This option enables support for this which adds slightly to the
> +         code size.
> +
>  config SPL_LED
>         bool "Enable LED support in SPL"
>         depends on SPL && SPL_DM
> diff --git a/drivers/led/led-uclass.c b/drivers/led/led-uclass.c
> index ea5fbabadf..78ab76050d 100644
> --- a/drivers/led/led-uclass.c
> +++ b/drivers/led/led-uclass.c
> @@ -52,6 +52,18 @@ enum led_state_t led_get_state(struct udevice *dev)
>         return ops->get_state(dev);
>  }
>
> +#ifdef CONFIG_LED_BLINK
> +int led_set_period(struct udevice *dev, int period_ms)
> +{
> +       struct led_ops *ops = led_get_ops(dev);
> +
> +       if (!ops->set_period)
> +               return -ENOSYS;
> +
> +       return ops->set_period(dev, period_ms);
> +}
> +#endif
> +
>  UCLASS_DRIVER(led) = {
>         .id             = UCLASS_LED,
>         .name           = "led",
> diff --git a/include/led.h b/include/led.h
> index 8c107e28e7..c67af22591 100644
> --- a/include/led.h
> +++ b/include/led.h
> @@ -17,10 +17,22 @@ struct led_uc_plat {
>         const char *label;
>  };
>
> +/**
> + * struct led_uc_priv - Private data the uclass stores about each device
> + *
> + * @period_ms: Flash period in milliseconds
> + */
> +struct led_uc_priv {
> +       int period_ms;
> +};
> +
>  enum led_state_t {
>         LEDST_OFF = 0,
>         LEDST_ON = 1,
>         LEDST_TOGGLE,
> +#ifdef CONFIG_LED_BLINK
> +       LEDST_BLINK,
> +#endif
>
>         LEDST_COUNT,
>  };
> @@ -42,6 +54,20 @@ struct led_ops {
>          * @return LED state led_state_t, or -ve on error
>          */
>         enum led_state_t (*get_state)(struct udevice *dev);
> +
> +#ifdef CONFIG_LED_BLINK
> +       /**
> +        * led_set_period() - set the blink period of an LED
> +        *
> +        * Thie records the period if supported, or returns -ENOSYS if not.
> +        * To start the LED blinking, use set_state().
> +        *
> +        * @dev:        LED device to change
> +        * @period_ms:  LED blink period in milliseconds
> +        * @return 0 if OK, -ve on error
> +        */
> +       int (*set_period)(struct udevice *dev, int period_ms);
> +#endif
>  };
>
>  #define led_get_ops(dev)       ((struct led_ops *)(dev)->driver->ops)
> @@ -72,4 +98,13 @@ int led_set_state(struct udevice *dev, enum led_state_t
> state);
>   */
>  enum led_state_t led_get_state(struct udevice *dev);
>
> +/**
> + * led_set_period() - set the blink period of an LED
> + *
> + * @dev:       LED device to change
> + * @period_ms: LED blink period in milliseconds
> + * @return 0 if OK, -ve on error
> + */
> +int led_set_period(struct udevice *dev, int period_ms);
> +
>  #endif
> diff --git a/test/dm/led.c b/test/dm/led.c
> index 2cc24127e2..fde700be38 100644
> --- a/test/dm/led.c
> +++ b/test/dm/led.c
> @@ -98,3 +98,27 @@ static int dm_test_led_label(struct unit_test_state
> *uts)
>         return 0;
>  }
>  DM_TEST(dm_test_led_label, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
> +
> +/* Test LED blinking */
> +#ifdef CONFIG_LED_BLINK
> +static int dm_test_led_blink(struct unit_test_state *uts)
> +{
> +       const int offset = 1;
> +       struct udevice *dev, *gpio;
> +
> +       /*
> +        * Check that we get an error when trying to blink an LED, since
> it is
> +        * not supported by the GPIO LED driver.
> +        */
> +       ut_assertok(uclass_get_device(UCLASS_LED, 1, &dev));
> +       ut_assertok(uclass_get_device(UCLASS_GPIO, 1, &gpio));
> +       ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
> +       ut_asserteq(-ENOSYS, led_set_state(dev, LEDST_BLINK));
> +       ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
> +       ut_asserteq(LEDST_OFF, led_get_state(dev));
> +       ut_asserteq(-ENOSYS, led_set_period(dev, 100));
> +
> +       return 0;
> +}
> +DM_TEST(dm_test_led_blink, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
> +#endif
> --
> 2.12.2.715.g7642488e1d-goog
>
>
Reviewed-by: Ziping Chen <techping.chan at gmail.com>


More information about the U-Boot mailing list