You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ma...@apache.org on 2021/04/19 00:40:05 UTC

[incubator-nuttx] 03/03: boards/raspberrypi-pico: Pico Audio Pack (I2S) support

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

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

commit 7fb73dba1c2175d720170f21094194130819ff81
Author: Yuichi Nakamura <y....@gmail.com>
AuthorDate: Sun Apr 18 19:05:37 2021 +0900

    boards/raspberrypi-pico: Pico Audio Pack (I2S) support
---
 boards/arm/rp2040/common/src/Make.defs             |  4 +
 boards/arm/rp2040/common/src/rp2040_i2sdev.c       | 95 ++++++++++++++++++++++
 boards/arm/rp2040/raspberrypi-pico/README.txt      | 14 ++++
 .../raspberrypi-pico/configs/audiopack/defconfig   | 75 +++++++++++++++++
 boards/arm/rp2040/raspberrypi-pico/include/board.h |  1 +
 .../include/{board.h => rp2040_i2sdev.h}           | 62 +++-----------
 .../rp2040/raspberrypi-pico/src/rp2040_bringup.c   |  8 ++
 7 files changed, 208 insertions(+), 51 deletions(-)

diff --git a/boards/arm/rp2040/common/src/Make.defs b/boards/arm/rp2040/common/src/Make.defs
index 259975a..68b28c3 100644
--- a/boards/arm/rp2040/common/src/Make.defs
+++ b/boards/arm/rp2040/common/src/Make.defs
@@ -26,6 +26,10 @@ ifeq ($(CONFIG_RP2040_SPI_DRIVER),y)
 CSRCS += rp2040_spidev.c
 endif
 
+ifeq ($(CONFIG_RP2040_I2S),y)
+CSRCS += rp2040_i2sdev.c
+endif
+
 ifeq ($(CONFIG_LCD_SSD1306),y)
 CSRCS += rp2040_ssd1306.c
 endif
diff --git a/boards/arm/rp2040/common/src/rp2040_i2sdev.c b/boards/arm/rp2040/common/src/rp2040_i2sdev.c
new file mode 100644
index 0000000..2b74f68
--- /dev/null
+++ b/boards/arm/rp2040/common/src/rp2040_i2sdev.c
@@ -0,0 +1,95 @@
+/****************************************************************************
+ * boards/arm/rp2040/common/src/rp2040_i2sdev.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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdio.h>
+#include <debug.h>
+#include <errno.h>
+
+#include <nuttx/audio/audio.h>
+#include <nuttx/audio/audio_i2s.h>
+#include <nuttx/audio/i2s.h>
+#include <nuttx/audio/pcm.h>
+
+#include <arch/board/board.h>
+
+#include "arm_arch.h"
+#include "rp2040_i2s.h"
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_i2sdev_initialize
+ *
+ * Description:
+ *   Initialize i2s driver and register the /dev/audio/pcm0 device.
+ *
+ ****************************************************************************/
+
+int board_i2sdev_initialize(int port)
+{
+  FAR struct audio_lowerhalf_s *audio_i2s;
+  FAR struct audio_lowerhalf_s *pcm;
+  FAR struct i2s_dev_s *i2s;
+  char devname[12];
+  int ret;
+
+  ainfo("Initializing I2S\n");
+
+  i2s = rp2040_i2sbus_initialize(port);
+
+#ifdef CONFIG_AUDIO_I2SCHAR
+  i2schar_register(i2s, 0);
+#endif
+
+  audio_i2s = audio_i2s_initialize(i2s, true);
+
+  if (!audio_i2s)
+    {
+      auderr("ERROR: Failed to initialize I2S\n");
+      return -ENODEV;
+    }
+
+  pcm = pcm_decode_initialize(audio_i2s);
+
+  if (!pcm)
+    {
+      auderr("ERROR: Failed create the PCM decoder\n");
+      return  -ENODEV;
+    }
+
+  snprintf(devname, 12, "pcm%d", port);
+
+  ret = audio_register(devname, pcm);
+
+  if (ret < 0)
+    {
+      auderr("ERROR: Failed to register /dev/%s device: %d\n", devname, ret);
+    }
+
+  return 0;
+}
diff --git a/boards/arm/rp2040/raspberrypi-pico/README.txt b/boards/arm/rp2040/raspberrypi-pico/README.txt
index d3a4f30..23fa5f8 100644
--- a/boards/arm/rp2040/raspberrypi-pico/README.txt
+++ b/boards/arm/rp2040/raspberrypi-pico/README.txt
@@ -13,6 +13,7 @@ Currently only the following devices are suppored.
   - I2C
   - SPI
   - DMAC
