[ FORK ] I2S library for FRDM 64F, forked from p07gbar/I2S

Fork of I2S by Giles Barton-Owen

Revision:
2:dd2c3c0ec223
Parent:
1:89cea1a77092
Child:
3:5bb7f0625fc9
--- a/I2S.h	Wed Mar 16 09:45:18 2016 +0000
+++ b/I2S.h	Tue Mar 22 16:23:46 2016 +0900
@@ -1,321 +1,321 @@
-/**
-* @author Giles Barton-Owen
-*
-* @section LICENSE
-*
-* Copyright (c) 2012 mbed
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy
-* of this software and associated documentation files (the "Software"), to deal
-* in the Software without restriction, including without limitation the rights
-* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the Software is
-* furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in
-* all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-* THE SOFTWARE.
-*
-* @section DESCRIPTION
-*    A I2S library for the LPC1768's built-in I2S peripheral
-*
-*/ 
-
-#include "mbed.h"
-#include "math.h"
-
-#ifndef I2S_H
-#define I2S_H
-
-#define I2S_TRANSMIT     0
-#define I2S_RECEIVE     1
-
-#define I2S_MASTER     0
-#define I2S_SLAVE     1
-
-#define I2S_STEREO     0
-#define I2S_MONO     1
-
-#define I2S_MUTED     1
-#define I2S_UNMUTED 0
-
-#define I2S_4WIRE     1
-#define I2S_3WIRE     0
-
-/** A class to play give access to the I2S library
- */
-
-class I2S
-{
-
-public:
-
-    /** Create a I2S instance
-     * 
-     * @param rxtx     Set the I2S instance to be transmit or recieve (I2S_TRANSMIT/I2S_RECEIVE)
-     * @param sd    The serial data pin
-     * @param ws    The word select pin
-     * @param clk    The clock pin
-     */
-    I2S(bool rxtx, PinName sd, PinName ws, PinName clk);
-
-    /** Create a I2S instance: Only with the serial data line set. Won't really do much.
-     * 
-     * @param rxtx     Set the I2S instance to be transmit or recieve (I2S_TRANSMIT/I2S_RECEIVE)
-     * @param sd    The serial data pin
-     */
-    I2S(bool rxtx, PinName sd);
-
-    
-    /** Create a I2S instance: Only with serial data line and word select. 
-     * 
-     * @param rxtx     Set the I2S instance to be transmit or recieve (I2S_TRANSMIT/I2S_RECEIVE)
-     * @param sd    The serial data pin
-     * @param ws    The word select pin
-     */
-    I2S(bool rxtx, PinName sd, PinName ws);
-    
-    
-    
-    /** Create a I2S instance: Only with serial data line. Four wire mode means this is functional
-     * 
-     * @param rxtx     Set the I2S instance to be transmit or recieve (I2S_TRANSMIT/I2S_RECEIVE)
-     * @param sd    The serial data pin
-     * @param fourwiremode True means the peripheral is in 4-wire mode. It borrows WS and CLK from the other half
-     */
-    I2S(bool rxtx, PinName sd, bool fourwiremode);
-    
-    /** Create a I2S instance: Only with serial data line and word select line. Four wire mode means this is functional
-     * 
-     * @param rxtx     Set the I2S instance to be transmit or recieve (I2S_TRANSMIT/I2S_RECEIVE)
-     * @param sd    The serial data pin
-     * @param ws    The word select pin
-     * @param fourwiremode True means the peripheral is in 4-wire mode. It borrows WS and CLK from the other half
-     */
-    I2S(bool rxtx, PinName sd, PinName ws, bool fourwiremode);
-
-    /** Destroy the I2S instance
-     */
-    ~I2S();
-
-    /** Write to the FIFO
-     * 
-     * @param buf[] The buffer of values to write: are bit stuffed in fours
-     * @param len    The number of chars to write
-     */
-    void write(char buf[], int len);
-
-    /** Write to the FIFO
-     * 
-     * @param buf[] The buffer of values to write: are bit stuffed automatically
-     * @param len    The number of chars to write
-     */
-    void write(int buf[], int len);
-
-    /** Read the FIFOs contents
-     * 
-     * @return The buffers value.
-     */
-    int read();
-
-    /** Read from the FIFO
-     * 
-     * @param buf[] The buffer of values to read: raw bit shifted
-     * @param len    The number of chars to read
-     */
-    void read(char buf[], int len);
-
-    /** Read from the FIFO
-     * 
-     * @param buf[] The buffer of values to read: sorted to just values
-     * @param len    The number of chars to read
-     */
-    void read(int buf[], int len);
-    
-    /** Get the maximum number of points of data the FIFO could store
-     *
-     * @return The number of points
-     */
-    int max_fifo_points();
-    /** Switch the peripheral on and off
-     *
-     * @param pwr Power status
-     */
-    void power(bool pwr);
-
-    /** Switch the peripheral between master and slave
-     *
-     * @param mastermode The peripherals master/slave status (I2S_MASTER/I2S_SLAVE)
-     */
-    void masterslave(bool mastermode);
-
-    /** Switch the peripheral between different wordsizes
-     *
-     * @param words The number of bits per word: 8,16,32
-     */
-    void wordsize(int words);
-
-    /** Define the mclk frequency
-     *
-     * @param freq The frequency desired for the mclk
-     */
-    void mclk_freq(int freq);
-    
-    /** Define the sample rate
-     *
-     * @param freq The desired sample rate frequency
-     */
-    void frequency(int freq);
-
-    /** Set the level that the fifo interrupts at
-     *
-     * @param level A number between 0 and 7 at which the fifo interrupts
-     */
-    void set_interrupt_fifo_level(int level);
-
-    /** Get the current FIFO level
-     *
-     * @return A number between 0 and 7 the FIFO is currently at
-     */
-    int fifo_level();
-
-    /** Get the current number of samples in the FIFO
-     *
-    * @return A number showing how many samples are in the FIFO
-     */
-    int fifo_points();
-
-    /** Set whether the peripheral is in stereo or mono mode: in mono the perifpheral sends out the same data twice
-     *
-     * @param stereomode Whether the peripheral is in stereo or mono: I2S_STEREO/I2S_MONO
-     */
-    void stereomono(bool stereomode);
-
-    /** Mute the peripheral
-     *
-     */
-    void mute();
-
-    /** Set the mute status of the peripheral
-     *
-     * @param mute_en Set whether the mute is enabled
-     */
-    void mute(bool mute_en);
-
-    /** Stop the peripheral
-     *
-     */
-    void stop();
-
-    /** Start the peripheral
-     *
-     */
-    void start();
-
-    /** Check the Clock and Pin setup went according to plan
-     *
-     * @return Setup okay?
-     */
-    bool setup_ok();
-
-    /** Attach a function to be called when the FIFO triggers
-     *
-     * @param fptr A pointer to the function to be called
-     */
-    void attach(void (*fptr)(void))
-    {
-        if (_rxtx == I2S_TRANSMIT)
-        {
-            I2STXISR.attach(fptr);
-            txisr = true;
-        }
-        else
-        {
-            I2SRXISR.attach(fptr);
-            rxisr = true;
-        }
-    }
-
-    /** Attach a member function to be called when the FIFO triggers
-     *
-     * @param tptr A pointer to the instance of the class
-     * @param mptr A pointer to the member function
-     */
-    template<typename T>
-    void attach(T *tptr, void (T::*mptr)(void))
-    {
-        if (_rxtx == I2S_TRANSMIT)
-        {
-            I2STXISR.attach(tptr, mptr);
-            txisr = true;
-        }
-        else
-        {
-            I2SRXISR.attach(tptr, mptr);
-            rxisr = true;
-        }
-    }
-
-private:
-
-void _set_clock_112896(void);
-void _set_clock_122800(void);
-void _i2s_init(void);
-void _i2s_set_rate(int smprate);
-
-    void mclk_enable(bool mclk_en);
-
-    void write_registers();
-
-    void pin_setup();
-
-    void fraction_estimator(float in, int * num, int * den);
-
-    float mod(float in);
-
-    void defaulter();
-
-    PinName _sd, _ws, _clk, _mclk;
-    bool ws_d, clk_d, mclk_d;
-    bool _rxtx;
-    bool pwr;
-    bool master;
-    int wordwidth;
-    char wordwidth_code;
-    bool mclk_en;
-    int mclk_frequency;
-    int freq;
-    bool stereo;
-    bool muted;
-    bool stopped;
-    int interrupt_fifo_level;
-    int pin_setup_err;
-    int reg_write_err;
-    bool deallocating;
-    int old_freq;
-    
-    bool fourwire;
-
-    int old_pre_num;
-    int old_pre_den;
-    int old_bitrate_div;
-    static void _i2sisr(void);
-
-    static FunctionPointer I2STXISR;
-    static FunctionPointer I2SRXISR;
-
-    static bool txisr;
-    static bool rxisr;
-    
-    void write(int bufr[], int bufl[], int len);
-    void read(int bufr[], int bufl[], int len);
-};
-
-#endif
+/**
+* @author Giles Barton-Owen
+*
+* @section LICENSE
+*
+* Copyright (c) 2012 mbed
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy
+* of this software and associated documentation files (the "Software"), to deal
+* in the Software without restriction, including without limitation the rights
+* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+* copies of the Software, and to permit persons to whom the Software is
+* furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in
+* all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+* THE SOFTWARE.
+*
+* @section DESCRIPTION
+*    A I2S library for the LPC1768's built-in I2S peripheral
+*
+*/
+
+#include "mbed.h"
+#include "math.h"
+
+#ifndef I2S_H
+#define I2S_H
+
+#define I2S_TRANSMIT     0
+#define I2S_RECEIVE     1
+
+#define I2S_MASTER     0
+#define I2S_SLAVE     1
+
+#define I2S_STEREO     0
+#define I2S_MONO     1
+
+#define I2S_MUTED     1
+#define I2S_UNMUTED 0
+
+#define I2S_4WIRE     1
+#define I2S_3WIRE     0
+
+/** A class to play give access to the I2S library
+ */
+
+class I2S
+{
+
+public:
+
+    /** Create a I2S instance
+     *
+     * @param rxtx     Set the I2S instance to be transmit or recieve (I2S_TRANSMIT/I2S_RECEIVE)
+     * @param sd    The serial data pin
+     * @param ws    The word select pin
+     * @param clk    The clock pin
+     */
+    I2S(bool rxtx, PinName sd, PinName ws, PinName clk);
+
+    /** Create a I2S instance: Only with the serial data line set. Won't really do much.
+     *
+     * @param rxtx     Set the I2S instance to be transmit or recieve (I2S_TRANSMIT/I2S_RECEIVE)
+     * @param sd    The serial data pin
+     */
+    I2S(bool rxtx, PinName sd);
+
+
+    /** Create a I2S instance: Only with serial data line and word select.
+     *
+     * @param rxtx     Set the I2S instance to be transmit or recieve (I2S_TRANSMIT/I2S_RECEIVE)
+     * @param sd    The serial data pin
+     * @param ws    The word select pin
+     */
+    I2S(bool rxtx, PinName sd, PinName ws);
+
+
+
+    /** Create a I2S instance: Only with serial data line. Four wire mode means this is functional
+     *
+     * @param rxtx     Set the I2S instance to be transmit or recieve (I2S_TRANSMIT/I2S_RECEIVE)
+     * @param sd    The serial data pin
+     * @param fourwiremode True means the peripheral is in 4-wire mode. It borrows WS and CLK from the other half
+     */
+    I2S(bool rxtx, PinName sd, bool fourwiremode);
+
+    /** Create a I2S instance: Only with serial data line and word select line. Four wire mode means this is functional
+     *
+     * @param rxtx     Set the I2S instance to be transmit or recieve (I2S_TRANSMIT/I2S_RECEIVE)
+     * @param sd    The serial data pin
+     * @param ws    The word select pin
+     * @param fourwiremode True means the peripheral is in 4-wire mode. It borrows WS and CLK from the other half
+     */
+    I2S(bool rxtx, PinName sd, PinName ws, bool fourwiremode);
+
+    /** Destroy the I2S instance
+     */
+    ~I2S();
+
+    /** Write to the FIFO
+     *
+     * @param buf[] The buffer of values to write: are bit stuffed in fours
+     * @param len    The number of chars to write
+     */
+    void write(char buf[], int len);
+
+    /** Write to the FIFO
+     *
+     * @param buf[] The buffer of values to write: are bit stuffed automatically
+     * @param len    The number of chars to write
+     */
+    void write(int buf[], int len);
+
+    /** Read the FIFOs contents
+     *
+     * @return The buffers value.
+     */
+    int read();
+
+    /** Read from the FIFO
+     *
+     * @param buf[] The buffer of values to read: raw bit shifted
+     * @param len    The number of chars to read
+     */
+    void read(char buf[], int len);
+
+    /** Read from the FIFO
+     *
+     * @param buf[] The buffer of values to read: sorted to just values
+     * @param len    The number of chars to read
+     */
+    void read(int buf[], int len);
+
+    /** Get the maximum number of points of data the FIFO could store
+     *
+     * @return The number of points
+     */
+    int max_fifo_points();
+    /** Switch the peripheral on and off
+     *
+     * @param pwr Power status
+     */
+    void power(bool pwr);
+
+    /** Switch the peripheral between master and slave
+     *
+     * @param mastermode The peripherals master/slave status (I2S_MASTER/I2S_SLAVE)
+     */
+    void masterslave(bool mastermode);
+
+    /** Switch the peripheral between different wordsizes
+     *
+     * @param words The number of bits per word: 8,16,32
+     */
+    void wordsize(int words);
+
+    /** Define the mclk frequency
+     *
+     * @param freq The frequency desired for the mclk
+     */
+    void mclk_freq(int freq);
+
+    /** Define the sample rate
+     *
+     * @param freq The desired sample rate frequency
+     */
+    void frequency(int freq);
+
+    /** Set the level that the fifo interrupts at
+     *
+     * @param level A number between 0 and 7 at which the fifo interrupts
+     */
+    void set_interrupt_fifo_level(int level);
+
+    /** Get the current FIFO level
+     *
+     * @return A number between 0 and 7 the FIFO is currently at
+     */
+    int fifo_level();
+
+    /** Get the current number of samples in the FIFO
+     *
+    * @return A number showing how many samples are in the FIFO
+     */
+    int fifo_points();
+
+    /** Set whether the peripheral is in stereo or mono mode: in mono the perifpheral sends out the same data twice
+     *
+     * @param stereomode Whether the peripheral is in stereo or mono: I2S_STEREO/I2S_MONO
+     */
+    void stereomono(bool stereomode);
+
+    /** Mute the peripheral
+     *
+     */
+    void mute();
+
+    /** Set the mute status of the peripheral
+     *
+     * @param mute_en Set whether the mute is enabled
+     */
+    void mute(bool mute_en);
+
+    /** Stop the peripheral
+     *
+     */
+    void stop();
+
+    /** Start the peripheral
+     *
+     */
+    void start();
+
+    /** Check the Clock and Pin setup went according to plan
+     *
+     * @return Setup okay?
+     */
+    bool setup_ok();
+
+    /** Attach a function to be called when the FIFO triggers
+     *
+     * @param fptr A pointer to the function to be called
+     */
+    void attach(void (*fptr)(void))
+    {
+        if (_rxtx == I2S_TRANSMIT)
+        {
+            I2STXISR.attach(fptr);
+            txisr = true;
+        }
+        else
+        {
+            I2SRXISR.attach(fptr);
+            rxisr = true;
+        }
+    }
+
+    /** Attach a member function to be called when the FIFO triggers
+     *
+     * @param tptr A pointer to the instance of the class
+     * @param mptr A pointer to the member function
+     */
+    template<typename T>
+    void attach(T *tptr, void (T::*mptr)(void))
+    {
+        if (_rxtx == I2S_TRANSMIT)
+        {
+            I2STXISR.attach(tptr, mptr);
+            txisr = true;
+        }
+        else
+        {
+            I2SRXISR.attach(tptr, mptr);
+            rxisr = true;
+        }
+    }
+
+private:
+
+void _set_clock_112896(void);
+void _set_clock_122800(void);
+void _i2s_init(void);
+void _i2s_set_rate(int smprate);
+
+    void mclk_enable(bool mclk_en);
+
+    void write_registers();
+
+    void pin_setup();
+
+    void fraction_estimator(float in, int * num, int * den);
+
+    float mod(float in);
+
+    void defaulter();
+
+    PinName _sd, _ws, _clk, _mclk;
+    bool ws_d, clk_d, mclk_d;
+    bool _rxtx;
+    bool pwr;
+    bool master;
+    int wordwidth;
+    char wordwidth_code;
+    bool mclk_en;
+    int mclk_frequency;
+    int freq;
+    bool stereo;
+    bool muted;
+    bool stopped;
+    int interrupt_fifo_level;
+    int pin_setup_err;
+    int reg_write_err;
+    bool deallocating;
+    int old_freq;
+
+    bool fourwire;
+
+    int old_pre_num;
+    int old_pre_den;
+    int old_bitrate_div;
+    static void _i2sisr(void);
+
+    static FunctionPointer I2STXISR;
+    static FunctionPointer I2SRXISR;
+
+    static bool txisr;
+    static bool rxisr;
+
+    void write(int bufr[], int bufl[], int len);
+    void read(int bufr[], int bufl[], int len);
+};
+
+#endif