From 45d62ff7df9260b01d01aae331a59a1ec0ee04c5 Mon Sep 17 00:00:00 2001 From: Sidney Leung Date: Wed, 5 Oct 2016 14:04:33 -0700 Subject: [PATCH 1/4] Initial version of the CurieAudio library. This library originates from the CurieI2S\src\CurieI2SDMA module. It forms the physical layer of the Sound library concept from Arduio. The library utilizes two drivers: soc_i2s and soc_dma. The library performs I2S I/O in blocks of audio data via DMA cbannels. --- .../tone_generator/tone_generator.ino | 336 ++++++++++++++++++ libraries/CurieAudio/keywords.txt | 30 ++ libraries/CurieAudio/library.properties | 11 + libraries/CurieAudio/src/I2SController.cpp | 80 +++++ libraries/CurieAudio/src/I2SController.h | 108 ++++++ libraries/CurieAudio/src/I2SInput.cpp | 112 ++++++ libraries/CurieAudio/src/I2SInput.h | 55 +++ libraries/CurieAudio/src/I2SOutput.cpp | 126 +++++++ libraries/CurieAudio/src/I2SOutput.h | 56 +++ .../I2SDMA_RXCallBack/I2SDMA_RXCallBack.ino | 122 ------- .../I2SDMA_TXCallBack/I2SDMA_TXCallBack.ino | 69 ---- .../CurieI2S/examples/playTone/playTone.ino | 214 +++++++++++ libraries/CurieI2S/keywords.txt | 10 +- libraries/CurieI2S/src/CurieI2S.cpp | 16 +- libraries/CurieI2S/src/CurieI2S.h | 37 +- libraries/CurieI2S/src/CurieI2SDMA.cpp | 316 ---------------- libraries/CurieI2S/src/CurieI2SDMA.h | 83 ----- system/libarc32_arduino101/drivers/soc_dma.c | 15 +- system/libarc32_arduino101/drivers/soc_dma.h | 1 + system/libarc32_arduino101/drivers/soc_i2s.c | 115 +++--- system/libarc32_arduino101/drivers/soc_i2s.h | 25 +- variants/arduino_101/libarc32drv_arduino101.a | Bin 782628 -> 784020 bytes 22 files changed, 1241 insertions(+), 696 deletions(-) create mode 100755 libraries/CurieAudio/examples/tone_generator/tone_generator.ino create mode 100644 libraries/CurieAudio/keywords.txt create mode 100644 libraries/CurieAudio/library.properties create mode 100644 libraries/CurieAudio/src/I2SController.cpp create mode 100644 libraries/CurieAudio/src/I2SController.h create mode 100644 libraries/CurieAudio/src/I2SInput.cpp create mode 100644 libraries/CurieAudio/src/I2SInput.h create mode 100644 libraries/CurieAudio/src/I2SOutput.cpp create mode 100644 libraries/CurieAudio/src/I2SOutput.h delete mode 100644 libraries/CurieI2S/examples/I2SDMA_RXCallBack/I2SDMA_RXCallBack.ino delete mode 100644 libraries/CurieI2S/examples/I2SDMA_TXCallBack/I2SDMA_TXCallBack.ino create mode 100644 libraries/CurieI2S/examples/playTone/playTone.ino delete mode 100644 libraries/CurieI2S/src/CurieI2SDMA.cpp delete mode 100644 libraries/CurieI2S/src/CurieI2SDMA.h diff --git a/libraries/CurieAudio/examples/tone_generator/tone_generator.ino b/libraries/CurieAudio/examples/tone_generator/tone_generator.ino new file mode 100755 index 00000000..526659e8 --- /dev/null +++ b/libraries/CurieAudio/examples/tone_generator/tone_generator.ino @@ -0,0 +1,336 @@ +// Arduino Zero / Feather M0 I2S audio tone generation example. +// Author: Tony DiCola +// +// Connect an I2S DAC or amp (like the MAX98357) to the Arduino Zero +// and play back simple sine, sawtooth, triangle, and square waves. +// Makes your Zero sound like a NES! +// +// NOTE: The I2S signal generated by the Zero does NOT have a MCLK / +// master clock signal. You must use an I2S receiver that can operate +// without a MCLK signal (like the MAX98357). +// +// For an Arduino Zero / Feather M0 connect it to you I2S hardware as follows: +// - Digital 0 -> I2S LRCLK / FS (left/right / frame select clock) +// - Digital 1 -> I2S BCLK / SCLK (bit / serial clock) +// - Digital 9 -> I2S DIN / SD (data output) +// - Ground +// +// Depends on the Adafruit_ASFcore library from: +// https://github.com/adafruit/adafruit_asfcore +// +// Released under a MIT license: https://opensource.org/licenses/MIT + + +#ifdef ARDUINO_ARCH_ARC32 +#include +#else +#include "Adafruit_ASFcore.h" +#include "Adafruit_ZeroI2S.h" +#endif + + +#ifdef ARDUINO_ARCH_ARC32 +#define SAMPLE_RATE I2S_22KHZ +#endif + +#define SAMPLERATE_HZ 22000 // The sample rate of the audio. Higher sample rates have better fidelity, + // but these tones are so simple it won't make a difference. 44.1khz is + // standard CD quality sound. + +#define AMPLITUDE 100 // Set the amplitude of generated waveforms. This controls how loud + // the signals are, and can be any value from 0 to 65535. Start with + // a low value like 5000 or less to prevent damaging speakers! + +#define WAV_SIZE 256 // The size of each generated waveform. The larger the size the higher + // quality the signal. A size of 256 is more than enough for these simple + // waveforms. + + +// Define the frequency of music notes (from http://www.phy.mtu.edu/~suits/notefreqs.html): +#define C4_HZ 261.63 +#define D4_HZ 293.66 +#define E4_HZ 329.63 +#define F4_HZ 349.23 +#define G4_HZ 392.00 +#define A4_HZ 440.00 +#define B4_HZ 493.88 + +// Define a C-major scale to play all the notes up and down. +float scale[] = { C4_HZ, D4_HZ, E4_HZ, F4_HZ, G4_HZ, A4_HZ, B4_HZ, A4_HZ, G4_HZ, F4_HZ, E4_HZ, D4_HZ, C4_HZ }; + +// Store basic waveforms in memory. +int32_t sine[WAV_SIZE] = {0}; +int32_t sawtooth[WAV_SIZE] = {0}; +int32_t triangle[WAV_SIZE] = {0}; +int32_t square[WAV_SIZE] = {0}; + +#ifdef ARDUINO_ARCH_ARC32 + +// Create ping pong buffers for streaming audio data out via DMA in foreground while +// Background fills up the buffers. + +#define NUMBER_OF_SAMPLES 256 + +struct pingpongstruct { + int32_t buf[NUMBER_OF_SAMPLES]; // Left and right samples + uint16_t empty; +} ppBuffer[2]; + +uint16_t i2sRunning = 0; +uint16_t needKickoff = 0; +int16_t sendIndex = 0; +int16_t fillIndex = 0; + +uint32_t sendErrorCount = 0; +uint32_t bufCount; +#endif + +#ifndef ARDUINO_ARCH_ARC32 +/*********************** +// Create I2S audio transmitter object. +Adafruit_ZeroI2S_TX i2s = Adafruit_ZeroI2S_TX(); +***********************/ +//// I2S audio transmitter object has been defined in the CurieI2S file + +// Little define to make the native USB port on the Arduino Zero / Zero feather +// the default for serial output. +#define Serial SerialUSB +#endif + + +void generateSine(uint16_t amplitude, int32_t* buffer, uint16_t length) { + // Generate a sine wave signal with the provided amplitude and store it in + // the provided buffer of size length. + for (int i=0; i= NUMBER_OF_SAMPLES) { + kickOff(); + + if (ppBuffer[nextBuffer].empty == 1) { + fillIndex = nextBuffer; + bufIndex = 0; + } + } +} + +#endif + + + +void playWave(int32_t* buffer, uint16_t length, float frequency, float seconds) { +#ifdef ARDUINO_ARCH_ARC32 + bufCount = 0; + sendErrorCount = 0; + // push some silence to get things going + for (int i = 0; i < 64; i++) + sendSample(0, 0, 0); +#endif + + // Play back the provided waveform buffer for the specified + // amount of seconds. + // First calculate how many samples need to play back to run + // for the desired amount of seconds. + uint32_t iterations = seconds*SAMPLERATE_HZ; + + // Then calculate the 'speed' at which we move through the wave + // buffer based on the frequency of the tone being played. + float delta = (frequency*length)/float(SAMPLERATE_HZ); + + // Now loop through all the samples and play them, calculating the + // position within the wave buffer for each moment in time. + + for (uint32_t i=0; i=1.6.3) diff --git a/libraries/CurieAudio/src/I2SController.cpp b/libraries/CurieAudio/src/I2SController.cpp new file mode 100644 index 00000000..60d0945e --- /dev/null +++ b/libraries/CurieAudio/src/I2SController.cpp @@ -0,0 +1,80 @@ +//*************************************************************** +// +// Copyright (c) 2016 Intel Corporation. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +//*************************************************************** + +#include "I2SController.h" +#include "variant.h" + +uint16_t sampleRateLookupTable[MAX_I2S_SIZE][MAX_I2S_RATE] = { + // 8K 12k 22k 24k 44k 48k + { 125, 83, 45, 42, 23, 21}, // I2S_16bit + { 83, 56, 30, 28, 15, 14}, // I2S_24bit + { 63, 42, 23, 21, 11, 10} // I2S_32bit +}; + +uint8_t sampleSizeLookupTable[MAX_I2S_SIZE] = {16, 24, 32}; + + +I2SController::I2SController() +{ + sampleRateMap = (uint16_t *)sampleRateLookupTable; + sampleSizeMap = sampleSizeLookupTable; +} + + +void I2SController::muxTX(bool enable) +{ + int mux_mode = GPIO_MUX_MODE; + if(enable) + { + mux_mode = I2S_MUX_MODE; + } + + /* Set SoC pin mux configuration */ + SET_PIN_MODE(g_APinDescription[I2S_TXD].ulSocPin, mux_mode); + SET_PIN_MODE(g_APinDescription[I2S_TWS].ulSocPin, mux_mode); + SET_PIN_MODE(g_APinDescription[I2S_TSCK].ulSocPin, mux_mode); + + // g_APinDescription is residing in ROM now, no update to the structure + // g_APinDescription[I2S_TXD].ulPinMode = mux_mode; + // g_APinDescription[I2S_TWS].ulPinMode = mux_mode; + // g_APinDescription[I2S_TSCK].ulPinMode = mux_mode; +} + + +void I2SController::muxRX(bool enable) +{ + int mux_mode = GPIO_MUX_MODE; + if(enable) + { + mux_mode = I2S_MUX_MODE; + } + + /* Set SoC pin mux configuration */ + SET_PIN_MODE(49, mux_mode); //I2S_RXD + SET_PIN_MODE(51, mux_mode); //I2S_RWS + SET_PIN_MODE(50, mux_mode); //I2S_RSCK + + // g_APinDescription is residing in ROM now, no update to the structure + // g_APinDescription[I2S_RXD].ulPinMode = mux_mode; + // g_APinDescription[I2S_RWS].ulPinMode = mux_mode; + // g_APinDescription[I2S_RSCK].ulPinMode = mux_mode; +} + + diff --git a/libraries/CurieAudio/src/I2SController.h b/libraries/CurieAudio/src/I2SController.h new file mode 100644 index 00000000..be2d9b74 --- /dev/null +++ b/libraries/CurieAudio/src/I2SController.h @@ -0,0 +1,108 @@ +//*************************************************************** +// +// Copyright (c) 2016 Intel Corporation. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +//*************************************************************** + +#ifndef _I2S_CONTROLLER_H_ +#define _I2S_CONTROLLER_H_ + +#include + +// The following Arduino 101 pins are used for I2S Transmit (Tx) interface. +#define I2S_TXD 7 // Data +#define I2S_TWS 4 // Word Select +#define I2S_TSCK 2 // Clock + +// The following Arduino 101 pins are used for I2S Receive (Rx) interface. +#define I2S_RXD 5 +#define I2S_RWS 3 +#define I2S_RSCK 8 + +// These modes are suppported by the Curie I2S: I2S_MODE_PHILLIPS, +// I2S_MODE_RJ (right justified), I2S_MODE_LJ (left jst), I2S_MODE_DSP. +#define I2S_MODE_SCK_POL (0x01) +#define I2S_MODE_WS_POL (0x02) +#define I2S_MODE_LR_ALIGN (0x08) +#define I2S_MODE_SAMPLE_DEL (0x10) +#define I2S_MODE_WS_DSP (0x20) + +typedef enum { + I2S_MODE_PHILLIPS = (I2S_MODE_LR_ALIGN), + I2S_MODE_RJ = (I2S_MODE_WS_POL | I2S_MODE_SAMPLE_DEL), + I2S_MODE_LJ = (I2S_MODE_WS_POL | I2S_MODE_LR_ALIGN | I2S_MODE_SAMPLE_DEL), + I2S_MODE_DSP = (I2S_MODE_LR_ALIGN | I2S_MODE_WS_DSP) +} curieI2sMode; + +// These are the supported sampling rate for the Curie I2s interface. +typedef enum { + I2S_8KHZ = 0, + I2S_12KHZ, + I2S_22KHZ, + I2S_24KHZ, + I2S_44KHZ, + I2S_48KHZ, + MAX_I2S_RATE +} curieI2sSampleRate; + +// These are the supported sample size for the Curie I2S interface, +typedef enum { + I2S_16bit = 0, + I2S_24bit, + I2S_32bit, + MAX_I2S_SIZE +} curieI2sSampleSize; + +// This is a list of return error code. +typedef enum { + SUCCESS = 0, + I2S_INIT_FAIL, // I2S controller initialization failure. + I2S_WRITE_BUSY, // Previous operation not completed when I2S write is called. + I2S_WRITE_FAIL, // I2S controller write operation failure. + I2S_READ_BUSY, // Previous operation not completed when I2S read is called. + I2S_READ_FAIL, // I2S controller read operation failure. + I2S_MISC_ERROR +} i2sErrorCode; + + +class I2SController +{ + public: + I2SController(); + + // + virtual i2sErrorCode begin(curieI2sSampleRate sample_rate, + curieI2sSampleSize resolution, + curieI2sMode mode, + uint8_t master) = 0; + + // + virtual void end() = 0; + + protected: + // mux/demux the i2s rx pins into i2s mode + void muxRX(bool enable); + + // mux/demux the i2s tx pins into i2s mode + void muxTX(bool enable); + + uint16_t *sampleRateMap; + uint8_t *sampleSizeMap; +}; + + +#endif diff --git a/libraries/CurieAudio/src/I2SInput.cpp b/libraries/CurieAudio/src/I2SInput.cpp new file mode 100644 index 00000000..fe03aad8 --- /dev/null +++ b/libraries/CurieAudio/src/I2SInput.cpp @@ -0,0 +1,112 @@ +//*************************************************************** +// +// Copyright (c) 2016 Intel Corporation. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +//*************************************************************** + +#include "I2SInput.h" +#include "soc_i2s.h" +#include "soc_dma.h" +#include "variant.h" +#include + +I2SInputClass I2SInput; + + +void rxi2s_done(void* x) +{ + I2SInput.rxdone_flag = 1; + if (I2SInput.userCB) + I2SInput.userCB(); +} + +void rxi2s_err(void* x) +{ + I2SInput.rxerror_flag = 1; +} + + +I2SInputClass::I2SInputClass() +{ + rxdone_flag = 1; + rxerror_flag = 0; + userCB = NULL; +} + + +i2sErrorCode I2SInputClass::begin(curieI2sSampleRate sampleRate, + curieI2sSampleSize resolution, + curieI2sMode mode, + uint8_t master) +{ + struct soc_i2s_cfg rxcfg ; + + sampleSize = resolution; + muxRX(1); + soc_i2s_init(I2S_CHANNEL_RX); + soc_dma_init(); + + rxcfg.clk_divider = sampleRateMap[(resolution * MAX_I2S_RATE) + sampleRate]; + rxcfg.resolution = sampleSizeMap[resolution]; + rxcfg.mode = (uint8_t)mode; + rxcfg.master = master; + + rxcfg.cb_done = rxi2s_done; + rxcfg.cb_err = rxi2s_err; + + if (soc_i2s_config(I2S_CHANNEL_RX, &rxcfg) != DRV_RC_OK) + return I2S_INIT_FAIL; + + return SUCCESS; +} + + +void I2SInputClass::end() +{ + soc_i2s_stop_listen(); + muxRX(0); +} + + +i2sErrorCode I2SInputClass::read(uint8_t buffer[], uint32_t length, uint32_t blocking) +{ + if (rxdone_flag != 0) return I2S_READ_BUSY; + + rxdone_flag = 0; + rxerror_flag = 0; + + uint32_t byteAlignment = (sampleSize > I2S_16bit) ? 4 : 2; + + if (soc_i2s_listen((void *)buffer, length, byteAlignment, 0) != DRV_RC_OK) + { + rxdone_flag = 1; + return I2S_READ_FAIL; + } + + if (blocking == 0) return SUCCESS; + + while (1) // use a count to bail. + { + if (rxerror_flag == 1) break; + + if (rxdone_flag == 1) return SUCCESS; + } + + rxdone_flag = 1; + return I2S_READ_FAIL; +} + diff --git a/libraries/CurieAudio/src/I2SInput.h b/libraries/CurieAudio/src/I2SInput.h new file mode 100644 index 00000000..8b10c053 --- /dev/null +++ b/libraries/CurieAudio/src/I2SInput.h @@ -0,0 +1,55 @@ +/* + I2S Input API + Copyright (c) 2016 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef ARDUINO_I2S_INPUT +#define ARDUINO_I2S_INPUT + +#include + +class I2SInputClass : public I2SController +{ + friend void rxi2s_done(void* x); + friend void rxi2s_err(void* x); + + public: + I2SInputClass(); + + i2sErrorCode begin(curieI2sSampleRate sample_rate, + curieI2sSampleSize resolution, + curieI2sMode mode, + uint8_t master = 1); + void end(); + + i2sErrorCode read(uint8_t buffer[], uint32_t length, uint32_t blocking = 1); + + void attachInterrupt(void (*userCallBack)(void)) + { + userCB = userCallBack; + }; + + private: + curieI2sSampleSize sampleSize; + uint8_t rxdone_flag; + uint8_t rxerror_flag; + void (*userCB)(void); +}; + +extern I2SInputClass I2SInput; + +#endif diff --git a/libraries/CurieAudio/src/I2SOutput.cpp b/libraries/CurieAudio/src/I2SOutput.cpp new file mode 100644 index 00000000..ee122796 --- /dev/null +++ b/libraries/CurieAudio/src/I2SOutput.cpp @@ -0,0 +1,126 @@ +//*************************************************************** +// +// Copyright (c) 2016 Intel Corporation. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +//*************************************************************** + +#include "I2SOutput.h" +#include "soc_i2s.h" +#include "soc_dma.h" +#include "variant.h" +#include + +I2SOutputClass I2SOutput; + + +void txi2s_done(void* x) +{ + I2SOutput.txdone_flag = 1; + if (I2SOutput.userCB) + I2SOutput.userCB(0); +} + +void txi2s_err(void* x) +{ + I2SOutput.txerror_flag = 1; + if (I2SOutput.userCB) + I2SOutput.userCB(1); +} + +I2SOutputClass::I2SOutputClass() +{ + txdone_flag = 1; + txerror_flag = 0; + userCB = NULL; + // frameDelay = 5; +} + + +i2sErrorCode I2SOutputClass::begin(curieI2sSampleRate sampleRate, + curieI2sSampleSize resolution, + curieI2sMode mode, + uint8_t master) +{ + struct soc_i2s_cfg txcfg; + + sampleSize = resolution; + muxTX(1); + soc_i2s_init(I2S_CHANNEL_TX); + soc_dma_init(); + + txcfg.clk_divider = sampleRateMap[(resolution * MAX_I2S_RATE) + sampleRate]; + txcfg.resolution = sampleSizeMap[resolution]; + txcfg.mode = (uint8_t)mode; + txcfg.master = master; + + txcfg.cb_done = txi2s_done; + txcfg.cb_err = txi2s_err; + +#ifdef FOR_DEBUGGING + Serial.print("Sample rate divider: "); + Serial.println(txcfg.clk_divider); + Serial.print("Sample resolution: "); + Serial.println(txcfg.resolution); + Serial.print("Mode: "); + Serial.println(mode); +#endif + + if (soc_i2s_config(I2S_CHANNEL_TX, &txcfg) != DRV_RC_OK) + return I2S_INIT_FAIL; + + return SUCCESS; +} + + +void I2SOutputClass::end() +{ + soc_i2s_stop_stream(); + muxTX(0); +} + + +i2sErrorCode I2SOutputClass::write(int32_t buffer[], uint32_t bufferLength, + uint32_t bytePerSample, uint32_t blocking) +{ + // int count = 0; + + if (txdone_flag == 0) return I2S_WRITE_BUSY; + + txdone_flag = 0; + txerror_flag = 0; + + if (soc_i2s_stream((void *)buffer, bufferLength, bytePerSample, 0) != DRV_RC_OK) + { + txdone_flag = 1; + return I2S_WRITE_FAIL; + } + + if (blocking == 0) return SUCCESS; + + while (1) // (count++ < 100000) Need to bail sometime + { + if (txerror_flag == 1) break; + + if (txdone_flag == 1) return SUCCESS; + } + + txerror_flag = 1; + return I2S_WRITE_FAIL; +} + + + diff --git a/libraries/CurieAudio/src/I2SOutput.h b/libraries/CurieAudio/src/I2SOutput.h new file mode 100644 index 00000000..1131ae1d --- /dev/null +++ b/libraries/CurieAudio/src/I2SOutput.h @@ -0,0 +1,56 @@ +/* + I2S Output API + Copyright (c) 2016 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef ARDUINO_I2S_OUTPUT +#define ARDUINO_I2S_OUTPUT + +#include "I2SController.h" + +class I2SOutputClass : public I2SController +{ + friend void txi2s_done(void* x); + friend void txi2s_err(void* x); + + public: + I2SOutputClass(); + + i2sErrorCode begin(curieI2sSampleRate sample_rate, + curieI2sSampleSize resolution, + curieI2sMode mode, + uint8_t master = 1); + void end(); + + i2sErrorCode write(int32_t buffer[], uint32_t bufferLength, + uint32_t bytePerSample, uint32_t blocking = 1); + + void attachCallback(void (*userCallBack)(uint16_t result)) + { + userCB = userCallBack; + }; + + private: + curieI2sSampleSize sampleSize; + uint8_t txdone_flag; + uint8_t txerror_flag; + void (*userCB)(uint16_t result); +}; + +extern I2SOutputClass I2SOutput; + +#endif diff --git a/libraries/CurieI2S/examples/I2SDMA_RXCallBack/I2SDMA_RXCallBack.ino b/libraries/CurieI2S/examples/I2SDMA_RXCallBack/I2SDMA_RXCallBack.ino deleted file mode 100644 index ed099fa1..00000000 --- a/libraries/CurieI2S/examples/I2SDMA_RXCallBack/I2SDMA_RXCallBack.ino +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (c) 2016 Intel Corporation. All rights reserved. - * See the bottom of this file for the license terms. - */ - -/** - * A simple sketch to test the rx channel of the i2s interface. - * A callback function is used to fill up a buffer whenever data is received - * - * To test this sketch you will need a second Arduino/Genuino 101 board with the I2SDMA_TxCallback sketch uploaded - * - * Connection: - * I2S_RSCK(pin 8) -> I2S_TSCK(pin 2) - * I2S_RWS (pin 3) -> I2S_TWS (pin 4) - * I2S_RXD (pin 5) -> I2S_TXD (pin 7) - * Ground (GND) -> Ground (GND) - * Notes: - * Transmission is sensitive to noise. To reduce noise: - * - Power both boards with an external power supply. Usb power is not always clean. - * - Insure that both boards are sharing the same ground. - * - Use short wires to connect between the board or use shielded wire. -**/ -#include - -#define BUFF_SIZE 128 -#define OFFSET 2 -uint32_t dataBuff[BUFF_SIZE+OFFSET]; // extra 2 buffers are for the padding zero - -/** - * the received data: the higher 16 bits should be equal to loop_count and the lower 16 bits should be (0x01~0x80) - * loop_count should increase by 1 in evry loop() - * for example: if first time the received data is 0x00010001~0x00010080, then next time the data should be 0x00020001~0x00020080 -**/ -uint8_t start_flag = 0; -uint8_t done_flag = 0; // when done_flag is 1, the received data are correct -uint32_t loop_count = 0; // record the higher 16 bits of received data -uint32_t shift_count = 0; // the position of first non-zero -void setup() -{ - Serial.begin(115200); // initialize Serial communication - while(!Serial) ; // wait for serial port to connect. - Serial.println("CurieI2SDMA Rx Callback"); - - CurieI2SDMA.iniRX(); - /* - * CurieI2SDMA.beginTX(sample_rate, resolution, master,mode) - * mode 1 : PHILIPS_MODE - * 2 : RIGHT_JST_MODE - * 3 : LEFT_JST_MODE - * 4 : DSP_MODE - */ - CurieI2SDMA.beginRX(44100, 32,0,1); - -} - -void loop() -{ - int status = CurieI2SDMA.transRX(dataBuff,sizeof(dataBuff),sizeof(uint32_t)); - if(status) - return; - - // find out first non-zero - shift_count = 0; - for(uint32_t i = 0;i <= OFFSET;++i) - { - if(dataBuff[i] == 0) - shift_count++; - else - break; - } - if(shift_count > OFFSET) - return; - - // record the higher 16 bits of received data - if(start_flag) - { - if((dataBuff[shift_count]>>16) != loop_count+1) - Serial.println("+++ loop_count jump +++"); - } - else - { - start_flag = 1; - } - loop_count = (dataBuff[shift_count] >> 16); - - // check data serial: the higher 16 bits should be equal to loop_count and the lower 16 bits should be (0x01~0x80) - done_flag = 1; - for(uint32_t i = 0 ;i < BUFF_SIZE;++i) - { - //Serial.println(dataBuff[i+shift_count],HEX); - if ((dataBuff[i+shift_count] & 0XFFFF0000) == (loop_count <<16) - && (dataBuff[i+shift_count] & 0XFFFF) == (i+1)) - ; - else - { - done_flag = 0; - Serial.println(dataBuff[i+shift_count],HEX); - Serial.println("ERROR"); - break; - } - } - - if(done_flag) - Serial.println("RX done"); - delay(100); -} - -/* - Copyright (c) 2016 Intel Corporation. All rights reserved. - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110- - 1301 USA -*/ diff --git a/libraries/CurieI2S/examples/I2SDMA_TXCallBack/I2SDMA_TXCallBack.ino b/libraries/CurieI2S/examples/I2SDMA_TXCallBack/I2SDMA_TXCallBack.ino deleted file mode 100644 index 9ce55501..00000000 --- a/libraries/CurieI2S/examples/I2SDMA_TXCallBack/I2SDMA_TXCallBack.ino +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2016 Intel Corporation. All rights reserved. - * See the bottom of this file for the license terms. - */ - -//I2S_TX -> Pin 7 -//I2S_TSK -> Pin 4 -//I2S_TSCK -> pin 2 - -#include - -#define BUFF_SIZE 128 -boolean blinkState = true; // state of the LED -uint32_t dataBuff[BUFF_SIZE]; -uint32_t loop_count = 0; -void setup() -{ - Serial.begin(115200); // initialize Serial communication - while(!Serial) ; // wait for serial port to connect. - Serial.println("CurieI2SDMA Tx Callback"); - - CurieI2SDMA.iniTX(); - /* - * CurieI2SDMA.beginTX(sample_rate, resolution, master,mode) - * mode 1 : PHILIPS_MODE - * 2 : RIGHT_JST_MODE - * 3 : LEFT_JST_MODE - * 4 : DSP_MODE - */ - CurieI2SDMA.beginTX(44100, 32,1, 1); - digitalWrite(13, blinkState); -} - -void loop() -{ - for(uint32_t i = 0; i I2S LRCLK / FS (left/right / frame select clock) +// - Digital 1 -> I2S BCLK / SCLK (bit / serial clock) +// - Digital 9 -> I2S DIN / SD (data output) +// - Ground +// +// Depends on the Adafruit_ASFcore library from: +// https://github.com/adafruit/adafruit_asfcore +// +// Released under a MIT license: https://opensource.org/licenses/MIT +#ifdef ARDUINO_ARCH_ARC32 +#include +#else +#include "Adafruit_ASFcore.h" +#include "Adafruit_ZeroI2S.h" +#endif + + +#define SAMPLERATE_HZ 22000 // The sample rate of the audio. Higher sample rates have better fidelity, + // but these tones are so simple it won't make a difference. 44.1khz is + // standard CD quality sound. + +#define AMPLITUDE 100 // Set the amplitude of generated waveforms. This controls how loud + // the signals are, and can be any value from 0 to 65535. Start with + // a low value like 5000 or less to prevent damaging speakers! + +#define WAV_SIZE 256 // The size of each generated waveform. The larger the size the higher + // quality the signal. A size of 256 is more than enough for these simple + // waveforms. + + +// Define the frequency of music notes (from http://www.phy.mtu.edu/~suits/notefreqs.html): +#define C4_HZ 261.63 +#define D4_HZ 293.66 +#define E4_HZ 329.63 +#define F4_HZ 349.23 +#define G4_HZ 392.00 +#define A4_HZ 440.00 +#define B4_HZ 493.88 + +// Define a C-major scale to play all the notes up and down. +float scale[] = { C4_HZ, D4_HZ, E4_HZ, F4_HZ, G4_HZ, A4_HZ, B4_HZ, A4_HZ, G4_HZ, F4_HZ, E4_HZ, D4_HZ, C4_HZ }; + +// Store basic waveforms in memory. +int32_t sine[WAV_SIZE] = {0}; +int32_t sawtooth[WAV_SIZE] = {0}; +int32_t triangle[WAV_SIZE] = {0}; +int32_t square[WAV_SIZE] = {0}; + +#ifndef ARDUINO_ARCH_ARC32 +// Create I2S audio transmitter object. +Adafruit_ZeroI2S_TX i2s = Adafruit_ZeroI2S_TX(); + +// Little define to make the native USB port on the Arduino Zero / Zero feather +// the default for serial output. +#define Serial SerialUSB +#endif + + +void generateSine(int32_t amplitude, int32_t* buffer, int32_t length) { + // Generate a sine wave signal with the provided amplitude and store it in + // the provided buffer of size length. + for (int i=0; ihead +1) % I2S_BUFFER_SIZE; - uint32_t data = *I2S_DATA_REG; + int32_t data = *I2S_DATA_REG; if(index != _i2s_Rx_BufferPtr->tail) { _i2s_Rx_BufferPtr->data[_i2s_Rx_BufferPtr->head] = data; @@ -541,7 +541,7 @@ void Curie_I2S::enableInterrupts() interrupt_enable(IRQ_I2S_INTR); } -int Curie_I2S::pushData(uint32_t data) +int Curie_I2S::pushData(int32_t data) { //disable TFIFO_AEMPTY interrupts *I2S_CID_CTRL = *I2S_CID_CTRL & 0xFDFFFFFF; @@ -563,22 +563,22 @@ int Curie_I2S::pushData(uint32_t data) } } -void Curie_I2S::fastPushData(uint32_t data) +void Curie_I2S::fastPushData(int32_t data) { *I2S_DATA_REG = data; } -uint32_t Curie_I2S::pullData() +int32_t Curie_I2S::pullData() { - uint32_t data = *I2S_DATA_REG; + int32_t data = *I2S_DATA_REG; return data; } -uint32_t Curie_I2S::requestdword() +int32_t Curie_I2S::requestdword() { if(_i2s_Rx_BufferPtr->head != _i2s_Rx_BufferPtr->tail) { - uint32_t data = _i2s_Rx_BufferPtr->data[_i2s_Rx_BufferPtr->tail]; + int32_t data = _i2s_Rx_BufferPtr->data[_i2s_Rx_BufferPtr->tail]; _i2s_Rx_BufferPtr->tail = (_i2s_Rx_BufferPtr->tail + 1)%I2S_BUFFER_SIZE; return data; } @@ -588,7 +588,7 @@ uint32_t Curie_I2S::requestdword() if(*I2S_RFIFO_STAT & 0x0000000F) { int index = (uint32_t)(_i2s_Rx_BufferPtr->head +1) % I2S_BUFFER_SIZE; - uint32_t data = *I2S_DATA_REG; + int32_t data = *I2S_DATA_REG; if(index != _i2s_Rx_BufferPtr->tail) { _i2s_Rx_BufferPtr->data[_i2s_Rx_BufferPtr->head] = data; diff --git a/libraries/CurieI2S/src/CurieI2S.h b/libraries/CurieI2S/src/CurieI2S.h index e7eb8894..42258260 100644 --- a/libraries/CurieI2S/src/CurieI2S.h +++ b/libraries/CurieI2S/src/CurieI2S.h @@ -32,12 +32,21 @@ #define DSP_MODE 0b101000101000 //Sample Rate I2S_SRR Values -#define I2S_48K 0x000A000A -#define I2S_44K 0x000F000F -#define I2S_24K 0x001C001C -#define I2S_22K 0x001E001E -#define I2S_12K 0x00530053 -#define I2S_8K 0x007D007D +#define I2S_48K_32bit 0x000A000A +#define I2S_44K_32bit 0x000B000B +#define I2S_24K_32bit 0x00150015 +#define I2S_22K_32bit 0x00170017 +#define I2S_12K_32bit 0x002A002A + +#define I2S_48K_24bit 0x000A000A +#define I2S_44K_24bit 0x000F000F +#define I2S_24K_24bit 0x001C001C +#define I2S_22K_24bit 0x001E001E + +#define I2S_44K_16bit 0x00170017 +#define I2S_22K_16bit 0x002D002D +#define I2S_12K_16bit 0x00530053 +#define I2S_8K_16bit 0x007D007D //Resolution I2S_SRR Values #define I2S_32bit 0xF800F800 @@ -47,14 +56,14 @@ //Registers #define I2S_CTRL (uint32_t *)0xB0003800 //I2S Control Register #define I2S_STAT (volatile uint32_t *)0xB0003804 //I2S Status Register -#define I2S_SRR (uint32_t *)0xB0003808 //I2S Channels Sample Rate & Resolution Configuration Register +#define I2S_SRR (volatile uint32_t *)0xB0003808 //I2S Channels Sample Rate & Resolution Configuration Register #define I2S_CID_CTRL (uint32_t *)0xB000380C //Clock, Interrupt and DMA Control Register #define I2S_TFIFO_STAT (volatile uint32_t *)0xB0003810 //Transmit FIFO Status Register #define I2S_RFIFO_STAT (volatile uint32_t *)0xB0003814 //Receive FIFO Status Register #define I2S_TFIFO_CTRL (uint32_t *)0xB0003818 //Transmit FIFO Control Register #define I2S_RFIFO_CTRL (uint32_t *)0xB000381C //Receive FIFO Control Register #define I2S_DEV_CONF (uint32_t *)0xB0003820 //Device Configuration Register -#define I2S_DATA_REG (volatile uint32_t *)0xB0003850 //Data Register +#define I2S_DATA_REG (volatile int32_t *)0xB0003850 //Data Register #define I2S_MASK_INT (uint32_t *)0xB0800468 //Host Processor Interrupt Routing Mask 7 #define CLK_GATE_CTL (uint32_t *)0xB0800018 //CLK_GATE_CTL register @@ -86,7 +95,7 @@ struct i2s_ring_buffer { - volatile uint32_t data[I2S_BUFFER_SIZE]; + volatile int32_t data[I2S_BUFFER_SIZE]; volatile int head = 0; volatile int tail= 0; volatile bool lock = false; @@ -179,21 +188,21 @@ class Curie_I2S void end(); // Pushes a dword into the TX buffer - int pushData(uint32_t data); + int pushData(int32_t data); // Pushes a dword into the TX FIFO - void fastPushData(uint32_t data); + void fastPushData(int32_t data); void write(); // Pulls a dword directly from the RX FIFO - uint32_t pullData(); + int32_t pullData(); // Pulls a dword from the tail of the rx buffer - uint32_t read() {return requestdword(); }; + int32_t read() {return requestdword(); }; // Pulls a dword from the tail of the rx buffer - uint32_t requestdword(); + int32_t requestdword(); // Returns number of dword avaialable in the rx buffer uint16_t available(); diff --git a/libraries/CurieI2S/src/CurieI2SDMA.cpp b/libraries/CurieI2S/src/CurieI2SDMA.cpp deleted file mode 100644 index 3840ecde..00000000 --- a/libraries/CurieI2S/src/CurieI2SDMA.cpp +++ /dev/null @@ -1,316 +0,0 @@ -//*************************************************************** -// -// Copyright (c) 2016 Intel Corporation. All rights reserved. -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -//*************************************************************** - -//CurieI2SDMA.cpp - -#include "CurieI2SDMA.h" -#include "soc_i2s.h" -#include "soc_dma.h" -#include "variant.h" -#include - -static void txi2s_done(void* x); -static void rxi2s_done(void* x); -static void txi2s_err(void* x); -static void rxi2s_err(void* x); - -volatile uint8_t txdone_flag = 0; -volatile uint8_t txerror_flag = 0; - -volatile uint8_t rxdone_flag = 0; -volatile uint8_t rxerror_flag = 0; -uint8_t frameDelay = 0; - -static void txi2s_done(void* x) -{ - CurieI2SDMA.lastFrameDelay(); - txdone_flag = 1; - - return; -} - -static void rxi2s_done(void* x) -{ - rxdone_flag = 1; - - return; -} - -static void txi2s_err(void* x) -{ - txerror_flag = 1; - - return; -} - -static void rxi2s_err(void* x) -{ - rxerror_flag = 1; - - return; -} - -struct soc_i2s_cfg txcfg ; - -struct soc_i2s_cfg rxcfg ; - -Curie_I2SDMA CurieI2SDMA; - -Curie_I2SDMA::Curie_I2SDMA() -{ -} - -void Curie_I2SDMA::lastFrameDelay() -{ - delay(frameDelay); -} - -int Curie_I2SDMA::iniTX() -{ - muxTX(1); - soc_i2s_init(); - soc_dma_init(); - return I2S_DMA_OK; -} - -int Curie_I2SDMA::iniRX() -{ - muxRX(1); - soc_i2s_init(); - soc_dma_init(); - return I2S_DMA_OK; -} - -void Curie_I2SDMA::muxTX(bool enable) -{ - int mux_mode = GPIO_MUX_MODE; - if(enable) - { - mux_mode = I2S_MUX_MODE; - } - - /* Set SoC pin mux configuration */ - SET_PIN_MODE(g_APinDescription[I2S_TXD].ulSocPin, mux_mode); - SET_PIN_MODE(g_APinDescription[I2S_TWS].ulSocPin, mux_mode); - SET_PIN_MODE(g_APinDescription[I2S_TSCK].ulSocPin, mux_mode); -} - -void Curie_I2SDMA::muxRX(bool enable) -{ - int mux_mode = GPIO_MUX_MODE; - if(enable) - { - mux_mode = I2S_MUX_MODE; - } - - /* Set SoC pin mux configuration */ - SET_PIN_MODE(49, mux_mode); //I2S_RXD - SET_PIN_MODE(51, mux_mode); //I2S_RWS - SET_PIN_MODE(50, mux_mode); //I2S_RSCK -} - -int Curie_I2SDMA::beginTX(uint16_t sample_rate,uint8_t resolution,uint8_t master,uint8_t mode) -{ - switch(mode) - { - case 1: - mode = I2S_MODE_PHILLIPS ; - break; - case 2: - mode = I2S_MODE_RJ; - break; - case 3: - mode = I2S_MODE_LJ; - break; - case 4: - mode = I2S_MODE_DSP; - break; - default: - break; - } - - txcfg.sample_rate = sample_rate; - txcfg.resolution = resolution; - txcfg.mode = mode; - txcfg.master = master; - txcfg.cb_done = txi2s_done; - txcfg.cb_err = txi2s_err; - txdone_flag = 0; - txerror_flag = 0; - frameDelay = 5; - soc_i2s_config(I2S_CHANNEL_TX, &txcfg); - return I2S_DMA_OK; -} - -int Curie_I2SDMA::beginRX(uint16_t sample_rate,uint8_t resolution,uint8_t master,uint8_t mode) -{ - switch(mode) - { - case 1: - mode = I2S_MODE_PHILLIPS ; - break; - case 2: - mode = I2S_MODE_RJ; - break; - case 3: - mode = I2S_MODE_LJ; - break; - case 4: - mode = I2S_MODE_DSP; - break; - default: - break; - } - - rxcfg.sample_rate = sample_rate; - rxcfg.resolution = resolution; - rxcfg.mode = mode; - rxcfg.master = master; - - rxcfg.cb_done = rxi2s_done; - rxcfg.cb_err = rxi2s_err; - - rxdone_flag = 0; - rxerror_flag = 0; - - soc_i2s_config(I2S_CHANNEL_RX, &rxcfg); - - return I2S_DMA_OK; -} - -int Curie_I2SDMA::transTX(void* buf_TX,uint32_t len,uint32_t len_per_data) -{ - int status = soc_i2s_stream(buf_TX, len,len_per_data,0); - if(status) - return I2S_DMA_FAIL; - while (1) - { - // check the DMA and I2S status - if(txdone_flag && !txerror_flag) - { - txdone_flag = 0; - txerror_flag = 0; - return I2S_DMA_OK; - } - if(txerror_flag) - { - return I2S_DMA_FAIL; - } - } -} - -int Curie_I2SDMA::transRX(void* buf_RX,uint32_t len,uint32_t len_per_data) -{ - int status = soc_i2s_listen(buf_RX, len ,len_per_data,0); - if(status) - return I2S_DMA_FAIL; - - while (1) - { - // check the DMA and I2S status - if(rxdone_flag && !rxerror_flag) - { - rxdone_flag = 0; - rxerror_flag = 0; - return I2S_DMA_OK; - } - if(rxerror_flag) - { - return I2S_DMA_FAIL; - } - } - return I2S_DMA_OK; -} - -void Curie_I2SDMA::stopTX() -{ - soc_i2s_stop_stream(); - muxTX(0); -} - -void Curie_I2SDMA::stopRX() -{ - soc_i2s_stop_listen(); - muxRX(0); -} - -int Curie_I2SDMA::mergeData(void* buf_left,void* buf_right,void* buf_TX,uint32_t length_TX,uint32_t len_per_data) -{ - if(len_per_data == 1) - { - for(uint32_t i = 0; i < length_TX/2;++i) - { - *((uint8_t *)buf_TX+2*i) = *((uint8_t *)buf_left+i); - *((uint8_t *)buf_TX+2*i+1) = *((uint8_t *)buf_right+i); - } - } - else if(len_per_data == 2) - { - for(uint32_t i = 0; i < length_TX/2;++i) - { - *((uint16_t *)buf_TX+2*i) = *((uint16_t *)buf_left+i); - *((uint16_t *)buf_TX+2*i+1) = *((uint16_t *)buf_right+i); - } - } - else if(len_per_data == 4) - { - for(uint32_t i = 0; i < length_TX/2;++i) - { - *((uint32_t *)buf_TX+2*i) = *((uint32_t *)buf_left+i); - *((uint32_t *)buf_TX+2*i+1) = *((uint32_t *)buf_right+i); - } - } - else - return I2S_DMA_FAIL; - - return I2S_DMA_OK; -} - -int Curie_I2SDMA::separateData(void* buf_left,void* buf_right,void* buf_RX,uint32_t length_RX,uint32_t len_per_data) -{ - if(len_per_data == 1) - { - for(uint32_t i = 0; i < length_RX/2;++i) - { - *((uint8_t *)buf_left+i) = *((uint8_t *)buf_RX+2*i); - *((uint8_t *)buf_right+i) = *((uint8_t *)buf_RX+2*i+1); - } - } - else if(len_per_data == 2) - { - for(uint32_t i = 0; i < length_RX/2;++i) - { - *((uint16_t *)buf_left+i) = *((uint16_t *)buf_RX+2*i); - *((uint16_t *)buf_right+i) = *((uint16_t *)buf_RX+2*i+1); - } - } - else if(len_per_data == 4) - { - for(uint32_t i = 0; i < length_RX/2;++i) - { - *((uint32_t *)buf_left+i) = *((uint32_t *)buf_RX+2*i); - *((uint32_t *)buf_right+i) = *((uint32_t *)buf_RX+2*i+1); - } - } - else - return I2S_DMA_FAIL; - - return I2S_DMA_OK; -} diff --git a/libraries/CurieI2S/src/CurieI2SDMA.h b/libraries/CurieI2S/src/CurieI2SDMA.h deleted file mode 100644 index 271d6ac4..00000000 --- a/libraries/CurieI2S/src/CurieI2SDMA.h +++ /dev/null @@ -1,83 +0,0 @@ -//*************************************************************** -// -// Copyright (c) 2016 Intel Corporation. All rights reserved. -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -//*************************************************************** - -//CurieI2SDMA.h - -#ifndef _CURIEI2SDMA_H_ -#define _CURIEI2SDMA_H_ - -#include - -//I2S Arduino Pins -#define I2S_TXD 7 -#define I2S_TWS 4 -#define I2S_TSCK 2 -#define I2S_RXD 5 -#define I2S_RWS 3 -#define I2S_RSCK 8 - -#define I2S_DMA_OK 0 -#define I2S_DMA_FAIL 1 -class Curie_I2SDMA -{ - private: - // mux/demux the i2s rx pins into i2s mode - void muxRX(bool enable); - - // mux/demux the i2s tx pins into i2s mode - void muxTX(bool enable); - - public: - Curie_I2SDMA(); - - void lastFrameDelay(); - - // - int beginTX(uint16_t sample_rate,uint8_t resolution,uint8_t master,uint8_t mode); - // - int beginRX(uint16_t sample_rate,uint8_t resolution,uint8_t master,uint8_t mode); - - // initializes i2s interface - int iniTX(); - //void transTX(); - int iniRX(); - - // starts transmission of data to the tx channel - int transTX(void* buf_TX,uint32_t len,uint32_t len_per_data); - - // starts listening to the rx channel - int transRX(void* buf_RX,uint32_t len,uint32_t len_per_data); - - // merge data of left and right channel into one buffer - int mergeData(void* buf_left,void* buf_right,void* buf_TX,uint32_t length_TX,uint32_t len_per_data); - - // seperate the data to left and right channl - int separateData(void* buf_left,void* buf_right,void* buf_RX,uint32_t length_RX,uint32_t len_per_data); - - // - void stopTX(); - // - void stopRX(); - -}; - -extern Curie_I2SDMA CurieI2SDMA; - -#endif diff --git a/system/libarc32_arduino101/drivers/soc_dma.c b/system/libarc32_arduino101/drivers/soc_dma.c index f0b0120c..8bc94b51 100644 --- a/system/libarc32_arduino101/drivers/soc_dma.c +++ b/system/libarc32_arduino101/drivers/soc_dma.c @@ -114,7 +114,8 @@ struct soc_dma_info g_dma_info = { NULL }, .err_mask = INT_DMA_ERROR_MASK, - .err_vector = SOC_DMA_ERR_INTERRUPT + .err_vector = SOC_DMA_ERR_INTERRUPT, + .hw_configured = 0 }; static struct soc_dma_info* dma_info = &g_dma_info; @@ -543,6 +544,14 @@ DRIVER_API_RC soc_dma_config(struct soc_dma_channel *channel, struct soc_dma_cfg SETV(MMIO_REG_VAL_FROM_BASE(SOC_DMA_BASE, dma_regs[id].CFG_U), SOC_DMA_CFG_U_SRC_PER, SOC_DMA_CFG_U_SRC_PER_LEN, cfg->src_interface); + if ((cfg->src_interface == SOC_DMA_INTERFACE_I2S_RX) || + (cfg->dest_interface == SOC_DMA_INTERFACE_I2S_TX)) { + SETV(MMIO_REG_VAL_FROM_BASE(SOC_DMA_BASE, dma_regs[id].CFG_L), + SOC_DMA_CTL_L_SRC_MSIZE, SOC_DMA_CTL_L_SRC_MSIZE_LEN, 1); + SETV(MMIO_REG_VAL_FROM_BASE(SOC_DMA_BASE, dma_regs[id].CFG_L), + SOC_DMA_CTL_L_DEST_MSIZE, SOC_DMA_CTL_L_DEST_MSIZE_LEN, 1); + } + CLRB(MMIO_REG_VAL_FROM_BASE(SOC_DMA_BASE, dma_regs[id].CFG_U), SOC_DMA_CFG_U_SS_UPD_EN); CLRB(MMIO_REG_VAL_FROM_BASE(SOC_DMA_BASE, dma_regs[id].CFG_U), SOC_DMA_CFG_U_DS_UPD_EN); @@ -763,6 +772,9 @@ DRIVER_API_RC soc_dma_init() { struct soc_dma_channel ch; + if (dma_info->hw_configured) + return DRV_RC_OK; + dma_info->active = 0; // Enable global clock @@ -788,6 +800,7 @@ DRIVER_API_RC soc_dma_init() dma_info->channel[i] = NULL; } + dma_info->hw_configured = 1; return DRV_RC_OK; } diff --git a/system/libarc32_arduino101/drivers/soc_dma.h b/system/libarc32_arduino101/drivers/soc_dma.h index e81d071b..9d19a9fe 100644 --- a/system/libarc32_arduino101/drivers/soc_dma.h +++ b/system/libarc32_arduino101/drivers/soc_dma.h @@ -133,6 +133,7 @@ struct soc_dma_info { struct soc_dma_channel* channel[SOC_DMA_NUM_CHANNELS]; uint32_t active; + uint32_t hw_configured; }; diff --git a/system/libarc32_arduino101/drivers/soc_i2s.c b/system/libarc32_arduino101/drivers/soc_i2s.c index 114ce764..e3c202e0 100644 --- a/system/libarc32_arduino101/drivers/soc_i2s.c +++ b/system/libarc32_arduino101/drivers/soc_i2s.c @@ -46,14 +46,15 @@ struct soc_i2s_info g_i2s_info = { { .clk_gate_register = PERIPH_CLK_GATE_CTRL, .bits_mask = I2S_CLK_GATE_MASK, - } + }, + .hw_initialized = 0 }; struct soc_i2s_info* i2s_info = &g_i2s_info; /* Function Prototypes */ static void i2s_enable(uint8_t channel); -static void i2s_disable(uint8_t channel); +static void i2s_disable(uint8_t channel, int dmaResetOnly); static void i2s_isr(void); DRIVER_API_RC soc_i2s_config(uint8_t channel, struct soc_i2s_cfg *cfg); DRIVER_API_RC soc_i2s_deconfig(uint8_t channel); @@ -63,7 +64,7 @@ DRIVER_API_RC soc_i2s_stop_listen(void); DRIVER_API_RC soc_i2s_write(void *buf, uint32_t len, uint32_t len_per_data); DRIVER_API_RC soc_i2s_stream(void *buf, uint32_t len, uint32_t len_per_data, uint32_t num_bufs); DRIVER_API_RC soc_i2s_stop_stream(void); -DRIVER_API_RC soc_i2s_init(); +DRIVER_API_RC soc_i2s_init(uint8_t channel); /* Internal functions */ static void i2s_enable(uint8_t channel) @@ -90,7 +91,7 @@ static void i2s_enable(uint8_t channel) return; } -static void i2s_disable(uint8_t channel) +static void i2s_disable(uint8_t channel, int dmaResetOnly) { uint32_t reg; uint32_t num_active; @@ -103,6 +104,10 @@ static void i2s_disable(uint8_t channel) soc_dma_release(&(i2s_info->dma_ch[channel])); soc_dma_free_list(&(i2s_info->dma_cfg[channel])); } + + if (dmaResetOnly == 1) + return; + // Clear enabled flag for channel i2s_info->en[channel] = 0; @@ -115,7 +120,7 @@ static void i2s_disable(uint8_t channel) num_active++; } } - + // Disable channel and hold parts in reset reg = MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, i2s_reg_map[channel].ctrl); reg &= ~(1 << (i2s_reg_map[channel].ctrl_fifo_rst)); @@ -155,7 +160,7 @@ static void i2s_isr(void) i2s_info->cfg[I2S_CHANNEL_TX].cb_err_arg=(void *)stat; i2s_info->cfg[I2S_CHANNEL_TX].cb_err(i2s_info->cfg[I2S_CHANNEL_TX].cb_err_arg); } - i2s_disable(I2S_CHANNEL_TX); + i2s_disable(I2S_CHANNEL_TX, 1); } if (stat & (1 << SOC_I2S_STAT_RDATA_OVRERR)) { @@ -164,7 +169,7 @@ static void i2s_isr(void) i2s_info->cfg[I2S_CHANNEL_RX].cb_err_arg=(void *)stat; i2s_info->cfg[I2S_CHANNEL_RX].cb_err(i2s_info->cfg[I2S_CHANNEL_RX].cb_err_arg); } - i2s_disable(I2S_CHANNEL_RX); + i2s_disable(I2S_CHANNEL_RX, 1); } return; @@ -184,7 +189,7 @@ static void i2s_dma_cb_err(void *num) { i2s_info->cfg[channel].cb_err(i2s_info->cfg[channel].cb_err_arg); } - i2s_disable(channel); + i2s_disable(channel, 1); return; } @@ -207,7 +212,7 @@ static void i2s_dma_cb_done(void *num) i2s_info->cfg[channel].cb_done(i2s_info->cfg[channel].cb_done_arg); } - i2s_disable(channel); + i2s_disable(channel, 1); return; } @@ -228,7 +233,7 @@ static void i2s_dma_cb_block(void *num) DRIVER_API_RC soc_i2s_config(uint8_t channel, struct soc_i2s_cfg *cfg) { uint32_t reg; - uint16_t sample_rate; + // uint16_t sample_rate; // Check channel no in use if (channel >= I2S_NUM_CHANNELS) @@ -247,12 +252,12 @@ DRIVER_API_RC soc_i2s_config(uint8_t channel, struct soc_i2s_cfg *cfg) MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, i2s_reg_map[channel].ctrl) = reg; // Calculate sample_rate divider (note, acts as if resolution is always 32) - sample_rate = i2s_info->clk_speed / (cfg->sample_rate * cfg->resolution * 2); + // sample_rate = i2s_info->clk_speed / (cfg->sample_rate * cfg->resolution * 2); // Setup resolution and sampling rate reg = MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, i2s_reg_map[channel].srr); reg &= ~(i2s_reg_map[channel].srr_mask); - reg |= (sample_rate & 0x7FF) << i2s_reg_map[channel].srr_sample_rate; + reg |= (cfg->clk_divider & 0x7FF) << i2s_reg_map[channel].srr_sample_rate; reg |= ((cfg->resolution - 1) & 0x1F) << i2s_reg_map[channel].srr_resolution; MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, i2s_reg_map[channel].srr) = reg; @@ -426,7 +431,7 @@ DRIVER_API_RC soc_i2s_listen(void *buf, uint32_t len, uint32_t len_per_data, uin return DRV_RC_OK; fail: - i2s_disable(channel); + i2s_disable(channel, 0); soc_dma_release(&(i2s_info->dma_ch[channel])); return DRV_RC_FAIL; } @@ -446,7 +451,7 @@ DRIVER_API_RC soc_i2s_stop_listen(void) } save = interrupt_lock(); - i2s_disable(channel); + i2s_disable(channel, 0); interrupt_unlock(save); return DRV_RC_OK; @@ -472,11 +477,12 @@ DRIVER_API_RC soc_i2s_stream(void *buf, uint32_t len, uint32_t len_per_data, uin { return DRV_RC_FAIL; } +#ifdef NOT else if (i2s_info->en[channel] || !(i2s_info->cfgd[channel])) { return DRV_RC_FAIL; } - +#endif // Get a DMA channel ret = soc_dma_acquire(&(i2s_info->dma_ch[channel])); @@ -486,7 +492,8 @@ DRIVER_API_RC soc_i2s_stream(void *buf, uint32_t len, uint32_t len_per_data, uin } // Enable the channel - i2s_enable(channel); + if (!(i2s_info->en[channel])) + i2s_enable(channel); // Determine the length of a single buffer if (num_bufs == 0) @@ -591,7 +598,7 @@ DRIVER_API_RC soc_i2s_stream(void *buf, uint32_t len, uint32_t len_per_data, uin return DRV_RC_OK; fail: - i2s_disable(channel); + i2s_disable(channel, 0); soc_dma_release(&(i2s_info->dma_ch[channel])); return DRV_RC_FAIL; } @@ -612,59 +619,57 @@ DRIVER_API_RC soc_i2s_stop_stream(void) } save = interrupt_lock(); - i2s_disable(channel); + i2s_disable(channel, 0); interrupt_unlock(save); return DRV_RC_OK; } /* Driver API */ -DRIVER_API_RC soc_i2s_init() +DRIVER_API_RC soc_i2s_init(uint8_t channel) { - int i; - uint32_t reg; + uint32_t reg; - // Prep info struct - for (i = 0; i < I2S_NUM_CHANNELS; i++) - { - i2s_info->en[i] = 0; - i2s_info->cfgd[i] = 0; - i2s_info->cfg[i].cb_done = NULL; - i2s_info->cfg[i].cb_err = NULL; - } + // Prep the channel info struct + i2s_info->en[channel] = 0; + i2s_info->cfgd[channel] = 0; + i2s_info->cfg[channel].cb_done = NULL; + i2s_info->cfg[channel].cb_err = NULL; - // Enable global clock, use local clock gating per channel instead - set_clock_gate(i2s_info->clk_gate_info, CLK_GATE_ON); + if (i2s_info->hw_initialized == 0) + { + // Enable global clock, use local clock gating per channel instead + set_clock_gate(i2s_info->clk_gate_info, CLK_GATE_ON); - // Setup ISR (and enable) - SET_INTERRUPT_HANDLER(i2s_info->int_vector, i2s_interrupt_handler); - SOC_UNMASK_INTERRUPTS(i2s_info->int_mask); + // Setup ISR (and enable) + SET_INTERRUPT_HANDLER(i2s_info->int_vector, i2s_interrupt_handler); + SOC_UNMASK_INTERRUPTS(i2s_info->int_mask); - // Set up control register - reg = MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, SOC_I2S_CTRL); - reg |= (1 << SOC_I2S_CTRL_TR_CFG_0); - reg &= ~(1 << SOC_I2S_CTRL_TSYNC_LOOP_BACK); - reg &= ~(1 << SOC_I2S_CTRL_RSYNC_LOOP_BACK); - MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, SOC_I2S_CTRL) = reg; + // Set up control register + reg = MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, SOC_I2S_CTRL); + reg |= (1 << SOC_I2S_CTRL_TR_CFG_0); + reg &= ~(1 << SOC_I2S_CTRL_TSYNC_LOOP_BACK); + reg &= ~(1 << SOC_I2S_CTRL_RSYNC_LOOP_BACK); + MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, SOC_I2S_CTRL) = reg; - // Set the watermark levels - MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, SOC_I2S_TFIFO_CTRL) &= 0xFFFCFFFF; - MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, SOC_I2S_TFIFO_CTRL) |= (I2S_TFIFO_THR << SOC_I2S_TFIFO_CTRL_TAFULL_THRS); + // Set the watermark levels + MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, SOC_I2S_TFIFO_CTRL) &= 0xFFFCFFFF; + MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, SOC_I2S_TFIFO_CTRL) |= (I2S_TFIFO_THR << SOC_I2S_TFIFO_CTRL_TAFULL_THRS); - MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, SOC_I2S_RFIFO_CTRL) &= 0xFFFCFFFF; - MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, SOC_I2S_RFIFO_CTRL) |= (I2S_RFIFO_THR << SOC_I2S_RFIFO_CTRL_RAFULL_THRS); + MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, SOC_I2S_RFIFO_CTRL) &= 0xFFFCFFFF; + MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, SOC_I2S_RFIFO_CTRL) |= (I2S_RFIFO_THR << SOC_I2S_RFIFO_CTRL_RAFULL_THRS); - // Enable global interrupt mask - reg = MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, SOC_I2S_CID_CTRL); - reg |= (1 << SOC_I2S_CID_CTRL_INTREQ_MASK); - MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, SOC_I2S_CID_CTRL) = reg; + // Enable global interrupt mask + reg = MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, SOC_I2S_CID_CTRL); + reg |= (1 << SOC_I2S_CID_CTRL_INTREQ_MASK); + MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, SOC_I2S_CID_CTRL) = reg; - // Initially, have all channels disabled - for (i = 0; i < I2S_NUM_CHANNELS; i++) - { - i2s_disable(i); - } + i2s_info->hw_initialized = 1; + } - return DRV_RC_OK; + // Initially, have all channels disabled + i2s_disable(channel, 0); + + return DRV_RC_OK; } diff --git a/system/libarc32_arduino101/drivers/soc_i2s.h b/system/libarc32_arduino101/drivers/soc_i2s.h index 61692103..b1bfe738 100644 --- a/system/libarc32_arduino101/drivers/soc_i2s.h +++ b/system/libarc32_arduino101/drivers/soc_i2s.h @@ -52,28 +52,13 @@ extern "C" { */ // I2S channels -#define I2S_CHANNEL_TX 0 -#define I2S_CHANNEL_RX 1 +#define I2S_CHANNEL_TX 0 // This is also the DMA channel +#define I2S_CHANNEL_RX 1 // This is also the DMA channel #define I2S_NUM_CHANNELS 2 -// I2S modes -#define I2S_MODE_SCK_POL (0x01) -#define I2S_MODE_WS_POL (0x02) -#define I2S_MODE_LR_ALIGN (0x08) -#define I2S_MODE_SAMPLE_DEL (0x10) -#define I2S_MODE_WS_DSP (0x20) - -#define I2S_MODE_PHILLIPS (I2S_MODE_SCK_POL | I2S_MODE_LR_ALIGN) -#define I2S_MODE_RJ (I2S_MODE_SCK_POL | I2S_MODE_WS_POL | \ - I2S_MODE_SAMPLE_DEL) -#define I2S_MODE_LJ (I2S_MODE_SCK_POL | I2S_MODE_WS_POL | \ - I2S_MODE_LR_ALIGN | I2S_MODE_SAMPLE_DEL) -#define I2S_MODE_DSP (I2S_MODE_SCK_POL | I2S_MODE_LR_ALIGN | \ - I2S_MODE_WS_DSP) - // I2S configuration object struct soc_i2s_cfg { - uint16_t sample_rate; // in Hz + uint16_t clk_divider; // 32 MHz /(sample x 2 x rate) uint8_t resolution; uint8_t mode; uint8_t master; @@ -101,6 +86,8 @@ struct soc_i2s_info { struct soc_dma_channel dma_ch[I2S_NUM_CHANNELS]; struct clk_gate_info_s *clk_gate_info; + + uint32_t hw_initialized; }; extern struct driver soc_i2s_driver; @@ -203,7 +190,7 @@ DRIVER_API_RC soc_i2s_listen(void *buf, uint32_t len, uint32_t len_per_data, ui */ DRIVER_API_RC soc_i2s_stop_listen(void); -DRIVER_API_RC soc_i2s_init(); +DRIVER_API_RC soc_i2s_init(uint8_t channel); /** @} */ diff --git a/variants/arduino_101/libarc32drv_arduino101.a b/variants/arduino_101/libarc32drv_arduino101.a index e0cb6b8ebca696bb969e406b16df05c24693f4f2..06071cac4343eaa5729f00f883d6868b77938864 100644 GIT binary patch delta 105353 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�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 B+uQ&E delta 103819 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 z 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%0AU7D_P$Cw3%rojPg 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 Date: Wed, 26 Oct 2016 16:11:30 -0700 Subject: [PATCH 2/4] Continous DMA I2S output implementation. To prevent the I2S SCK clock from glitching during DMA block transfer, the DMA is set up to send out data from two buffers continuously without stopping until it is told to do so. --- .../tone_generator/tone_generator.ino | 114 +------- libraries/CurieAudio/src/I2SController.h | 3 +- libraries/CurieAudio/src/I2SOutput.cpp | 130 +++++++-- libraries/CurieAudio/src/I2SOutput.h | 21 +- system/libarc32_arduino101/drivers/soc_dma.c | 34 +++ system/libarc32_arduino101/drivers/soc_dma.h | 20 +- system/libarc32_arduino101/drivers/soc_i2s.c | 274 +++++++----------- system/libarc32_arduino101/drivers/soc_i2s.h | 6 +- 8 files changed, 290 insertions(+), 312 deletions(-) diff --git a/libraries/CurieAudio/examples/tone_generator/tone_generator.ino b/libraries/CurieAudio/examples/tone_generator/tone_generator.ino index 526659e8..c0d423b1 100755 --- a/libraries/CurieAudio/examples/tone_generator/tone_generator.ino +++ b/libraries/CurieAudio/examples/tone_generator/tone_generator.ino @@ -64,27 +64,6 @@ int32_t sawtooth[WAV_SIZE] = {0}; int32_t triangle[WAV_SIZE] = {0}; int32_t square[WAV_SIZE] = {0}; -#ifdef ARDUINO_ARCH_ARC32 - -// Create ping pong buffers for streaming audio data out via DMA in foreground while -// Background fills up the buffers. - -#define NUMBER_OF_SAMPLES 256 - -struct pingpongstruct { - int32_t buf[NUMBER_OF_SAMPLES]; // Left and right samples - uint16_t empty; -} ppBuffer[2]; - -uint16_t i2sRunning = 0; -uint16_t needKickoff = 0; -int16_t sendIndex = 0; -int16_t fillIndex = 0; - -uint32_t sendErrorCount = 0; -uint32_t bufCount; -#endif - #ifndef ARDUINO_ARCH_ARC32 /*********************** // Create I2S audio transmitter object. @@ -137,96 +116,11 @@ void generateSquare(uint16_t amplitude, int32_t* buffer, uint16_t length) { } } -#ifdef ARDUINO_ARCH_ARC32 - -void sendDoneCallback(uint16_t result) -{ - if (result) sendErrorCount++; - - ppBuffer[sendIndex].empty = 1; - i2sRunning = 0; - - sendIndex = (sendIndex + 1) & 0x01; - needKickoff = (ppBuffer[sendIndex].empty) ? 0 : 1; - - bufCount++; -} - -void kickOff() -{ - if (i2sRunning == 0) // Kick off a transmission only if I2S is not running - { - int16_t whichBuffer = -1; // Find a filled buffer - if (ppBuffer[sendIndex].empty == 0) { - whichBuffer = sendIndex; - } - else { - int16_t nextBuffer = (sendIndex + 1) & 0x01; - if (ppBuffer[nextBuffer].empty == 0) { - whichBuffer = nextBuffer; - } - } - - if (whichBuffer != -1) { // Found a non-emptied buffer, kick off sending - sendIndex = whichBuffer; - - if (I2SOutput.write(ppBuffer[sendIndex].buf, NUMBER_OF_SAMPLES * 4, - 4, 0) == SUCCESS) { - i2sRunning = 1; - } - else { // I2S failed to kick off, skip the buffer - ppBuffer[sendIndex].empty = 1; - Serial.print("I2SOutput write failed, skipped buffer: "); - Serial.println(sendIndex); - } - } - needKickoff = 0; - } -} - -void sendSample(int32_t left, int32_t right, uint16_t flush) -{ - static int bufIndex = 0; - - ppBuffer[fillIndex].buf[bufIndex++] = left; - ppBuffer[fillIndex].buf[bufIndex++] = right; - - if (flush) { - while (bufIndex < NUMBER_OF_SAMPLES) - ppBuffer[fillIndex].buf[bufIndex++] = 0; - } - - if (bufIndex < NUMBER_OF_SAMPLES) { - if (needKickoff) - kickOff(); - return; - } - - // Buffer is filled - ppBuffer[fillIndex].empty = 0; - int16_t nextBuffer = (fillIndex + 1) & 0x01; - - while (bufIndex >= NUMBER_OF_SAMPLES) { - kickOff(); - - if (ppBuffer[nextBuffer].empty == 1) { - fillIndex = nextBuffer; - bufIndex = 0; - } - } -} - -#endif - - void playWave(int32_t* buffer, uint16_t length, float frequency, float seconds) { #ifdef ARDUINO_ARCH_ARC32 - bufCount = 0; - sendErrorCount = 0; // push some silence to get things going - for (int i = 0; i < 64; i++) - sendSample(0, 0, 0); + I2SOutput.write(0, 0, 1); #endif // Play back the provided waveform buffer for the specified @@ -251,13 +145,13 @@ void playWave(int32_t* buffer, uint16_t length, float frequency, float seconds) // stereo sound. #ifdef ARDUINO_ARCH_ARC32 - sendSample(sample, sample, 0); + I2SOutput.write(sample, sample); #else i2s.write(sample); i2s.write(sample); #endif } - sendSample(0, 0, 1); + I2SOutput.write(0, 0, 1); Serial.print("Iterations: "); Serial.println(iterations); @@ -272,11 +166,9 @@ void setup() { #ifdef ARDUINO_ARCH_ARC32 - ppBuffer[0].empty = ppBuffer[1].empty = 1; // setup the I2S hardware in the specified mode, sample rate, bits per sample // and master/slave mode. I2SOutput.begin(SAMPLE_RATE, I2S_32bit, I2S_MODE_PHILLIPS); - I2SOutput.attachCallback(sendDoneCallback); #else // Initialize the I2S transmitter. diff --git a/libraries/CurieAudio/src/I2SController.h b/libraries/CurieAudio/src/I2SController.h index be2d9b74..4deb45ad 100644 --- a/libraries/CurieAudio/src/I2SController.h +++ b/libraries/CurieAudio/src/I2SController.h @@ -72,7 +72,8 @@ typedef enum { SUCCESS = 0, I2S_INIT_FAIL, // I2S controller initialization failure. I2S_WRITE_BUSY, // Previous operation not completed when I2S write is called. - I2S_WRITE_FAIL, // I2S controller write operation failure. + I2S_WRITE_DRIVER_FAIL, // I2S driver write operation failure. + I2S_WRITE_FAIL, // I2S controller failure, check Tx error count. I2S_READ_BUSY, // Previous operation not completed when I2S read is called. I2S_READ_FAIL, // I2S controller read operation failure. I2S_MISC_ERROR diff --git a/libraries/CurieAudio/src/I2SOutput.cpp b/libraries/CurieAudio/src/I2SOutput.cpp index ee122796..19cb4bbb 100644 --- a/libraries/CurieAudio/src/I2SOutput.cpp +++ b/libraries/CurieAudio/src/I2SOutput.cpp @@ -24,29 +24,55 @@ #include "variant.h" #include +const int numPpBuffer = 2; +const int NUMBER_OF_SAMPLES = 256; + +static struct pingpongstruct { + int32_t buf[NUMBER_OF_SAMPLES]; // Left and right samples + uint16_t empty; +} ppBuffer[numPpBuffer]; + +static int i2sRunning = 0; +static int sendIndex = 0; +static int fillIndex = 0; + I2SOutputClass I2SOutput; -void txi2s_done(void* x) +void i2sTxDoneCB(void *x) { I2SOutput.txdone_flag = 1; - if (I2SOutput.userCB) - I2SOutput.userCB(0); + i2sRunning = 0; +} + +void i2sPingPongTxCB(void *x) +{ + ppBuffer[sendIndex].empty = 1; + sendIndex = (sendIndex + 1) & 0x01; + + if (ppBuffer[sendIndex].empty) { + I2SOutput.txdone_flag = 1; + soc_i2s_stop_transmit(); + i2sRunning = 0; + } } -void txi2s_err(void* x) +void i2sTxErrorCB(void *x) { + I2SOutput.txErrorCount++; I2SOutput.txerror_flag = 1; - if (I2SOutput.userCB) - I2SOutput.userCB(1); + i2sRunning = 0; } + I2SOutputClass::I2SOutputClass() { txdone_flag = 1; - txerror_flag = 0; - userCB = NULL; - // frameDelay = 5; + txErrorCount = 0; + + for (int i=0; i= numPpBuffer) + j = 0; + } + + if (soc_i2s_transmit_loop(bufPtrArray, sizeof(ppBuffer[0].buf), sizeof(int32_t)) != DRV_RC_OK) { + return I2S_WRITE_DRIVER_FAIL; + } + i2sRunning = 1; + return SUCCESS; +} + + +i2sErrorCode I2SOutputClass::write(int32_t leftSample, int32_t rightSample, + uint16_t flush) +{ + static int bufIndex = 0; + int16_t nextBuffer; + i2sErrorCode result = SUCCESS; + + ppBuffer[fillIndex].buf[bufIndex++] = leftSample; + ppBuffer[fillIndex].buf[bufIndex++] = rightSample; + + if (flush) { + while (bufIndex < NUMBER_OF_SAMPLES) + ppBuffer[fillIndex].buf[bufIndex++] = 0; + } + + if (bufIndex >= NUMBER_OF_SAMPLES) { + // Buffer is filled + ppBuffer[fillIndex].empty = 0; + nextBuffer = (fillIndex + 1) & 0x01; + + while (bufIndex >= NUMBER_OF_SAMPLES) { + if (!i2sRunning) { + if ((result = kickOff()) != SUCCESS) + break; + } + + if (ppBuffer[nextBuffer].empty == 1) { + fillIndex = nextBuffer; + bufIndex = 0; + } + } + } + return result; +} + + +i2sErrorCode I2SOutputClass::write(int32_t buffer[], int bufferLength, + uint32_t blocking) { // int count = 0; if (txdone_flag == 0) return I2S_WRITE_BUSY; - txdone_flag = 0; - txerror_flag = 0; + txerror_flag = txdone_flag = 0; - if (soc_i2s_stream((void *)buffer, bufferLength, bytePerSample, 0) != DRV_RC_OK) - { + if (soc_i2s_write((void *)buffer, bufferLength, sizeof(int32_t)) != DRV_RC_OK) { txdone_flag = 1; - return I2S_WRITE_FAIL; + return I2S_WRITE_DRIVER_FAIL; } if (blocking == 0) return SUCCESS; while (1) // (count++ < 100000) Need to bail sometime { - if (txerror_flag == 1) break; + if (txerror_flag == 1) return I2S_WRITE_FAIL; if (txdone_flag == 1) return SUCCESS; } +} + - txerror_flag = 1; - return I2S_WRITE_FAIL; +int I2SOutputClass::txError(void) +{ + int tmp = txErrorCount; + txErrorCount = 0; + return tmp; } + diff --git a/libraries/CurieAudio/src/I2SOutput.h b/libraries/CurieAudio/src/I2SOutput.h index 1131ae1d..2a524e7b 100644 --- a/libraries/CurieAudio/src/I2SOutput.h +++ b/libraries/CurieAudio/src/I2SOutput.h @@ -24,8 +24,9 @@ class I2SOutputClass : public I2SController { - friend void txi2s_done(void* x); - friend void txi2s_err(void* x); + friend void i2sTxDoneCB(void *x); + friend void i2sPingPongTxCB(void *x); + friend void i2sTxErrorCB(void *x); public: I2SOutputClass(); @@ -36,19 +37,21 @@ class I2SOutputClass : public I2SController uint8_t master = 1); void end(); - i2sErrorCode write(int32_t buffer[], uint32_t bufferLength, - uint32_t bytePerSample, uint32_t blocking = 1); + i2sErrorCode write(int32_t leftSample, int32_t rightSample, + uint16_t flush = 0); - void attachCallback(void (*userCallBack)(uint16_t result)) - { - userCB = userCallBack; - }; + i2sErrorCode write(int32_t buffer[], int bufferLength, + uint32_t blocking = 1); + + inline uint8_t txDone(void) { return txdone_flag; } + + int txError(void); private: curieI2sSampleSize sampleSize; uint8_t txdone_flag; uint8_t txerror_flag; - void (*userCB)(uint16_t result); + int txErrorCount; }; extern I2SOutputClass I2SOutput; diff --git a/system/libarc32_arduino101/drivers/soc_dma.c b/system/libarc32_arduino101/drivers/soc_dma.c index 8bc94b51..178a175c 100644 --- a/system/libarc32_arduino101/drivers/soc_dma.c +++ b/system/libarc32_arduino101/drivers/soc_dma.c @@ -70,6 +70,7 @@ DRIVER_API_RC soc_dma_start_transfer(struct soc_dma_channel *channel); DRIVER_API_RC soc_dma_stop_transfer(struct soc_dma_channel *channel); DRIVER_API_RC soc_dma_alloc_list_item(struct soc_dma_xfer_item **ret, struct soc_dma_xfer_item *base); DRIVER_API_RC soc_dma_free_list(struct soc_dma_cfg *cfg); +DRIVER_API_RC dma_update_ll(struct soc_dma_channel *channel, struct soc_dma_cfg *cfg); DRIVER_API_RC dma_init(); DECLARE_INTERRUPT_HANDLER static void dma_ch0_interrupt_handler() @@ -281,6 +282,39 @@ static struct dma_lli *dma_find_ll_end(struct dma_lli *head) return t; } +DRIVER_API_RC dma_update_ll(struct soc_dma_channel *channel, struct soc_dma_cfg *cfg) +{ + struct dma_lli *lli; + struct soc_dma_xfer_item *xfer; + struct soc_dma_xfer_item *last_xfer; + uint8_t list_done; + + if (channel->ll == NULL) + { + return DRV_RC_FAIL; + } + + lli = (struct dma_lli *)(channel->ll); + xfer = &(cfg->xfer); + last_xfer = dma_find_list_end(xfer); + + list_done = 0; + + while (!list_done) + { + lli->sar = (uint32_t)(xfer->src.addr); + if ((xfer->next) == last_xfer) + list_done = 1; + else + { + xfer = xfer->next; + lli = (struct dma_lli *)lli->llp; + } + } + + return DRV_RC_OK; +} + static DRIVER_API_RC dma_create_ll(struct soc_dma_channel *channel, struct soc_dma_cfg *cfg) { OS_ERR_TYPE err; diff --git a/system/libarc32_arduino101/drivers/soc_dma.h b/system/libarc32_arduino101/drivers/soc_dma.h index 9d19a9fe..0f0acc06 100644 --- a/system/libarc32_arduino101/drivers/soc_dma.h +++ b/system/libarc32_arduino101/drivers/soc_dma.h @@ -230,8 +230,26 @@ DRIVER_API_RC soc_dma_alloc_list_item(struct soc_dma_xfer_item **ret, struct soc * - DRV_RC_OK on success */ DRIVER_API_RC soc_dma_free_list(struct soc_dma_cfg *cfg); - +/** + * Function to initialize the DMA: + * + * @param none + * + * @return + * - DRV_RC_OK on success + */ DRIVER_API_RC soc_dma_init(); +/** + * Function to update the source/distination adress for DMAtransfer + * + * @param channel : pointer to channel object + * + * @param cfg : pointer to configuration object + * + * @return + * - DRV_RC_OK on success + */ +DRIVER_API_RC dma_update_ll(struct soc_dma_channel *channel, struct soc_dma_cfg *cfg); #ifdef __cplusplus } diff --git a/system/libarc32_arduino101/drivers/soc_i2s.c b/system/libarc32_arduino101/drivers/soc_i2s.c index e3c202e0..58b52532 100644 --- a/system/libarc32_arduino101/drivers/soc_i2s.c +++ b/system/libarc32_arduino101/drivers/soc_i2s.c @@ -54,16 +54,16 @@ struct soc_i2s_info* i2s_info = &g_i2s_info; /* Function Prototypes */ static void i2s_enable(uint8_t channel); -static void i2s_disable(uint8_t channel, int dmaResetOnly); +static void i2s_disable(uint8_t channel); static void i2s_isr(void); DRIVER_API_RC soc_i2s_config(uint8_t channel, struct soc_i2s_cfg *cfg); DRIVER_API_RC soc_i2s_deconfig(uint8_t channel); DRIVER_API_RC soc_i2s_read(void *buf, uint32_t len, uint32_t len_per_data); DRIVER_API_RC soc_i2s_listen(void *buf, uint32_t len, uint32_t len_per_data, uint8_t num_bufs); DRIVER_API_RC soc_i2s_stop_listen(void); -DRIVER_API_RC soc_i2s_write(void *buf, uint32_t len, uint32_t len_per_data); -DRIVER_API_RC soc_i2s_stream(void *buf, uint32_t len, uint32_t len_per_data, uint32_t num_bufs); -DRIVER_API_RC soc_i2s_stop_stream(void); +DRIVER_API_RC soc_i2s_write(void *buf, int bufSize, int dataSize); +DRIVER_API_RC soc_i2s_transmit_loop(void *bufPtrArray[], int bufSize, int dataSize); +DRIVER_API_RC soc_i2s_stop_transmit(void); DRIVER_API_RC soc_i2s_init(uint8_t channel); /* Internal functions */ @@ -91,7 +91,7 @@ static void i2s_enable(uint8_t channel) return; } -static void i2s_disable(uint8_t channel, int dmaResetOnly) +static void i2s_disable(uint8_t channel) { uint32_t reg; uint32_t num_active; @@ -104,10 +104,6 @@ static void i2s_disable(uint8_t channel, int dmaResetOnly) soc_dma_release(&(i2s_info->dma_ch[channel])); soc_dma_free_list(&(i2s_info->dma_cfg[channel])); } - - if (dmaResetOnly == 1) - return; - // Clear enabled flag for channel i2s_info->en[channel] = 0; @@ -160,7 +156,7 @@ static void i2s_isr(void) i2s_info->cfg[I2S_CHANNEL_TX].cb_err_arg=(void *)stat; i2s_info->cfg[I2S_CHANNEL_TX].cb_err(i2s_info->cfg[I2S_CHANNEL_TX].cb_err_arg); } - i2s_disable(I2S_CHANNEL_TX, 1); + i2s_disable(I2S_CHANNEL_TX); } if (stat & (1 << SOC_I2S_STAT_RDATA_OVRERR)) { @@ -169,7 +165,7 @@ static void i2s_isr(void) i2s_info->cfg[I2S_CHANNEL_RX].cb_err_arg=(void *)stat; i2s_info->cfg[I2S_CHANNEL_RX].cb_err(i2s_info->cfg[I2S_CHANNEL_RX].cb_err_arg); } - i2s_disable(I2S_CHANNEL_RX, 1); + i2s_disable(I2S_CHANNEL_RX); } return; @@ -189,7 +185,7 @@ static void i2s_dma_cb_err(void *num) { i2s_info->cfg[channel].cb_err(i2s_info->cfg[channel].cb_err_arg); } - i2s_disable(channel, 1); + i2s_disable(channel); return; } @@ -197,22 +193,13 @@ static void i2s_dma_cb_err(void *num) static void i2s_dma_cb_done(void *num) { uint8_t channel = (uint32_t)num; - uint32_t reg; - - if(channel == I2S_CHANNEL_TX) - { - do - { - reg = MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, i2s_reg_map[channel].fifo_stat); - } while(reg & 0x000000FF); - } - + if (i2s_info->cfg[channel].cb_done) { i2s_info->cfg[channel].cb_done(i2s_info->cfg[channel].cb_done_arg); } - i2s_disable(channel, 1); + i2s_disable(channel); return; } @@ -431,7 +418,7 @@ DRIVER_API_RC soc_i2s_listen(void *buf, uint32_t len, uint32_t len_per_data, uin return DRV_RC_OK; fail: - i2s_disable(channel, 0); + i2s_disable(channel); soc_dma_release(&(i2s_info->dma_ch[channel])); return DRV_RC_FAIL; } @@ -451,178 +438,135 @@ DRIVER_API_RC soc_i2s_stop_listen(void) } save = interrupt_lock(); - i2s_disable(channel, 0); + i2s_disable(channel); interrupt_unlock(save); return DRV_RC_OK; } -DRIVER_API_RC soc_i2s_write(void *buf, uint32_t len, uint32_t len_per_data) +DRIVER_API_RC soc_i2s_write(void *buf, int bufSize, int dataSize) { - // Calling stream with 0 buffers is the same as a onetime write of the whole buffer - return soc_i2s_stream(buf, len, len_per_data, 0); + void *bufArray[1]; + + // Calling stream with 0 buffers is the same as a onetime write of the whole buffer + bufArray[0] = buf; + return soc_i2s_transmit_loop(bufArray, bufSize, dataSize); } -DRIVER_API_RC soc_i2s_stream(void *buf, uint32_t len, uint32_t len_per_data, uint32_t num_bufs) +DRIVER_API_RC soc_i2s_transmit_loop(void *bufPtrArray[], int bufSize, int dataSize) { - DRIVER_API_RC ret; - uint8_t channel = I2S_CHANNEL_TX; - uint32_t reg; - uint32_t len_per_buf; - int i; - struct soc_dma_xfer_item *dma_list; + uint32_t reg; + int i, length; + struct soc_dma_xfer_item *dma_list; + int numBuf = sizeof(bufPtrArray) / sizeof(void *); - // Check channel no in use and configured - if (channel >= I2S_NUM_CHANNELS) - { - return DRV_RC_FAIL; - } -#ifdef NOT - else if (i2s_info->en[channel] || !(i2s_info->cfgd[channel])) - { - return DRV_RC_FAIL; - } -#endif - // Get a DMA channel - ret = soc_dma_acquire(&(i2s_info->dma_ch[channel])); - if (ret != DRV_RC_OK) - { - return DRV_RC_FAIL; - } + if ((numBuf == 0) || (bufSize < dataSize)) + return DRV_RC_FAIL; - // Enable the channel - if (!(i2s_info->en[channel])) - i2s_enable(channel); + // Check channel no in use and configured + if (i2s_info->en[I2S_CHANNEL_TX] || !(i2s_info->cfgd[I2S_CHANNEL_TX])) + return DRV_RC_FAIL; - // Determine the length of a single buffer - if (num_bufs == 0) - { - len_per_buf = len; - } - else - { - len_per_buf = len / num_bufs; - } - - // Prep some configuration - i2s_info->dma_cfg[channel].type = SOC_DMA_TYPE_MEM2PER; - i2s_info->dma_cfg[channel].dest_interface = SOC_DMA_INTERFACE_I2S_TX; - i2s_info->dma_cfg[channel].dest_step_count = 0; - i2s_info->dma_cfg[channel].src_step_count = 0; - - i2s_info->dma_cfg[channel].xfer.dest.delta = SOC_DMA_DELTA_NONE; - i2s_info->dma_cfg[channel].xfer.dest.addr = (void *)(SOC_I2S_BASE + SOC_I2S_DATA_REG); - i2s_info->dma_cfg[channel].xfer.src.delta = SOC_DMA_DELTA_INCR; + // Get a DMA channel + if (soc_dma_acquire(&(i2s_info->dma_ch[I2S_CHANNEL_TX])) != DRV_RC_OK) + return DRV_RC_FAIL; - if(len_per_data == 1) - { - i2s_info->dma_cfg[channel].xfer.dest.width = SOC_DMA_WIDTH_8; - i2s_info->dma_cfg[channel].xfer.src.width = SOC_DMA_WIDTH_8; - } - else if(len_per_data == 2) - { - i2s_info->dma_cfg[channel].xfer.dest.width = SOC_DMA_WIDTH_16; - i2s_info->dma_cfg[channel].xfer.src.width = SOC_DMA_WIDTH_16; - } - else if(len_per_data == 4) - { - i2s_info->dma_cfg[channel].xfer.dest.width = SOC_DMA_WIDTH_32; - i2s_info->dma_cfg[channel].xfer.src.width = SOC_DMA_WIDTH_32; - } - else - return DRV_RC_FAIL;; + // Enable the channel + i2s_enable(I2S_CHANNEL_TX); - if (num_bufs == 0) - { - i2s_info->dma_cfg[channel].cb_done = i2s_dma_cb_done; - i2s_info->dma_cfg[channel].cb_done_arg = (void *)((uint32_t)channel); - } - else - { - i2s_info->dma_cfg[channel].cb_block = i2s_dma_cb_block; - i2s_info->dma_cfg[channel].cb_block_arg = (void *)((uint32_t)channel); - } + // Prep some configuration + i2s_info->dma_cfg[I2S_CHANNEL_TX].type = SOC_DMA_TYPE_MEM2PER; + i2s_info->dma_cfg[I2S_CHANNEL_TX].dest_interface = SOC_DMA_INTERFACE_I2S_TX; + i2s_info->dma_cfg[I2S_CHANNEL_TX].dest_step_count = 0; + i2s_info->dma_cfg[I2S_CHANNEL_TX].src_step_count = 0; - i2s_info->dma_cfg[channel].cb_err = i2s_dma_cb_err; - i2s_info->dma_cfg[channel].cb_err_arg = (void *)((uint32_t)channel); + i2s_info->dma_cfg[I2S_CHANNEL_TX].xfer.dest.delta = SOC_DMA_DELTA_NONE; + i2s_info->dma_cfg[I2S_CHANNEL_TX].xfer.dest.addr = (void *)(SOC_I2S_BASE + SOC_I2S_DATA_REG); + i2s_info->dma_cfg[I2S_CHANNEL_TX].xfer.src.delta = SOC_DMA_DELTA_INCR; - // Setup the linked list - for (i = 0; i < ((num_bufs == 0) ? 1 : num_bufs); i++) - { - if (i == 0) - { - dma_list = &(i2s_info->dma_cfg[channel].xfer); - } - else - { - ret = soc_dma_alloc_list_item(&dma_list, dma_list); + switch (dataSize) + { + case 1: + i2s_info->dma_cfg[I2S_CHANNEL_TX].xfer.dest.width = SOC_DMA_WIDTH_8; + i2s_info->dma_cfg[I2S_CHANNEL_TX].xfer.src.width = SOC_DMA_WIDTH_8; + break; + + case 2: + i2s_info->dma_cfg[I2S_CHANNEL_TX].xfer.dest.width = SOC_DMA_WIDTH_16; + i2s_info->dma_cfg[I2S_CHANNEL_TX].xfer.src.width = SOC_DMA_WIDTH_16; + break; + + default: + dataSize = 4; // default is 32 bit. + i2s_info->dma_cfg[I2S_CHANNEL_TX].xfer.dest.width = SOC_DMA_WIDTH_32; + i2s_info->dma_cfg[I2S_CHANNEL_TX].xfer.src.width = SOC_DMA_WIDTH_32; + break; + } - if (ret != DRV_RC_OK) - { - goto fail; - } - } + if (numBuf == 1) { + i2s_info->dma_cfg[I2S_CHANNEL_TX].cb_done = i2s_dma_cb_done; + i2s_info->dma_cfg[I2S_CHANNEL_TX].cb_done_arg = (void *)(I2S_CHANNEL_TX); + } + else { + i2s_info->dma_cfg[I2S_CHANNEL_TX].cb_block = i2s_dma_cb_block; + i2s_info->dma_cfg[I2S_CHANNEL_TX].cb_block_arg = (void *)(I2S_CHANNEL_TX); + } - dma_list->src.addr = (void *)(uint8_t *)(buf+i * len_per_buf ); - dma_list->size = len_per_buf / len_per_data; - } + i2s_info->dma_cfg[I2S_CHANNEL_TX].cb_err = i2s_dma_cb_err; + i2s_info->dma_cfg[I2S_CHANNEL_TX].cb_err_arg = (void *)(I2S_CHANNEL_TX); + + // Setup the linked list + for (i=0, length=(bufSize / dataSize); i < numBuf; i++) { + if (i == 0) + dma_list = &(i2s_info->dma_cfg[I2S_CHANNEL_TX].xfer); + else { + if (soc_dma_alloc_list_item(&dma_list, dma_list) != DRV_RC_OK) + goto fail; + } + dma_list->src.addr = bufPtrArray[i]; + dma_list->size = length; + } - // Create a circular list if we are doing circular buffering - if (num_bufs != 0) - { - dma_list->next = &(i2s_info->dma_cfg[channel].xfer); - } + // Create a circular list if we are doing circular buffering + if (numBuf > 1) + dma_list->next = &(i2s_info->dma_cfg[I2S_CHANNEL_TX].xfer); - // Setup and start the DMA engine - ret = soc_dma_config(&(i2s_info->dma_ch[channel]), &(i2s_info->dma_cfg[channel])); + // Setup and start the DMA engine + if (soc_dma_config(&(i2s_info->dma_ch[I2S_CHANNEL_TX]), &(i2s_info->dma_cfg[I2S_CHANNEL_TX])) != + DRV_RC_OK) + goto fail; - if (ret != DRV_RC_OK) - { - goto fail; - } + if (soc_dma_start_transfer(&(i2s_info->dma_ch[I2S_CHANNEL_TX])) != DRV_RC_OK) + goto fail; - ret = soc_dma_start_transfer(&(i2s_info->dma_ch[channel])); + // Enable the channel and let it go! + reg = MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, i2s_reg_map[I2S_CHANNEL_TX].ctrl); + reg |= (1 << (i2s_reg_map[I2S_CHANNEL_TX].ctrl_en)); + reg |= (1 << (i2s_reg_map[I2S_CHANNEL_TX].ctrl_sync_rst)); + MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, i2s_reg_map[I2S_CHANNEL_TX].ctrl) = reg; - if (ret != DRV_RC_OK) - { - goto fail; - } - - // Enable the channel and let it go! - reg = MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, i2s_reg_map[channel].ctrl); - reg |= (1 << (i2s_reg_map[channel].ctrl_en)); - reg |= (1 << (i2s_reg_map[channel].ctrl_sync_rst)); - MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, i2s_reg_map[channel].ctrl) = reg; - - return DRV_RC_OK; + return DRV_RC_OK; fail: - i2s_disable(channel, 0); - soc_dma_release(&(i2s_info->dma_ch[channel])); - return DRV_RC_FAIL; + i2s_disable(I2S_CHANNEL_TX); + soc_dma_release(&(i2s_info->dma_ch[I2S_CHANNEL_TX])); + return DRV_RC_FAIL; } -DRIVER_API_RC soc_i2s_stop_stream(void) +DRIVER_API_RC soc_i2s_stop_transmit(void) { - uint8_t channel = I2S_CHANNEL_TX; - uint32_t save; - - if (channel >= I2S_NUM_CHANNELS) - { - return DRV_RC_FAIL; - } - else if (!(i2s_info->en[channel])) - { - return DRV_RC_FAIL; - } + uint32_t save; - save = interrupt_lock(); - i2s_disable(channel, 0); - interrupt_unlock(save); + if (!(i2s_info->en[I2S_CHANNEL_TX])) + return DRV_RC_FAIL; - return DRV_RC_OK; + save = interrupt_lock(); + i2s_disable(I2S_CHANNEL_TX); + interrupt_unlock(save); + + return DRV_RC_OK; } /* Driver API */ @@ -668,7 +612,7 @@ DRIVER_API_RC soc_i2s_init(uint8_t channel) } // Initially, have all channels disabled - i2s_disable(channel, 0); + i2s_disable(channel); return DRV_RC_OK; } diff --git a/system/libarc32_arduino101/drivers/soc_i2s.h b/system/libarc32_arduino101/drivers/soc_i2s.h index b1bfe738..60b0c0bd 100644 --- a/system/libarc32_arduino101/drivers/soc_i2s.h +++ b/system/libarc32_arduino101/drivers/soc_i2s.h @@ -130,7 +130,7 @@ DRIVER_API_RC soc_i2s_deconfig(uint8_t channel); * - DRV_RC_OK on success * - DRV_RC_FAIL otherwise */ -DRIVER_API_RC soc_i2s_write(void *buf, uint32_t len, uint32_t len_per_data); +DRIVER_API_RC soc_i2s_write(void *buf, int bufSize, int dataSize); /** * Function to continuously transmit blocks of audio data @@ -144,7 +144,7 @@ DRIVER_API_RC soc_i2s_write(void *buf, uint32_t len, uint32_t len_per_data); * - DRV_RC_OK on success * - DRV_RC_FAIL otherwise */ -DRIVER_API_RC soc_i2s_stream(void *buf, uint32_t len, uint32_t len_per_data, uint32_t num_bufs); +DRIVER_API_RC soc_i2s_transmit_loop(void *bufPtrArray[], int bufSize, int dataSize); /** * Function to stop a continuous audio data write @@ -153,7 +153,7 @@ DRIVER_API_RC soc_i2s_stream(void *buf, uint32_t len, uint32_t len_per_data, uin * - DRV_RC_OK on success * - DRV_RC_FAIL otherwise */ -DRIVER_API_RC soc_i2s_stop_stream(void); +DRIVER_API_RC soc_i2s_stop_transmit(void); /** * Function to receive a block of audio data From 161de9f2f9d481be07cec0c6382e897a0b3b983b Mon Sep 17 00:00:00 2001 From: Sidney Leung Date: Wed, 26 Oct 2016 16:59:58 -0700 Subject: [PATCH 3/4] Updated driver binary --- variants/arduino_101/libarc32drv_arduino101.a | Bin 784020 -> 785338 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/variants/arduino_101/libarc32drv_arduino101.a b/variants/arduino_101/libarc32drv_arduino101.a index 06071cac4343eaa5729f00f883d6868b77938864..20519aeef451c5cfb198c3ab28aca172e38bc38e 100644 GIT binary patch delta 87175 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 From 07f24ab58914fe158a826d9631c94054eaed1174 Mon Sep 17 00:00:00 2001 From: Sidney Leung Date: Thu, 27 Oct 2016 00:15:59 -0700 Subject: [PATCH 4/4] Added comments, ready for try out This version is intended for a wider unit testing. --- .../tone_generator/tone_generator.ino | 34 ++++++++++-------- libraries/CurieAudio/src/I2SOutput.cpp | 3 +- libraries/CurieAudio/src/I2SOutput.h | 6 ++++ system/libarc32_arduino101/drivers/soc_dma.c | 1 + system/libarc32_arduino101/drivers/soc_i2s.c | 12 ++++--- system/libarc32_arduino101/drivers/soc_i2s.h | 13 +++---- variants/arduino_101/libarc32drv_arduino101.a | Bin 785338 -> 785674 bytes 7 files changed, 42 insertions(+), 27 deletions(-) diff --git a/libraries/CurieAudio/examples/tone_generator/tone_generator.ino b/libraries/CurieAudio/examples/tone_generator/tone_generator.ino index c0d423b1..9aa1a870 100755 --- a/libraries/CurieAudio/examples/tone_generator/tone_generator.ino +++ b/libraries/CurieAudio/examples/tone_generator/tone_generator.ino @@ -37,7 +37,7 @@ // but these tones are so simple it won't make a difference. 44.1khz is // standard CD quality sound. -#define AMPLITUDE 100 // Set the amplitude of generated waveforms. This controls how loud +#define AMPLITUDE 10000000 // Set the amplitude of generated waveforms. This controls how loud // the signals are, and can be any value from 0 to 65535. Start with // a low value like 5000 or less to prevent damaging speakers! @@ -77,42 +77,42 @@ Adafruit_ZeroI2S_TX i2s = Adafruit_ZeroI2S_TX(); #endif -void generateSine(uint16_t amplitude, int32_t* buffer, uint16_t length) { +void generateSine(int32_t amplitude, int32_t* buffer, uint16_t length) { // Generate a sine wave signal with the provided amplitude and store it in // the provided buffer of size length. for (int i=0; isrc_interface); + // Per I2S controller specification. if ((cfg->src_interface == SOC_DMA_INTERFACE_I2S_RX) || (cfg->dest_interface == SOC_DMA_INTERFACE_I2S_TX)) { SETV(MMIO_REG_VAL_FROM_BASE(SOC_DMA_BASE, dma_regs[id].CFG_L), diff --git a/system/libarc32_arduino101/drivers/soc_i2s.c b/system/libarc32_arduino101/drivers/soc_i2s.c index 58b52532..ba7a1ab0 100644 --- a/system/libarc32_arduino101/drivers/soc_i2s.c +++ b/system/libarc32_arduino101/drivers/soc_i2s.c @@ -62,7 +62,8 @@ DRIVER_API_RC soc_i2s_read(void *buf, uint32_t len, uint32_t len_per_data); DRIVER_API_RC soc_i2s_listen(void *buf, uint32_t len, uint32_t len_per_data, uint8_t num_bufs); DRIVER_API_RC soc_i2s_stop_listen(void); DRIVER_API_RC soc_i2s_write(void *buf, int bufSize, int dataSize); -DRIVER_API_RC soc_i2s_transmit_loop(void *bufPtrArray[], int bufSize, int dataSize); +DRIVER_API_RC soc_i2s_transmit_loop(void *bufPtrArray[], int numBuf, int bufSize, + int dataSize); DRIVER_API_RC soc_i2s_stop_transmit(void); DRIVER_API_RC soc_i2s_init(uint8_t channel); @@ -240,6 +241,7 @@ DRIVER_API_RC soc_i2s_config(uint8_t channel, struct soc_i2s_cfg *cfg) // Calculate sample_rate divider (note, acts as if resolution is always 32) // sample_rate = i2s_info->clk_speed / (cfg->sample_rate * cfg->resolution * 2); + // Instead of calculating here, user provides clock divider for sample rate. // Setup resolution and sampling rate reg = MMIO_REG_VAL_FROM_BASE(SOC_I2S_BASE, i2s_reg_map[channel].srr); @@ -450,18 +452,18 @@ DRIVER_API_RC soc_i2s_write(void *buf, int bufSize, int dataSize) // Calling stream with 0 buffers is the same as a onetime write of the whole buffer bufArray[0] = buf; - return soc_i2s_transmit_loop(bufArray, bufSize, dataSize); + return soc_i2s_transmit_loop(bufArray, 1, bufSize, dataSize); } -DRIVER_API_RC soc_i2s_transmit_loop(void *bufPtrArray[], int bufSize, int dataSize) +DRIVER_API_RC soc_i2s_transmit_loop(void *bufPtrArray[], int numBuf, int bufSize, + int dataSize) { uint32_t reg; int i, length; struct soc_dma_xfer_item *dma_list; - int numBuf = sizeof(bufPtrArray) / sizeof(void *); - if ((numBuf == 0) || (bufSize < dataSize)) + if ((bufPtrArray == NULL) || (numBuf == 0) || (bufSize < dataSize)) return DRV_RC_FAIL; // Check channel no in use and configured diff --git a/system/libarc32_arduino101/drivers/soc_i2s.h b/system/libarc32_arduino101/drivers/soc_i2s.h index 60b0c0bd..13c637e6 100644 --- a/system/libarc32_arduino101/drivers/soc_i2s.h +++ b/system/libarc32_arduino101/drivers/soc_i2s.h @@ -133,18 +133,19 @@ DRIVER_API_RC soc_i2s_deconfig(uint8_t channel); DRIVER_API_RC soc_i2s_write(void *buf, int bufSize, int dataSize); /** - * Function to continuously transmit blocks of audio data + * Function to continuously transmit blocks of audio data in round a robin fashion * - * @param buf : pointer to buffer to read data from - * @param len : length of buffer (in bytes) - * @param num_bufs : number of parts into which to split the buffer; calling the callback - * after each is sent + * @param bufPtrArray : an array of buffer pointers (addresses) + * @param numBuf : number of buffers for transmission (in bufPtrArray) + * @param bufSize : length of buffer (in bytes) + * @param dataSize : data size - 8, 16, 32 bits (in bytes) * * @return * - DRV_RC_OK on success * - DRV_RC_FAIL otherwise */ -DRIVER_API_RC soc_i2s_transmit_loop(void *bufPtrArray[], int bufSize, int dataSize); +DRIVER_API_RC soc_i2s_transmit_loop(void *bufPtrArray[], int numBuf, int bufSize, + int dataSize); /** * Function to stop a continuous audio data write diff --git a/variants/arduino_101/libarc32drv_arduino101.a b/variants/arduino_101/libarc32drv_arduino101.a index 20519aeef451c5cfb198c3ab28aca172e38bc38e..1eabd669947d76caabdfe1a04f7d0e8cf84ec98d 100644 GIT binary patch delta 7794 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 ao6UW78_|(R8>~5jUO7zr{dd;?w*C*xl-gVX delta 7462 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