This is an automated email from the ASF dual-hosted git repository.

pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new b3daaf765b drivers/lcd: Add support to use APA102 LED Matrix as LCD 
Display
b3daaf765b is described below

commit b3daaf765bcceb6481f90906ec49ec72fb856c4a
Author: Alan Carvalho de Assis <[email protected]>
AuthorDate: Sun Jul 17 17:56:22 2022 -0300

    drivers/lcd: Add support to use APA102 LED Matrix as LCD Display
    
    Co-authored-by: Petro Karashchenko <[email protected]>
---
 drivers/lcd/Kconfig                  |  24 ++
 drivers/lcd/Make.defs                |   4 +
 drivers/lcd/apa102.c                 | 675 +++++++++++++++++++++++++++++++++++
 include/nuttx/{leds => lcd}/apa102.h |  54 ++-
 include/nuttx/leds/apa102.h          |   3 -
 5 files changed, 725 insertions(+), 35 deletions(-)

diff --git a/drivers/lcd/Kconfig b/drivers/lcd/Kconfig
index 23d013598c..5a112431b0 100644
--- a/drivers/lcd/Kconfig
+++ b/drivers/lcd/Kconfig
@@ -100,6 +100,30 @@ config LCD_MAXPOWER
 
 comment "Graphic LCD Devices"
 
+config LCD_APA102
+       bool "APA102 RGB LED MATRIX as LCD"
+       depends on SPI
+       default n
+
+if LCD_APA102
+       config LCD_APA102_XRES
+               int "APA102 X Resolution"
+               default 16
+               ---help---
+                       Specifies the X resolution of the LCD.
+
+       config LCD_APA102_YRES
+               int "APA102 Y Resolution"
+               default 16
+               ---help---
+                       Specifies the Y resolution of the LCD.
+
+       config LCD_APA102_FREQUENCY
+               int "SPI Frequency"
+               default 1000000
+
+endif # LCD_APA102
+
 config LCD_P14201
        bool "Rit P1402 series display"
        default n
diff --git a/drivers/lcd/Make.defs b/drivers/lcd/Make.defs
index 66bc4f123b..131996f771 100644
--- a/drivers/lcd/Make.defs
+++ b/drivers/lcd/Make.defs
@@ -45,6 +45,10 @@ ifeq ($(CONFIG_LCD_LPM013M091A),y)
   CSRCS += lpm013m091a.c
 endif
 
+ifeq ($(CONFIG_LCD_APA102),y)
+  CSRCS += apa102.c
+endif
+
 ifeq ($(CONFIG_LCD_P14201),y)
   CSRCS += p14201.c
 endif