+  - PIO (RP2040 Programmable I/O)
   - Flash ROM Boot
   - SRAM Boot
     - If Pico SDK is available, nuttx.uf2 file which can be used in
@@ -21,6 +22,8 @@ Currently only the following devices are suppored.
   - INA219 sensor / module (don't forget to define I2C0 GPIOs at "I2C0 GPIO pin assign" in Board Selection menu)
   - Pico Display Pack (ST7789 LCD)
     - RGB leds and buttons are not supported yet.
+  - Pico Audio Pack (PCM5100A I2S DAC)
+    - I2S interface is realized by PIO.
 
   Not supported:
   - All other devices
@@ -109,6 +112,12 @@ Defconfigs
     See the following page for connection:
       https://shop.pimoroni.com/products/pico-display-pack
 
+- audiopack
+    Pico Audio Pack support
+    See the following page for connection:
+      https://shop.pimoroni.com/products/pico-audio-pack
+    SD card interface is also enabled.
+
 License exceptions
 ==================
 
@@ -120,5 +129,10 @@ So, the files are licensed under 3-Clause BSD same as Pico SDK.
 - arch/arm/src/rp2040/rp2040_xosc.c
   - These are created by referring the Pico SDK clock initialization.
 
+- arch/arm/src/rp2040/rp2040_pio.c
+- arch/arm/src/rp2040/rp2040_pio.h
+- arch/arm/src/rp2040/rp2040_pio_instructions.h
+  - These provide the similar APIs to Pico SDK's hardware_pio APIs.
+
 - arch/arm/src/rp2040/hardware/*.h
   - These are generated from rp2040.svd originally provided in Pico SDK.
diff --git a/boards/arm/rp2040/raspberrypi-pico/configs/audiopack/defconfig b/boards/arm/rp2040/raspberrypi-pico/configs/audiopack/defconfig
new file mode 100644
index 0000000..479ae48
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico/configs/audiopack/defconfig
@@ -0,0 +1,75 @@
+#
+# This file is autogenerated: PLEASE DO NOT EDIT IT.
+#
+# You can use "make menuconfig" to make any modifications to the installed .config file.
+# You can then do "make savedefconfig" to generate a new defconfig file that includes your
+# modifications.
+#
+# CONFIG_AUDIO_FORMAT_MP3 is not set
+# CONFIG_FS_PROCFS_EXCLUDE_ENVIRON is not set
+# CONFIG_LIBC_LONG_LONG is not set
+# CONFIG_MMCSD_HAVE_CARDDETECT is not set
+# CONFIG_MMCSD_HAVE_WRITEPROTECT is not set
+# CONFIG_NSH_ARGCAT is not set
+# CONFIG_NSH_CMDOPT_HEXDUMP is not set
+# CONFIG_NSH_DISABLE_DATE is not set
+# CONFIG_NSH_DISABLE_LOSMART is not set
+# CONFIG_NSH_DISABLE_MB is not set
+# CONFIG_NSH_DISABLE_MH is not set
+# CONFIG_NSH_DISABLE_MW is not set
+# CONFIG_NSH_DISABLE_PRINTF is not set
+# CONFIG_NSH_DISABLE_TRUNCATE is not set
+# CONFIG_SPI_CALLBACK is not set
+# CONFIG_STANDARD_SERIAL is not set
+CONFIG_ARCH="arm"
+CONFIG_ARCH_BOARD="raspberrypi-pico"
+CONFIG_ARCH_BOARD_RASPBERRYPI_PICO=y
+CONFIG_ARCH_CHIP="rp2040"
+CONFIG_ARCH_CHIP_RP2040=y
+CONFIG_ARCH_RAMVECTORS=y
+CONFIG_ARCH_STACKDUMP=y
+CONFIG_AUDIO=y
+CONFIG_AUDIO_I2S=y
+CONFIG_AUDIO_I2SCHAR=y
+CONFIG_BOARDCTL_RESET=y
+CONFIG_BOARD_LOOPSPERMSEC=10450
+CONFIG_BUILTIN=y
+CONFIG_DEBUG_FULLOPT=y
+CONFIG_DEBUG_SYMBOLS=y
+CONFIG_DISABLE_POSIX_TIMERS=y
+CONFIG_DRIVERS_AUDIO=y
+CONFIG_EXAMPLES_HELLO=y
+CONFIG_FAT_LCNAMES=y
+CONFIG_FAT_LFN=y
+CONFIG_FS_FAT=y
+CONFIG_FS_PROCFS=y
+CONFIG_FS_PROCFS_REGISTER=y
+CONFIG_MAX_TASKS=8
+CONFIG_MMCSD=y
+CONFIG_NSH_ARCHINIT=y
+CONFIG_NSH_BUILTIN_APPS=y
+CONFIG_NSH_READLINE=y
+CONFIG_NXPLAYER_DEFAULT_MEDIADIR="/mnt/sd0"
+CONFIG_RAM_SIZE=270336
+CONFIG_RAM_START=0x20000000
+CONFIG_READLINE_CMD_HISTORY=y
+CONFIG_RP2040_I2S=y
+CONFIG_RP2040_SPI0=y
+CONFIG_RP2040_SPI0_GPIO=16
+CONFIG_RP2040_SPI=y
+CONFIG_RP2040_SPISD=y
+CONFIG_RR_INTERVAL=200
+CONFIG_SCHED_HPWORK=y
+CONFIG_SCHED_WAITPID=y
+CONFIG_SDCLONE_DISABLE=y
+CONFIG_START_DAY=9
+CONFIG_START_MONTH=2
+CONFIG_START_YEAR=2021
+CONFIG_SYSLOG_CONSOLE=y
+CONFIG_SYSTEM_NSH=y
+CONFIG_SYSTEM_NXPLAYER=y
+CONFIG_SYSTEM_SPITOOL=y
+CONFIG_TESTING_GETPRIME=y
+CONFIG_TESTING_OSTEST=y
+CONFIG_UART0_SERIAL_CONSOLE=y
+CONFIG_USER_ENTRYPOINT="nsh_main"
diff --git a/boards/arm/rp2040/raspberrypi-pico/include/board.h b/boards/arm/rp2040/raspberrypi-pico/include/board.h
index 7269745..539c809 100644
--- a/boards/arm/rp2040/raspberrypi-pico/include/board.h
+++ b/boards/arm/rp2040/raspberrypi-pico/include/board.h
@@ -29,6 +29,7 @@
 
 #include "rp2040_i2cdev.h"
 #include "rp2040_spidev.h"
+#include "rp2040_i2sdev.h"
 
 #include "rp2040_spisd.h"
 
diff --git a/boards/arm/rp2040/raspberrypi-pico/include/board.h b/boards/arm/rp2040/raspberrypi-pico/include/rp2040_i2sdev.h
similarity index 56%
copy from boards/arm/rp2040/raspberrypi-pico/include/board.h
copy to boards/arm/rp2040/raspberrypi-pico/include/rp2040_i2sdev.h
index 7269745..7d1b575 100644
--- a/boards/arm/rp2040/raspberrypi-pico/include/board.h
+++ b/boards/arm/rp2040/raspberrypi-pico/include/rp2040_i2sdev.h
@@ -1,5 +1,5 @@
 /****************************************************************************
- * boards/arm/rp2040/raspberrypi-pico/include/board.h
+ * boards/arm/rp2040/raspberrypi-pico/include/rp2040_i2sdev.h
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -18,50 +18,15 @@
  *
  ****************************************************************************/
 
-#ifndef __BOARDS_ARM_RP2040_RASPBERRYPI_PICO_INCLUDE_BOARD_H
-#define __BOARDS_ARM_RP2040_RASPBERRYPI_PICO_INCLUDE_BOARD_H
+#ifndef __BOARDS_ARM_RP2040_RASPBERRYPI_PICO_INCLUDE_RP2040_I2SDEV_H
+#define __BOARDS_ARM_RP2040_RASPBERRYPI_PICO_INCLUDE_RP2040_I2SDEV_H
 
 /****************************************************************************
  * Included Files
  ****************************************************************************/
 
 #include <nuttx/config.h>
-
-#include "rp2040_i2cdev.h"
-#include "rp2040_spidev.h"
-
-#include "rp2040_spisd.h"
-
-#ifndef __ASSEMBLY__
-# include <stdint.h>
-#endif
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/* Clocking *****************************************************************/
-
-#define MHZ                     1000000
-
-#define BOARD_XOSC_FREQ         (12 * MHZ)
-#define BOARD_PLL_SYS_FREQ      (125 * MHZ)
-#define BOARD_PLL_USB_FREQ      (48 * MHZ)
-
-#define BOARD_REF_FREQ          (12 * MHZ)
-#define BOARD_SYS_FREQ          (125 * MHZ)
-#define BOARD_PERI_FREQ         (125 * MHZ)
-#define BOARD_USB_FREQ          (48 * MHZ)
-#define BOARD_ADC_FREQ          (48 * MHZ)
-#define BOARD_RTC_FREQ          46875
-
-#define BOARD_UART_BASEFREQ     BOARD_PERI_FREQ
-
-#define BOARD_TICK_CLOCK        (1 * MHZ)
-
-/* GPIO definitions *********************************************************/
-
-#define BOARD_GPIO_LED_PIN      25
+#include <stdint.h>
 
 /****************************************************************************
  * Public Types
@@ -87,26 +52,21 @@ extern "C"
  ****************************************************************************/
 
 /****************************************************************************
- * Name: rp2040_boardearlyinitialize
- *
- * Description:
- *
- ****************************************************************************/
-
-void rp2040_boardearlyinitialize(void);
-
-/****************************************************************************
- * Name: rp2040_boardinitialize
+ * Name: board_i2sdev_initialize
  *
  * Description:
+ *   Initialize i2s driver and register the /dev/audio/pcm0 device.
  *
  ****************************************************************************/
 
-void rp2040_boardinitialize(void);
+#ifdef CONFIG_RP2040_I2S
+int board_i2sdev_initialize(int bus);
+#endif
 
 #undef EXTERN
 #if defined(__cplusplus)
 }
 #endif
+
 #endif /* __ASSEMBLY__ */
-#endif /* __BOARDS_ARM_RP2040_RASPBERRYPI_PICO_INCLUDE_BOARD_H */
+#endif /* __BOARDS_ARM_RP2040_RASPBERRYPI_PICO_INCLUDE_RP2040_I2SDEV_H */
diff --git a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c b/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c
index dd040d7..570d0ed 100644
--- a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c
+++ b/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c
@@ -134,5 +134,13 @@ int rp2040_bringup(void)
     }
 #endif
 
+#ifdef CONFIG_RP2040_I2S
+  ret = board_i2sdev_initialize(0);
+  if (ret < 0)
+    {
+      _err("ERROR: Failed to initialize I2S.\n");
+    }
+#endif
+
   return ret;
 }