Library for Texas Instruments TLV320AIC23B hi-def audio chip note: requires I2SSlave abstraction library

Dependents:   playback FTSESpeech i2s_audio_echo i2s_audio_sampler ... more

TLV320.h

Committer:
d_worrall
Date:
2011-08-04
Revision:
1:7e76c6f56169
Parent:
0:bb2411673898

File content as of revision 1:7e76c6f56169:

/**
* @author Ioannis Kedros, Daniel Worrall
*
* @section LICENSE
*
* Copyright (c) 2011 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
*    Library for Texas instruments TLV320AIC23B library NXP LPC1768
*
*/

#ifndef MBED_TLV320_H
#define MBED_TLV320_H

#include "mbed.h"
#include "I2SSlave.h"

/** TLV320 class, defined on the I2C master bus
*
*/

class TLV320
{        
    public:
        //constructor
        /** Create a TLV320 object defined on the I2C port
        *  
        * @param sda Serial data pin (p9 or p28)
        * @param scl Serial clock pin (p10 or p27)
        * @param addr Object address
        */
        TLV320(PinName sda, PinName scl, int addr, PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
        /** Power up/down
        *
        * @param powerUp 0 = power down, 1 = power up
        */
        void power(bool powerUp);
        /** Overloaded power() function default = 0x07, record requires 0x02
        *
        * @param device Call individual devices to power up/down
        * Device power      0x00 = On 0x80 = Off
        * Clock             0x00 = On 0x40 = Off
        * Oscillator        0x00 = On 0x20 = Off
        * Outputs           0x00 = On 0x10 = Off
        * DAC               0x00 = On 0x08 = Off
        * ADC               0x00 = On 0x04 = Off
        * Microphone input  0x00 = On 0x02 = Off
        * Line input        0x00 = On 0x01 = Off
        */
        void power(int device);
        /** Set I2S interface bit length and mode
        *
        * @param length Set bit length to 16, 20, 24 or 32 bits
        * @param mode Set STEREO (0), MONO (1)
        */
        void format(char length, bool mode);
        /** Set sample frequency
         *
         * @param frequency Sample frequency of data in Hz
         * @return Returns an integer 0 = success, -1 = unrecognnised frequency
         * 
         * The TLV320 supports the following frequencies: 8kHz, 8.021kHz, 32kHz, 44.1kHz, 48kHz, 88.2kHz, 96kHz
         * Default is 44.1kHz
         */
        int frequency(int hz);
        /** Reset TLV320
        *
        */
        void reset(void);
        /** Start streaming i.e. enable interrupts
         *
         * @param mode Enable interrupts for NONE, TRANSMIT only, RECEIVE only, BOTH
         */
        void start(int mode);
        /** Stop streaming i.e. disable all interrupts
         *
         */
        void stop(void);
        /** Write [length] 32 bit words in buffer to I2S port
         *
         * @param *buffer Address of buffer to be written
         * @param from Start position in buffer to read from
         * @param length Number of words to be written (MUST not exceed 4)
         */
        void write(int *buffer, int from, int length);
        /** Read 4 x (32bit) words into rxBuffer
         *
         */
        void read(void);
        /** Attach a void/void function or void/void static member function to an interrupt generated by the I2SxxFIFOs
         *
         * @param function Function to attach
         *
         * e.g. <code> myTlv320Object.attach(&myfunction);</code>
         * OR  <code> myTlv320Object.attach(&myClass::myStaticMemberFunction);</code>
         */
        void attach(void(*fptr)(void));
        /** Attach a nonstatic void/void member function to an interrupt generated by the I2SxxFIFOs
         *
         * @param tptr Object pointer
         * @param mptr Member function pointer
         *
         * e.g. <code>myTlv320Object.attach(&myObject, &myClass::myNonstaticMemberFunction);</code> where myObject is an object of myClass
         */
        template<typename T>
        void attach(T *tptr, void(T::*mptr)(void)){
            mI2s_.attach(tptr, mptr);
        }
                /** Line in volume control i.e. record volume
        *
        * @param leftVolumeIn Left line-in volume 
        * @param rightVolumeIn Right line-in volume
        * @return Returns 0 for success, -1 if parameters are out of range
        * Parameters accept a value, where 0.0 < parameter < 1.0 and where 0.0 maps to -34.5dB 
        * and 1.0 maps to +12dB (0.74 = 0 dB default).
        */
        int inputVolume(float leftVolumeIn, float rightVolumeIn);
        /** Headphone out volume control
        *
        * @param leftVolumeOut Left line-out volume
        * @param rightVolumeOut Right line-out volume
        * @return Returns 0 for success, -1 if parameters are out of range
        * Parameters accept a value, where 0.0 < parameter < 1.0 and where 0.0 maps to -73dB (mute) 
        * and 1.0 maps to +6dB (0.5 = default)
        */
        int outputVolume(float leftVolumeOut, float rightVolumeOut);
       /** Analog audio path control
        *
        * @param bypassVar Route analogue audio direct from line in to headphone out
        */
        void bypass(bool bypassVar);
        /**Digital audio path control
        *
        * @param softMute Mute output
        */
        void mute(bool softMute);
        //Receive buffer
        
        int *rxBuffer;
        
    protected:
        char cmd[2];    //the address and command for TLV320 internal registers
        int mAddr;      //register write address
    private:
        I2C mI2c_;      //MUST use the I2C port
        I2SSlave mI2s_;
        Ticker I2sTick;
        void io(void);   
       /** Sample rate control
        *
        * @param rate Set the sampling rate as per datasheet section 3.3.2
        * @param clockIn Set the clock in divider MCLK, MCLK_DIV2
        * @param clockMode Set clock mode CLOCK_NORMAL, CLOCK_USB
        */
        void setSampleRate_(char rate, bool clockIn, bool mode, bool bOSR); 
       /** Digital interface activation
        *
        */
        void activateDigitalInterface_(void);
        /** Digital interface deactivation
        *
        */
        void deactivateDigitalInterface_(void);

        //TLV320AIC23B register addresses as defined in the TLV320AIC23B datasheet
        #define LEFT_LINE_INPUT_CHANNEL_VOLUME_CONTROL  (0x00 << 1)
        #define RIGHT_LINE_INPUT_CHANNEL_VOLUME_CONTROL (0x01 << 1)
        #define LEFT_CHANNEL_HEADPHONE_VOLUME_CONTROL   (0x02 << 1)
        #define RIGHT_CHANNEL_HEADPHONE_VOLUME_CONTROL  (0x03 << 1)
        #define ANALOG_AUDIO_PATH_CONTROL               (0x04 << 1)
        #define DIGITAL_AUDIO_PATH_CONTROL              (0x05 << 1)
        #define POWER_DOWN_CONTROL                      (0x06 << 1)
        #define DIGITAL_AUDIO_INTERFACE_FORMAT          (0x07 << 1)
        #define SAMPLE_RATE_CONTROL                     (0x08 << 1)
        #define DIGITAL_INTERFACE_ACTIVATION            (0x09 << 1)
        #define RESET_REGISTER                          (0x0F << 1)
        
        #define CLOCK_NORMAL        0
        #define CLOCK_USB           1
        #define MCLK                0
        #define MCLK_DIV2           1
};

#endif