diff --git a/drivers/lcd/apa102.c b/drivers/lcd/apa102.c
new file mode 100644
index 0000000000..dd21e63926
--- /dev/null
+++ b/drivers/lcd/apa102.c
@@ -0,0 +1,675 @@
+/****************************************************************************
+ * drivers/lcd/apa102.c
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+/* Driver to create a display using RBG LEDs APA102 chained together */
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+#include <debug.h>
+
+#include <nuttx/arch.h>
+#include <nuttx/spi/spi.h>
+#include <nuttx/lcd/lcd.h>
+#include <nuttx/lcd/apa102.h>
+#include <nuttx/leds/apa102.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#ifndef MAX
+#  define MAX(a,b)    ((a) > (b) ? (a) : (b))
+#endif
+
+/* Configuration ************************************************************/
+
+/* APA102 Configuration Settings:
+ *
+ * CONFIG_APA102_XRES - Specifies the number of physical
+ *   APA102 devices that are connected together horizontally.
+ *
+ * CONFIG_APA102_YRES - Specifies the number of physical
+ *   APA102 devices that are connected together vertically.
+ *
+ * CONFIG_LCD_INTENSITY - Defines the default bright of LEDs.
+ *
+ * Required LCD driver settings:
+ * CONFIG_LCD_APA102 - Enable APA102 support
+ *
+ */
+
+/* Verify that all configuration requirements have been met */
+
+/* SPI frequency */
+
+#ifndef CONFIG_APA102_FREQUENCY
+#  define CONFIG_APA102_FREQUENCY 10000000
+#endif
+
+/* APA102_COLUMNS determines the number of physical LEDs
+ * matrices that are used connected horizontally.
+ */
+
+#ifndef CONFIG_APA102_XRES
+#  define CONFIG_APA102_XRES 16
+#endif
+
+/* APA102_LINES determines the number of physical LEDs
+ * matrices that are used connected vertically.
+ */
+
+#ifndef CONFIG_APA102_YRES
+#  define CONFIG_APA102_YRES 16
+#endif
+
+/* Check contrast selection */
+
+#if !defined(CONFIG_LCD_MAXCONTRAST)
+#  define CONFIG_LCD_MAXCONTRAST 1
+#endif
+
+/* Color Properties *********************************************************/
+
+/* Display Resolution */
+
+#define APA102_XRES         CONFIG_APA102_XRES
+#define APA102_YRES         CONFIG_APA102_YRES
+
+/* Color depth and format */
+
+#define APA102_BPP          16
+#define APA102_COLORFMT     FB_FMT_RGB16_565
+
+#define APA102_LUT_SIZE     MAX(APA102_XRES, APA102_YRES)
+
+/* The size of the shadow frame buffer (4 bytes per LED) */
+
+#define APA102_FBSIZE       (APA102_XRES * APA102_YRES)
+
+/* LCD RGB Mapping */
+
+#ifdef CONFIG_FB_CMAP
+#  error "RGB color mapping not supported by this driver"
+#endif
+
+/* Cursor Controls */
+
+#ifdef CONFIG_FB_HWCURSOR
+#  error "Cursor control not supported by this driver"
+#endif
+
+/****************************************************************************
+ * Private Type Definition
+ ****************************************************************************/
+
+/* This structure describes the state of this driver */
+
+struct apa102_dev_s
+{
+  /* Publicly visible device structure */
+
+  struct lcd_dev_s dev;
+
+  /* Private LCD-specific information follows */
+
+  FAR struct spi_dev_s *spi;
+  uint8_t contrast;
+  uint8_t powered;
+
+  /* We need to send all the APA102 matrix screen once.
+   * So, create a framebuffer to save it in memory
+   */
+
+  struct apa102_ledstrip_s fb[APA102_FBSIZE];
+};
+
+/****************************************************************************
+ * Private Function Protototypes
+ ****************************************************************************/
+
+/* LCD Data Transfer Methods */
+
+static int apa102_putrun(FAR struct lcd_dev_s *dev, fb_coord_t row,
+                         fb_coord_t col, FAR const uint8_t *buffer,
+                         size_t npixels);
+static int apa102_getrun(FAR struct lcd_dev_s *dev, fb_coord_t row,
+                         fb_coord_t col, FAR uint8_t *buffer,
+                         size_t npixels);
+
+/* LCD Configuration */
+
+static int apa102_getvideoinfo(FAR struct lcd_dev_s *dev,
+                               FAR struct fb_videoinfo_s *vinfo);
+static int apa102_getplaneinfo(FAR struct lcd_dev_s *dev,
+                               unsigned int planeno,
+                               FAR struct lcd_planeinfo_s *pinfo);
+
+/* LCD Specific Controls */
+
+static int apa102_getpower(FAR struct lcd_dev_s *dev);
+static int apa102_setpower(FAR struct lcd_dev_s *dev, int power);
+static int apa102_getcontrast(FAR struct lcd_dev_s *dev);
+static int apa102_setcontrast(FAR struct lcd_dev_s *dev,
+                              unsigned int contrast);
+
+/* Initialization */
+
+static inline void up_clear(FAR struct apa102_dev_s  *priv);
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/* This is working memory allocated by the LCD driver for each LCD device
+ * and for each color plane.  This memory will hold one raster line of data.
+ * The size of the allocated run buffer must therefore be at least
+ * (bpp * xres / 8).  Actual alignment of the buffer must conform to the
+ * bitwidth of the underlying pixel type.
+ *
+ * If there are multiple planes, they may share the same working buffer
+ * because different planes will not be operate on concurrently.  However,
+ * if there are multiple LCD devices, they must each have unique run buffers.
+ */
+
+static uint8_t g_runbuffer[APA102_LUT_SIZE];
+
+/* This structure describes the overall LCD video controller */
+
+static const struct fb_videoinfo_s g_videoinfo =
+{
+  APA102_COLORFMT,    /* Color format: RGB16-565: RRRR RGGG GGGB BBBB */
+  APA102_XRES,        /* Horizontal resolution in pixel columns */
+  APA102_YRES,        /* Vertical resolution in pixel rows */
+  1,                  /* Number of color planes supported */
+};
+
+/* This is the standard, NuttX Plane information object */
+
+static const struct lcd_planeinfo_s g_planeinfo =
+{
+  apa102_putrun,              /* Put a run into LCD memory */
+  NULL,                       /* No putarea function */
+  apa102_getrun,              /* Get a run from LCD memory */
+  NULL,                       /* No getarea function */
+  NULL,                       /* No redraw function */
+  (FAR uint8_t *)g_runbuffer, /* Run scratch buffer */
+  APA102_BPP,                 /* Bits-per-pixel */
+  NULL,                       /* Put lcd_dev_s later */
+};
+
+/* This is the standard, NuttX LCD driver object */
+
+static struct apa102_dev_s g_apa102dev =
+{
+  /* struct lcd_dev_s */
+
+  {
+    /* LCD Configuration */
+
+    apa102_getvideoinfo,
+    apa102_getplaneinfo,
+
+#ifdef CONFIG_FB_CMAP
+    /* LCD RGB Mapping -- Not supported */
+
+    NULL,
+    NULL,
+#endif
+
+#ifdef CONFIG_FB_HWCURSOR
+    /* Cursor Controls -- Not supported */
+
+    NULL,
+    NULL,
+#endif
+
+    /* LCD Specific Controls */
+
+    apa102_getpower,
+    apa102_setpower,
+    apa102_getcontrast,
+    apa102_setcontrast,
+  },
+};
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: rgb565_apa102
+ *
+ * Description:
+ *   Convert RGB565 to APA102 RGB888 format
+ *
+ ****************************************************************************/
+
+static struct apa102_ledstrip_s rgb565_apa102(uint16_t rgb565)
+{
+  struct apa102_ledstrip_s led;
+
+  led.red    = (rgb565 & 0b1111100000000000) >> 8;
+  led.green  = (rgb565 & 0b11111100000) >> 3;
+  led.blue   = (rgb565 & 0b11111) << 3;
+  led.bright = 0;
+  return led;
+}
+
+/****************************************************************************
+ * Name: apa102_rgb565
+ *
+ * Description:
+ *   Convert APA102 RGB888 to RGB565 format
+ *
+ ****************************************************************************/
+
+static uint16_t apa102_rgb565(struct apa102_ledstrip_s led)
+{
+  uint16_t pixel;
+
+  pixel  = (led.red & 0b11111000) << 8;
+  pixel |= (led.green & 0b11111100) << 3;
+  pixel |= (led.blue & 0b11111000) >> 3;
+  return pixel;
+}
+
+/****************************************************************************
+ * Name: apa102_configspi
+ *
+ * Description:
+ *   Set the SPI bus configuration
+ *
+ ****************************************************************************/
+
+static inline void apa102_configspi(FAR struct spi_dev_s *spi)
+{
+  /* Configure SPI for the APA102 */
+
+  SPI_SETMODE(spi, SPIDEV_MODE0);
+  SPI_SETBITS(spi, 8);
+  SPI_HWFEATURES(spi, 0);
+  SPI_SETFREQUENCY(spi, APA102_SPI_MAXFREQUENCY);
+}
+
+/****************************************************************************
+ * Name: apa102_write32
+ *
+ * Description:
+ *   Write 32-bit to APA102
+ *
+ ****************************************************************************/
+
+static inline void apa102_write32(FAR struct apa102_dev_s *priv,
+                                  uint32_t value)
+{
+  /* If SPI bus is shared then lock and configure it */
+
+  SPI_LOCK(priv->spi, true);
+
+  /* Note: APA102 doesn't use chip select */
+
+  /* Send 32 bits (4 bytes) */
+
+  SPI_SEND(priv->spi, (value & 0xff));
+  SPI_SEND(priv->spi, ((value & 0xff00) >> 8));
+  SPI_SEND(priv->spi, ((value & 0xff0000) >> 16));
+  SPI_SEND(priv->spi, ((value & 0xff000000) >> 24));
+
+  /* Unlock bus */
+
+  SPI_LOCK(priv->spi, false);
+}
+
+/****************************************************************************
+ * Name:  apa102_putrun
+ *
+ * Description:
+ *   This method can be used to write a partial raster line to the LCD:
+ *
+ *   dev     - The lcd device
+ *   row     - Starting row to write to (range: 0 <= row < yres)
+ *   col     - Starting column to write to (range: 0 <= col <= xres-npixels)
+ *   buffer  - The buffer containing the run to be written to the LCD
+ *   npixels - The number of pixels to write to the LCD
+ *             (range: 0 < npixels <= xres-col)
+ *
+ ****************************************************************************/
+
+static int apa102_putrun(FAR struct lcd_dev_s *dev, fb_coord_t row,
+                         fb_coord_t col, FAR const uint8_t *buffer,
+                         size_t npixels)
+{
+  /* Because of this line of code, we will only be able to support a single
+   * APA102 device .
+   */
+
+  FAR struct apa102_dev_s *priv = (FAR struct apa102_dev_s *)dev;
+  int i;
+  int pixlen;
+
+  ginfo("row: %d col: %d npixels: %d\n", row, col, npixels);
+  DEBUGASSERT(buffer && ((uintptr_t)buffer & 1) == 0);
+
+  /* Clip the run to the display */
+
+  pixlen = npixels;
+  if ((unsigned int)col + (unsigned int)pixlen > (unsigned int)APA102_XRES)
+    {
+      pixlen = (int)APA102_XRES - (int)col;
+    }
+
+  /* Verify that some portion of the run remains on the display */
+
+  if (pixlen <= 0 || row > APA102_YRES)
+    {
+      return OK;
+    }
+
+  /* Convert rgb565 to APA102 LED values */
+
+  for (i = 0; i < pixlen; i++)
+    {
+      uint16_t *ptr = (uint16_t *)buffer;
+
+      priv->fb[(row * APA102_XRES) + col + i] = rgb565_apa102(*ptr++);
+    }
+
+  /* Confirm that SPI is configured correctly */
+
+  apa102_configspi(priv->spi);
+
+  /* Send a start of frame */
+
+  apa102_write32(priv, APA102_START_FRAME);
+
+  /* Send all LEDs values in the matrix */
+
+  for (i = 0; i < (APA102_XRES * APA102_YRES); i++)
+    {
+      uint32_t *led = (uint32_t *) &priv->fb[i];
+
+      /* Then transfer 4 bytes per LED */
+
+      apa102_write32(priv, (uint32_t) (*led | APA102_HEADER_FRAME));
+    }
+
+  /* Send an end of frame */
+
+  apa102_write32(priv, APA102_END_FRAME);
+
+  for (i = 0; i < (1 + APA102_XRES * APA102_YRES / 32); i++)
+    {
+      apa102_write32(priv, 0);
+    }
+
+  return OK;
+}
+
+/****************************************************************************
+ * Name:  apa102_getrun
+ *
+ * Description:
+ *   This method can be used to read a partial raster line from the LCD:
+ *
+ *  dev     - The lcd device
+ *  row     - Starting row to read from (range: 0 <= row < yres)
+ *  col     - Starting column to read read (range: 0 <= col <= xres-npixels)
+ *  buffer  - The buffer in which to return the run read from the LCD
+ *  npixels - The number of pixels to read from the LCD
+ *            (range: 0 < npixels <= xres-col)
+ *
+ ****************************************************************************/
+
+static int apa102_getrun(FAR struct lcd_dev_s *dev, fb_coord_t row,
+                         fb_coord_t col, FAR uint8_t *buffer,
+                         size_t npixels)
+{
+  /* Because of this line of code, we will only be able to support a single
+   * APA102 device.
+   */
+
+  FAR struct apa102_dev_s *priv = (FAR struct apa102_dev_s *)dev;
+  int i;
+  int pixlen;
+
+  ginfo("row: %d col: %d npixels: %d\n", row, col, npixels);
+  DEBUGASSERT(buffer);
+
+  /* Clip the run to the display */
+
+  pixlen = npixels;
+  if ((unsigned int)col + (unsigned int)pixlen > (unsigned int)APA102_XRES)
+    {
+      pixlen = (int)APA102_XRES - (int)col;
+    }
+
+  /* Verify that some portion of the run is actually the display */
+
+  if (pixlen <= 0 || row > APA102_YRES)
+    {
+      return -EINVAL;
+    }
+
+  for (i = 0; i < pixlen; i++)
+    {
+      uint16_t *ptr = (uint16_t *) buffer;
+
+      *ptr++ = apa102_rgb565(priv->fb[(row * APA102_XRES) + col + i]);
+    }
+
+  return OK;
+}
+
+/****************************************************************************
+ * Name:  apa102_getvideoinfo
+ *
+ * Description:
+ *   Get information about the LCD video controller configuration.
+ *
+ ****************************************************************************/
+
+static int apa102_getvideoinfo(FAR struct lcd_dev_s *dev,
+                               FAR struct fb_videoinfo_s *vinfo)
+{
+  DEBUGASSERT(dev && vinfo);
+
+  ginfo("fmt: %d xres: %d yres: %d nplanes: %d\n",
+        g_videoinfo.fmt, g_videoinfo.xres, g_videoinfo.yres,
+        g_videoinfo.nplanes);
+
+  memcpy(vinfo, &g_videoinfo, sizeof(struct fb_videoinfo_s));
+  return OK;
+}
+
+/****************************************************************************
+ * Name:  apa102_getplaneinfo
+ *
+ * Description:
+ *   Get information about the configuration of each LCD color plane.
+ *
+ ****************************************************************************/
+
+static int apa102_getplaneinfo(FAR struct lcd_dev_s *dev,
+                               unsigned int planeno,
+                               FAR struct lcd_planeinfo_s *pinfo)
+{
+  DEBUGASSERT(dev && pinfo && planeno == 0);
+
+  ginfo("planeno: %d bpp: %d\n", planeno, g_planeinfo.bpp);
+
+  memcpy(pinfo, &g_planeinfo, sizeof(struct lcd_planeinfo_s));
+  pinfo->dev = dev;
+
+  return OK;
+}
+
+/****************************************************************************
+ * Name:  apa102_getpower
+ *
+ * Description:
+ *   Get the LCD panel power status (0: full off - CONFIG_LCD_MAXPOWER: full
+ *   on). On backlit LCDs, this setting may correspond to the backlight
+ *   setting.
+ *
+ ****************************************************************************/
+
+static int apa102_getpower(FAR struct lcd_dev_s *dev)
+{
+  struct apa102_dev_s *priv = (FAR struct apa102_dev_s *)dev;
+
+  DEBUGASSERT(priv);
+  ginfo("powered: %d\n", priv->powered);
+
+  return priv->powered;
+}
+
+/****************************************************************************
+ * Name:  apa102_setpower
+ *
+ * Description:
+ *   Enable/disable LCD panel power (0: full off - CONFIG_LCD_MAXPOWER: full
+ *   on). On backlit LCDs, this setting may correspond to the backlight
+ *   setting.
+ *
+ ****************************************************************************/
+
+static int apa102_setpower(FAR struct lcd_dev_s *dev, int power)
+{
+  return OK;
+}
+
+/****************************************************************************
+ * Name:  apa102_getcontrast
+ *
+ * Description:
+ *   Get the current contrast setting (0-CONFIG_LCD_MAXCONTRAST).
+ *
+ ****************************************************************************/
+
+static int apa102_getcontrast(FAR struct lcd_dev_s *dev)
+{
+  struct apa102_dev_s *priv = (FAR struct apa102_dev_s *)dev;
+
+  DEBUGASSERT(priv);
+  return (int)priv->contrast;
+}
+
+/****************************************************************************
+ * Name:  apa102_setcontrast
+ *
+ * Description:
+ *   Set LCD panel contrast (0-CONFIG_LCD_MAXCONTRAST).
+ *
+ ****************************************************************************/
+
+static int apa102_setcontrast(FAR struct lcd_dev_s *dev,
+                              unsigned int contrast)
+{
+  return OK;
+}
+
+/****************************************************************************
+ * Name:  up_clear
+ *
+ * Description:
+ *   Clear the display.
+ *
+ ****************************************************************************/
+
+static inline void up_clear(FAR struct apa102_dev_s  *priv)
+{
+  int i;
+
+  /* Clear the framebuffer */
+
+  memset(priv->fb, APA102_BLACK, 4 * APA102_FBSIZE);
+
+  /* Send a start of frame */
+
+  apa102_write32(priv, APA102_START_FRAME);
+
+  /* Clear all LEDs values in the matrix */
+
+  for (i = 0; i < (APA102_XRES * APA102_YRES); i++)
+    {
+      /* Then transfer 4 bytes per LED */
+
+      apa102_write32(priv, (uint32_t) (APA102_BLACK | APA102_HEADER_FRAME));
+    }
+
+  /* Send an end of frame */
+
+  apa102_write32(priv, APA102_END_FRAME);
+
+  for (i = 0; i < (1 + APA102_XRES * APA102_YRES / 32); i++)
+    {
+      apa102_write32(priv, 0);
+    }
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: apa102_initialize
+ *
+ * Description:
+ *   Initialize the APA102 device as a LCD interface.
+ *
+ * Input Parameters:
+ *   spi   - An instance of the SPI interface to use to communicate
+ *           with the APA102.
+ *   devno - Device number to identify current display.
+ *
+ * Returned Value:
+ *   Zero (OK) on success; a negated errno value on failure.
+ *
+ ****************************************************************************/
+
+FAR struct lcd_dev_s *apa102_initialize(FAR struct spi_dev_s *spi,
+                                        unsigned int devno)
+{
+  /* Configure and enable LCD */
+
+  FAR struct apa102_dev_s *priv = &g_apa102dev;
+
+  ginfo("Initializing\n");
+  DEBUGASSERT(spi && devno == 0);
+
+  /* Save the reference to the SPI device */
+
+  priv->spi = spi;
+
+  /* Clear the framebuffer */
+
+  up_clear(priv);
+  return &priv->dev;
+}
diff --git a/include/nuttx/leds/apa102.h b/include/nuttx/lcd/apa102.h
similarity index 61%
copy from include/nuttx/leds/apa102.h
copy to include/nuttx/lcd/apa102.h
index c13e611f0c..d52682f84e 100644
--- a/include/nuttx/leds/apa102.h
+++ b/include/nuttx/lcd/apa102.h
@@ -1,5 +1,5 @@
 /****************************************************************************
- * include/nuttx/leds/apa102.h
+ * include/nuttx/lcd/apa102.h
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -18,52 +18,41 @@
  *
  ****************************************************************************/
 
-#ifndef __INCLUDE_NUTTX_LEDS_APA102_H
-#define __INCLUDE_NUTTX_LEDS_APA102_H
+#ifndef __INCLUDE_NUTTX_LCD_APA102_H
+#define __INCLUDE_NUTTX_LCD_APA102_H
 
 /****************************************************************************
  * Included Files
  ****************************************************************************/
 
 #include <nuttx/config.h>
+#include <nuttx/fs/ioctl.h>
 
 /* Configuration
- * CONFIG_SPI         - Enables support for SPI drivers
- * CONFIG_LEDS_APA102 - Enables support for the APA102 driver
+ * CONFIG_SPI - Enables support for SPI drivers
+ * CONFIG_LCD_APA102 - Enables support for the APA102 driver
  */
 
-#if defined(CONFIG_SPI) && defined(CONFIG_LEDS_APA102)
+#if defined(CONFIG_SPI) && defined(CONFIG_LCD_APA102)
 
 /****************************************************************************
  * Pre-processor Definitions
  ****************************************************************************/
 
-/* SPI definitions */
+/* Some important "colors" */
 
-#define APA102_SPI_MAXFREQUENCY    (100000) /* Default 4MHz */
+#define APA102_BLACK         0
+#define APA102_WHITE         1
 
-/* APA102 register addresses */
+/* Only two power settings are supported: */
 
-#define APA102_START_FRAME         0x00000000
-#define APA102_HEADER_FRAME        0xe1
-#define APA102_END_FRAME           0x00
+#define APA102_POWER_OFF     0
+#define APA102_POWER_ON      1
 
 /****************************************************************************
  * Public Types
  ****************************************************************************/
 
-struct apa102_ledstrip_s
-{
-  uint8_t bright;
-  uint8_t blue;
-  uint8_t green;
-  uint8_t red;
-};
-
-/****************************************************************************
- * Public Function Prototypes
- ****************************************************************************/
-
 #ifdef __cplusplus
 #define EXTERN extern "C"
 extern "C"
@@ -73,27 +62,28 @@ extern "C"
 #endif
 
 /****************************************************************************
- * Name: apa102_register
+ * Name: apa102_initialize
  *
  * Description:
- *   Register the APA102 device as 'devpath'
+ *   Initialize the APA102 device as a LCD interface.
  *
  * Input Parameters:
- *   devpath - The full path to the driver to register. E.g., "/dev/leddrv0".
- *   spi     - An instance of the SPI interface to use to communicate
- *             with the APA102.
+ *   spi   - An instance of the SPI interface to use to communicate
+ *           with the APA102.
+ *   devno - Device number to identify current display.
  *
  * Returned Value:
  *   Zero (OK) on success; a negated errno value on failure.
  *
  ****************************************************************************/
 
-int apa102_register(FAR const char *devpath, FAR struct spi_dev_s *spi);
+FAR struct lcd_dev_s *apa102_initialize(FAR struct spi_dev_s *spi,
+                                        unsigned int devno);
 
 #undef EXTERN
 #ifdef __cplusplus
 }
 #endif
 
-#endif /* CONFIG_SPI && CONFIG_LEDS_APA102 */
-#endif /* __INCLUDE_NUTTX_LEDS_APA102_H */
+#endif /* CONFIG_SPI && CONFIG_APA102 */
+#endif /* __INCLUDE_NUTTX_LCD_APA102_H */
diff --git a/include/nuttx/leds/apa102.h b/include/nuttx/leds/apa102.h
index c13e611f0c..dadbc0b649 100644
--- a/include/nuttx/leds/apa102.h
+++ b/include/nuttx/leds/apa102.h
@@ -32,8 +32,6 @@
  * CONFIG_LEDS_APA102 - Enables support for the APA102 driver
  */
 
-#if defined(CONFIG_SPI) && defined(CONFIG_LEDS_APA102)
-
 /****************************************************************************
  * Pre-processor Definitions
  ****************************************************************************/
@@ -95,5 +93,4 @@ int apa102_register(FAR const char *devpath, FAR struct 
spi_dev_s *spi);
 }
 #endif
 
-#endif /* CONFIG_SPI && CONFIG_LEDS_APA102 */
 #endif /* __INCLUDE_NUTTX_LEDS_APA102_H */

Reply via email to