drivers/leds: Add support for KTD2052

This commit adds support for the KTD2052 LED driver chip.

Signed-off-by: Tyler Bennett <tbennett@2g-eng.com>
This commit is contained in:
Joshua Lange
2025-04-14 12:56:52 -05:00
committed by Alan C. Assis
parent e5b138dee0
commit d5eda10cad
6 changed files with 1032 additions and 0 deletions
@@ -7,3 +7,4 @@ LEDS
userled.rst
ws2812.rst
ktd2052.rst
@@ -0,0 +1,116 @@
=======
KTD2052
=======
This is a driver for the Kinetic Technologies KTD2052, a 4-module (12-channel)
RGB LED driver with an I2C interface. This driver exposes the KTD2052's
functionality as a standard NuttX character device.
Driver Configuration
====================
This driver depends on I2C being enabled and configured for your board.
To use the driver, enable the following option in menuconfig:
- ``Device Drivers -> LED Support -> KTD2052 I2C LED Driver``
(``CONFIG_KTD2052``)
Driver Usage
============
The driver is registered as a character device, typically at a path like
``/dev/leds0``.
Initialization
--------------
To use the driver, board-specific logic must call ``ktd2052_register``
during the board initialization sequence. This function takes the device path,
an I2C master instance, the I2C address of the device, and the I2C frequency.
.. code-block:: c
#include <nuttx/leds/ktd2052.h>
/* In your board's initialization logic */
FAR struct i2c_master_s *i2c; /* I2C bus instance */
/* ... */
ktd2052_register("/dev/leds0", i2c, 0x74, 400000);
Application Interface
---------------------
An application can interact with the device by opening the device path and
using standard ``read()``, ``write()``, and ``ioctl()`` calls. The device will
automatically be taken out of shutdown mode as soon as it is opened.
**write()**
The ``write()`` call provides a simple way to set the raw current
values for one or more connected RGB modules. The buffer should contain a
sequence of Red, Green, and Blue current values for each module, starting with
module 1. The device's output current is linear between values of 0 (no current)
and 192 (full scale current). Setting a value above 192 will result in full
scale current output. Full scale current is either 24mA in normal mode or 1.5mA
in night mode. Writes to the device using the ``write()`` call will always start
at module 1. The entire string can be updated by repeatedly calling ``write()``
without needing to first seek back to 0. Partial writes are supported.
- **Buffer Format**: ``[R1, G1, B1, R2, G2, B2, R3, G3, B3, R4, G4, B4]``
- **Buffer Length**: 1 to 12 bytes.
.. code-block:: c
/* Example: Set module 1 to red and module 2 to blue */
uint8_t colors[6] = { 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0 };
int fd = open("/dev/leds0", O_WRONLY);
write(fd, colors, sizeof(colors));
close(fd);
**read()**
The ``read()`` call retrieves status information from the device.
- Reading 1 byte returns the contents of the MONITOR Register.
- Reading 2 bytes returns the MONITOR Register followed by the CONTROL Register.
The MONITOR register bits are defined in ``nuttx/leds/ktd2052.h``.
**ioctl()**
For more advanced control, the driver implements several ``ioctl`` commands,
defined in ``nuttx/leds/ktd2052.h``.
- ``KTDIOSETRGB``
Set the color for a single RGB module.
- **Argument**: A pointer to a ``uint8_t[4]`` array:
``{module number [1-4], r, g, b}``.
- ``KTDIOSETMODE``
Configure the operating mode of the device. See the CONTROL register in the
device datasheet for additional information on available modes.
- **Argument**: A pointer to a ``struct ktd2052_mode_s``.
- ``KTDIOSETPATTERN``
Configure the hardware pattern generator. See the device datasheet for
additional information on using the hardware pattern generator.
- **Argument**: A pointer to a ``struct ktd2052_pattern_s``.
- ``KTDIOSETSLOTS``
Configure which RGB modules are active in each pattern slot.
- **Argument**: A pointer to a ``struct ktd2052_slots_s``.
- ``KTDIOGETMONITOR``
Read the MONITOR register.
- **Argument**: A pointer to a ``uint8_t`` to store the result.
- ``KTDIOSETWDOG``
Feed the pattern generator watchdog timer.
- **Argument**: A ``uint8_t`` value for the watchdog cycle count to set.
+7
View File
@@ -57,6 +57,13 @@ config LEDS_APA102
---help---
Enable support for the APA102 LED Strip driver.
config KTD2052
bool "KTD2052 I2C LED Driver"
default n
select I2C
---help---
Enable support for the KTD2052 LED driver
config LEDS_MAX7219
bool "MAX7219 Numeric Display"
default n
+6
View File
@@ -37,6 +37,12 @@ ifeq ($(CONFIG_LEDS_APA102),y)
LEDVPATH = :leds
endif
ifeq ($(CONFIG_KTD2052),y)
CSRCS += ktd2052.c
LEDDEPATH = --dep-path leds
LEDVPATH = :leds
endif
ifeq ($(CONFIG_LEDS_MAX7219),y)
CSRCS += max7219.c
LEDDEPATH = --dep-path leds
File diff suppressed because it is too large Load Diff
+149
View File
@@ -0,0 +1,149 @@
/****************************************************************************
* include/nuttx/leds/ktd2052.h
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
#ifndef __INCLUDE_NUTTX_LEDS_KTD2052_H
#define __INCLUDE_NUTTX_LEDS_KTD2052_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <nuttx/fs/ioctl.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Set RGB value for a single module */
#define KTDIOSETRGB _ULEDIOC(0)
/* Set operating mode */
#define KTDIOSETMODE _ULEDIOC(1)
/* Set pattern configuration */
#define KTDIOSETPATTERN _ULEDIOC(2)
/* Set pattern slots for a module */
#define KTDIOSETSLOTS _ULEDIOC(3)
/* Get monitor register status */
#define KTDIOGETMONITOR _ULEDIOC(4)
/* Set watchdog value */
#define KTDIOSETWDOG _ULEDIOC(5)
/****************************************************************************
* Public Types
****************************************************************************/
#define KTD2052_MODE_SHUTDOWN 0
#define KTD2052_MODE_NIGHT 1
#define KTD2052_MODE_NORMAL 2
#define KTD2052_TEMP_LIMIT_135 0
#define KTD2052_TEMP_LIMIT_120 1
#define KTD2052_TEMP_LIMIT_105 2
#define KTD2052_TEMP_LIMIT_90 3
#define KTD2052_FADE_RATE_32MS 0
#define KTD2052_FADE_RATE_63MS 1
#define KTD2052_FADE_RATE_125MS 2
#define KTD2052_FADE_RATE_250MS 3
#define KTD2052_FADE_RATE_500MS 4
#define KTD2052_FADE_RATE_1000MS 5
#define KTD2052_FADE_RATE_2000MS 6
#define KTD2052_FADE_RATE_4000MS 7
/* MONITOR status bits */
#define KTD2052_MONITOR_UV_OT_STAT 0x01 /* Under voltage/over temperature */
#define KTD2052_MONITOR_COOL_STAT 0x02 /* CoolExtend is active */
#define KTD2052_MONITOR_BE_STAT 0x04 /* BrightExtend is active */
#define KTD2052_MONITOR_SC_STAT 0x08 /* Short circuit detected */
/* Structure for setting operating mode */
struct ktd2052_mode_s
{
uint8_t mode; /* 0=off, 1=night mode, 2=normal mode */
bool bright_extend; /* Enable BrightExtend feature */
uint8_t temp_limit; /* Temperature limit (0=135C to 3=90C) */
uint8_t fade_rate; /* Fade rate (0-7) */
};
/* Structure for configuring pattern generator */
struct ktd2052_pattern_s
{
uint8_t slots; /* Number of pattern slots (4, 6, or 8) */
uint8_t duration; /* Duration for each slot (0-7) */
uint8_t fade_rate1; /* Secondary fade rate (0-7) */
uint8_t watchdog; /* Number of pattern cycles (0-255) */
};
/* Structure for setting pattern slots */
struct ktd2052_slots_s
{
uint8_t module; /* RGB module number (1-4) */
uint8_t slots; /* Bit pattern for active slots */
};
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
#ifdef __cplusplus
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif
/****************************************************************************
* Name: ktd2052_register
*
* Description:
* Register the KTD2052 character device as 'devpath'
*
* Input Parameters:
* devpath - The full path to the driver to register. E.g., "/dev/leds0"
* i2c - An instance of the I2C interface to communicate with KTD2052
* addr - The I2C address of the KTD2052
* freq - The I2C frequency to use for the KTD2052
*
* Returned Value:
* Zero (OK) on success; a negated errno value on failure.
*
****************************************************************************/
int ktd2052_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
uint8_t addr, uint32_t freq);
#undef EXTERN
#ifdef __cplusplus
}
#endif
#endif /* __INCLUDE_NUTTX_LEDS_KTD2052_H */