NuMaker audio playback

Files at this revision

API Documentation at this revision

Comitter:
csyang2 csyang2@nuvoton.com
Date:
Tue Apr 28 20:32:41 2020 +0800
Parent:
14:9681681dfea2
Child:
16:90288541154c
Commit message:
Added NUMAKER_IOT_M487

Changed in this revision

README.md Show annotated file Show diff for this revision Revisions of this file
TARGET_NUMAKER_IOT_M487/NuMaker-mbed-SD-driver.lib Show annotated file Show diff for this revision Revisions of this file
TARGET_NUMAKER_PFM_M487/NuMaker-mbed-SD-driver.lib Show annotated file Show diff for this revision Revisions of this file
TARGET_NUMAKER_PFM_NUC472/NuMaker-mbed-SD-driver.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-os.lib Show annotated file Show diff for this revision Revisions of this file
mbed_app.json Show annotated file Show diff for this revision Revisions of this file
--- a/README.md	Fri Apr 20 14:46:08 2018 +0800
+++ b/README.md	Tue Apr 28 20:32:41 2020 +0800
@@ -36,6 +36,11 @@
 2. mbed toolchain "GCC_ARM"
 3. mbed compile
 
+Target board "NUMAKER_IOT_M487".
+1. mbed target "NUMAKER_IOT_M487"
+2. mbed toolchain "GCC_ARM"
+3. mbed compile
+
 Please note that to connect headphone and microphone or headset to hear the loopback result.
 
 Demo condition:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TARGET_NUMAKER_IOT_M487/NuMaker-mbed-SD-driver.lib	Tue Apr 28 20:32:41 2020 +0800
@@ -0,0 +1,1 @@
+https://github.com/OpenNuvoton/NuMaker-mbed-SD-driver/#f9f81fcba836a651e57fa3b3ed31ba5954142306
\ No newline at end of file
--- a/TARGET_NUMAKER_PFM_M487/NuMaker-mbed-SD-driver.lib	Fri Apr 20 14:46:08 2018 +0800
+++ b/TARGET_NUMAKER_PFM_M487/NuMaker-mbed-SD-driver.lib	Tue Apr 28 20:32:41 2020 +0800
@@ -1,1 +1,1 @@
-https://github.com/OpenNuvoton/NuMaker-mbed-SD-driver/#7b763a96fa361da47a294efbe4bc201f7fb9c818
+https://github.com/OpenNuvoton/NuMaker-mbed-SD-driver/#f9f81fcba836a651e57fa3b3ed31ba5954142306
\ No newline at end of file
--- a/TARGET_NUMAKER_PFM_NUC472/NuMaker-mbed-SD-driver.lib	Fri Apr 20 14:46:08 2018 +0800
+++ b/TARGET_NUMAKER_PFM_NUC472/NuMaker-mbed-SD-driver.lib	Tue Apr 28 20:32:41 2020 +0800
@@ -1,1 +1,1 @@
-https://github.com/OpenNuvoton/NuMaker-mbed-SD-driver/#253f370c308331fc9a82b5387ed108750ac70ac8
+https://github.com/OpenNuvoton/NuMaker-mbed-SD-driver/#f9f81fcba836a651e57fa3b3ed31ba5954142306
\ No newline at end of file
--- a/main.cpp	Fri Apr 20 14:46:08 2018 +0800
+++ b/main.cpp	Tue Apr 28 20:32:41 2020 +0800
@@ -1,6 +1,6 @@
 #include "mbed.h"
 
-#if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487)
+#if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
 #include "FATFileSystem.h"
 #include "NuSDBlockDevice.h"
 #include <stdio.h>
@@ -35,6 +35,12 @@
 NAU88L25 audio(MBED_CONF_APP_I2C_SDA, MBED_CONF_APP_I2C_SCL, MBED_CONF_APP_I2C_ADDR, MBED_CONF_APP_I2S_DO,
     MBED_CONF_APP_I2S_DI, MBED_CONF_APP_I2S_BCLK, MBED_CONF_APP_I2S_MCLK, MBED_CONF_APP_I2S_LRCK); // NAU88L25 object
 DigitalOut hp_enable(LED2); //dummy function
+#elif defined(TARGET_NUMAKER_IOT_M487)
+#include "NAU88L25.h"
+
+NAU88L25 audio(MBED_CONF_APP_I2C_SDA, MBED_CONF_APP_I2C_SCL, MBED_CONF_APP_I2C_ADDR, MBED_CONF_APP_I2S_DO,
+    MBED_CONF_APP_I2S_DI, MBED_CONF_APP_I2S_BCLK, MBED_CONF_APP_I2S_MCLK, MBED_CONF_APP_I2S_LRCK); // NAU88L25 object
+DigitalOut hp_enable(PE_13);
 #endif
 
 InterruptIn button(SW2);    // button SW2
@@ -53,7 +59,7 @@
 char channelCount = 2;
 char sampleBitLength = 16;
 
-#if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487)
+#if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
 FILE *fd;
 
 int theta = 0;
@@ -111,6 +117,11 @@
     audio.write((int *)audioBuf, readPtr, 1);
     readPtr += 1;
     readPtr &= 0x7; // sine1k / 4 - 1
