Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | /* * Copyright (c) 2017 Linaro Limited * Copyright (c) 2024 Jamie McCrae * * SPDX-License-Identifier: Apache-2.0 */ /** * @file * @brief Public API for controlling linear strips of LEDs. * * This library abstracts the chipset drivers for individually * addressable strips of LEDs. */ #ifndef ZEPHYR_INCLUDE_DRIVERS_LED_STRIP_H_ #define ZEPHYR_INCLUDE_DRIVERS_LED_STRIP_H_ /** * @brief LED Strip Interface * @defgroup led_strip_interface LED Strip Interface * @ingroup io_interfaces * @{ */ #include <errno.h> #include <zephyr/types.h> #include <zephyr/device.h> #ifdef __cplusplus extern "C" { #endif /** * @brief Color value for a single RGB LED. * * Individual strip drivers may ignore lower-order bits if their * resolution in any channel is less than a full byte. */ struct led_rgb { #ifdef CONFIG_LED_STRIP_RGB_SCRATCH /* * Pad/scratch space needed by some drivers. Users should * ignore. */ uint8_t scratch; #endif /** Red channel */ uint8_t r; /** Green channel */ uint8_t g; /** Blue channel */ uint8_t b; }; /** * @typedef led_api_update_rgb * @brief Callback API for updating an RGB LED strip * * @see led_strip_update_rgb() for argument descriptions. */ typedef int (*led_api_update_rgb)(const struct device *dev, struct led_rgb *pixels, size_t num_pixels); /** * @typedef led_api_update_channels * @brief Callback API for updating channels without an RGB interpretation. * * @see led_strip_update_channels() for argument descriptions. */ typedef int (*led_api_update_channels)(const struct device *dev, uint8_t *channels, size_t num_channels); /** * @typedef led_api_length * @brief Callback API for getting length of an LED strip. * * @see led_strip_length() for argument descriptions. */ typedef size_t (*led_api_length)(const struct device *dev); /** * @brief LED strip driver API * * This is the mandatory API any LED strip driver needs to expose. */ __subsystem struct led_strip_driver_api { led_api_update_rgb update_rgb; led_api_update_channels update_channels; led_api_length length; }; /** * @brief Mandatory function to update an LED strip with the given RGB array. * * @param dev LED strip device. * @param pixels Array of pixel data. * @param num_pixels Length of pixels array. * * @retval 0 on success. * @retval -errno negative errno code on failure. * * @warning This routine may overwrite @a pixels. */ static inline int led_strip_update_rgb(const struct device *dev, struct led_rgb *pixels, size_t num_pixels) { const struct led_strip_driver_api *api = (const struct led_strip_driver_api *)dev->api; /* Allow for out-of-tree drivers that do not have this function for 2 Zephyr releases * until making it mandatory, function added after Zephyr 3.6 */ if (api->length != NULL) { /* Ensure supplied pixel size is valid for this device */ if (api->length(dev) < num_pixels) { return -ERANGE; } } return api->update_rgb(dev, pixels, num_pixels); } /** * @brief Optional function to update an LED strip with the given channel array * (each channel byte corresponding to an individually addressable color * channel or LED. Channels are updated linearly in strip order. * * @param dev LED strip device. * @param channels Array of per-channel data. * @param num_channels Length of channels array. * * @retval 0 on success. * @retval -ENOSYS if not implemented. * @retval -errno negative errno code on other failure. * * @warning This routine may overwrite @a channels. */ static inline int led_strip_update_channels(const struct device *dev, uint8_t *channels, size_t num_channels) { const struct led_strip_driver_api *api = (const struct led_strip_driver_api *)dev->api; if (api->update_channels == NULL) { return -ENOSYS; } return api->update_channels(dev, channels, num_channels); } /** * @brief Mandatory function to get chain length (in pixels) of an LED strip device. * * @param dev LED strip device. * * @retval Length of LED strip device. */ static inline size_t led_strip_length(const struct device *dev) { const struct led_strip_driver_api *api = (const struct led_strip_driver_api *)dev->api; return api->length(dev); } #ifdef __cplusplus } #endif /** * @} */ #endif /* ZEPHYR_INCLUDE_DRIVERS_LED_STRIP_H_ */ |