+#elif defined(TARGET_NUMAKER_IOT_M487)
+    audio.write(audioBuf, readPtr, 4);
+    readPtr += 4;
+    readPtr &= 0xFFF;
+    theta -= 4;
 #endif
 }
 
@@ -154,6 +165,20 @@
        due to SRAM size limitation
        just demo loopback
     */
+#elif defined(TARGET_NUMAKER_IOT_M487)
+    audioBuf[writePtr] = audio.rxBuffer[0];
+    //audioBuf[++writePtr] = audio.rxBuffer[1];
+    //audioBuf[++writePtr] = audio.rxBuffer[2];
+    //audioBuf[++writePtr] = audio.rxBuffer[3];
+    //audioBuf[++writePtr] = audio.rxBuffer[4];
+    //audioBuf[++writePtr] = audio.rxBuffer[5];
+    //audioBuf[++writePtr] = audio.rxBuffer[6];
+    //audioBuf[++writePtr] = audio.rxBuffer[7];
+    ++writePtr;
+    theta += 1;
+    if (writePtr > 4094) {
+        writePtr = 0;
+    }
 #endif
 }
 
@@ -196,6 +221,18 @@
         Thread::wait(500);
         printf("fill\r\n");
     }
+#elif defined(TARGET_NUMAKER_IOT_M487)
+    while (!feof(fd)) {
+        if (theta < 4096) {
+            // read 2 integers
+            fread(&audioBuf[writePtr], 4, 2, fd);
+            audio.lock();   // protect shared variable
+            theta += 2;
+            audio.unlock(); // protect shared variable
+            writePtr += 2;
+            writePtr &= 0xFFF;
+        }
+    }
 #endif
 }
 
@@ -246,6 +283,25 @@
     while (flag == 0) {
         Thread::wait(500);
     }
+#elif defined(TARGET_NUMAKER_IOT_M487)
+    int i = 0;
+    while (1) {
+        if (theta > 512 ) {
+            fwrite(&audioBuf[readPtr], 4, 128, fd);
+            audio.lock();   // protect shared variable
+            theta -= 128;
+            audio.unlock(); // protect shared variable
+            readPtr += 128;
+            if (readPtr > 4094)
+                readPtr = 0;
+            
+            i += 512;
+        }
+        
+        /* record about 10 seconds PCM */
+        if (i >= samplingRate*channelCount*sampleBitLength/8*10)
+            break;
+    }
 #endif
 }
 
@@ -258,7 +314,7 @@
         audioBuf[i] = 0;
     }
     
-#if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487)
+#if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
     printf("Opening a new file test.pcm");
     fd = fopen("/fs/test.pcm", "w");
     errno_error(fd);
@@ -272,7 +328,7 @@
     
     drainAudioBuf();
     
-#if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487)
+#if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
     fclose(fd);
 #endif
     
@@ -281,7 +337,7 @@
 }
 
 void demo_play(void) {
-#if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487)
+#if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
     printf("Opening file test.pcm read-only");
     fd = fopen("/fs/test.pcm", "r");
     //fd = fopen("/fs/82.wav", "r");
@@ -313,7 +369,7 @@
     
     fillAudioBuf();
     
-#if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487)
+#if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
     fclose(fd);
 #endif
     
@@ -354,7 +410,7 @@
     
     button.rise(&flip);
     
-#if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487)
+#if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
     int error = 0;
     
     printf("Mounting the filesystem on \"/fs\" ");
--- a/mbed-os.lib	Fri Apr 20 14:46:08 2018 +0800
+++ b/mbed-os.lib	Tue Apr 28 20:32:41 2020 +0800
@@ -1,1 +1,1 @@
-https://github.com/ARMmbed/mbed-os/#f9ee4e849f8cbd64f1ec5fdd4ad256585a208360
+https://github.com/ARMmbed/mbed-os/#679d24833acf0a0b5b0d528576bb37c70863bc4e
--- a/mbed_app.json	Fri Apr 20 14:46:08 2018 +0800
+++ b/mbed_app.json	Tue Apr 28 20:32:41 2020 +0800
@@ -70,6 +70,23 @@
             "I2S_BCLK": "PC_1",
             "I2S_MCLK": "PE_0",
             "I2S_LRCK": "PC_0"
+        },
+        "NUMAKER_IOT_M487": {
+            "SD_DAT0":  "PE_2",
+            "SD_DAT1":  "PE_3",
+            "SD_DAT2":  "PB_4",
+            "SD_DAT3":  "PB_5",
+            "SD_CMD":   "PE_7",
+            "SD_CLK":   "PE_6",
+            "SD_CD":    "PD_13",
+            "I2C_SDA":  "PD_0",
+            "I2C_SCL":  "PD_1",
+            "I2C_ADDR": "0x1A",
+            "I2S_DO":   "PF_7",
+            "I2S_DI":   "PF_8",
+            "I2S_BCLK": "PF_10",
+            "I2S_MCLK": "PF_9",
+            "I2S_LRCK": "PF_6"
         }
     }
 }