TLV320_RBSP class, defined on the I2C master bus.

Dependents:   MovPlayer GR-PEACH_Audio_Playback_Sample GR-PEACH_Audio_Playback_7InchLCD_Sample RGA-MJPEG_VideoDemo ... more

Fork of TLV320_RBSP by Daiki Kato

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers TLV320_RBSP.cpp Source File

TLV320_RBSP.cpp

00001 /*******************************************************************************
00002 * DISCLAIMER
00003 * This software is supplied by Renesas Electronics Corporation and is only
00004 * intended for use with Renesas products. No other uses are authorized. This
00005 * software is owned by Renesas Electronics Corporation and is protected under
00006 * all applicable laws, including copyright laws.
00007 * THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
00008 * THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
00009 * LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
00010 * AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
00011 * TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
00012 * ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
00013 * FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
00014 * ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
00015 * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
00016 * Renesas reserves the right, without notice, to make changes to this software
00017 * and to discontinue the availability of this software. By using this software,
00018 * you agree to the additional terms and conditions found by accessing the
00019 * following link:
00020 * http://www.renesas.com/disclaimer*
00021 * Copyright (C) 2015 Renesas Electronics Corporation. All rights reserved.
00022 *******************************************************************************/
00023 
00024 #include "mbed.h"
00025 #include "TLV320_RBSP.h"
00026 #include "pinmap.h"
00027 
00028 #define MCLK_12MHZ
00029 #undef  MCLK_11_2896MHZ
00030 
00031 TLV320_RBSP::TLV320_RBSP(PinName cs, PinName sda, PinName scl, PinName sck, PinName ws, PinName tx, PinName rx, uint8_t int_level, int32_t max_write_num, int32_t max_read_num) 
00032        : audio_cs_(cs), mI2c_(sda, scl), mI2s_(sck, ws, tx, rx, int_level, max_write_num, max_read_num) {
00033     audio_cs_ = 0;
00034     mAddr     = 0x34;
00035     audio_path_control = 0;
00036 
00037     // I2S Mode
00038     ssif_cfg.enabled                = true;
00039     ssif_cfg.int_level              = 0x78;
00040     ssif_cfg.slave_mode             = true;
00041     ssif_cfg.sample_freq            = 44100u;
00042     ssif_cfg.clk_select             = SSIF_CFG_CKS_AUDIO_X1;
00043     ssif_cfg.multi_ch               = SSIF_CFG_MULTI_CH_1;
00044     ssif_cfg.data_word              = SSIF_CFG_DATA_WORD_16;
00045     ssif_cfg.system_word            = SSIF_CFG_SYSTEM_WORD_32;
00046     ssif_cfg.bclk_pol               = SSIF_CFG_FALLING;
00047     ssif_cfg.ws_pol                 = SSIF_CFG_WS_LOW;
00048     ssif_cfg.padding_pol            = SSIF_CFG_PADDING_LOW;
00049     ssif_cfg.serial_alignment       = SSIF_CFG_DATA_FIRST;
00050     ssif_cfg.parallel_alignment     = SSIF_CFG_LEFT;
00051     ssif_cfg.ws_delay               = SSIF_CFG_DELAY;
00052     ssif_cfg.noise_cancel           = SSIF_CFG_ENABLE_NOISE_CANCEL;
00053     ssif_cfg.tdm_mode               = SSIF_CFG_DISABLE_TDM;
00054     ssif_cfg.romdec_direct.mode     = SSIF_CFG_DISABLE_ROMDEC_DIRECT;
00055     ssif_cfg.romdec_direct.p_cbfunc = NULL;
00056     mI2s_.ConfigChannel(&ssif_cfg);
00057 
00058     mI2c_.frequency(150000);
00059     reset();                       // TLV resets
00060     power(0x80);                   // Power off
00061     format(16);                    // 16Bit I2S protocol format
00062     frequency(44100);              // Default sample frequency is 44.1kHz
00063     bypass(false);                 // Do not bypass device
00064     mic(false);                    // Input select for ADC is line
00065     mute(false);                   // Not muted
00066     activateDigitalInterface_();   // The digital part of the chip is active
00067 }
00068 
00069 // Public Functions
00070 bool TLV320_RBSP::inputVolume(float leftVolumeIn, float rightVolumeIn) {
00071     // check values are in range
00072     if ((leftVolumeIn  < 0.0) || (leftVolumeIn  > 1.0)
00073      || (rightVolumeIn < 0.0) || (rightVolumeIn > 1.0)) {
00074         return false;
00075     }
00076 
00077     // convert float to encoded char
00078     char left  = (char)(31 * leftVolumeIn);
00079     char right = (char)(31 * rightVolumeIn);
00080 
00081     // Left Channel
00082     cmd[0] = LEFT_LINE_INPUT_CHANNEL_VOLUME_CONTROL;
00083     cmd[1] = left | (0 << 7);    // set volume, mute off
00084     mI2c_.write(mAddr, cmd, 2);
00085 
00086     // Right Channel
00087     cmd[0] = RIGHT_LINE_INPUT_CHANNEL_VOLUME_CONTROL;
00088     cmd[1] = right | (0 << 7);   // set volume, mute off
00089     mI2c_.write(mAddr, cmd, 2);
00090 
00091     return true;
00092 }
00093 
00094 bool TLV320_RBSP::outputVolume(float leftVolumeOut, float rightVolumeOut) {
00095     // check values are in range
00096     if ((leftVolumeOut  < 0.0) || (leftVolumeOut  > 1.0)
00097      || (rightVolumeOut < 0.0) || (rightVolumeOut > 1.0)) {
00098         return false;
00099     }
00100 
00101     // convert float to encoded char
00102     char left  = (char)((79 * leftVolumeOut) + 0x30);
00103     char right = (char)((79 * rightVolumeOut) + 0x30);
00104 
00105     // Left Channel
00106     cmd[0] = LEFT_CHANNEL_HEADPHONE_VOLUME_CONTROL;
00107     cmd[1] = left | (1 << 7);    // set volume, Zero-cross detect
00108     mI2c_.write(mAddr, cmd, 2);
00109 
00110     // Right Channel
00111     cmd[0] = RIGHT_CHANNEL_HEADPHONE_VOLUME_CONTROL;
00112     cmd[1] = right | (1 << 7);   // set volume, Zero-cross detect
00113     mI2c_.write(mAddr, cmd, 2);
00114 
00115     return true;
00116 }
00117 
00118 void TLV320_RBSP::bypass(bool bypassVar) {
00119     cmd[0] = ANALOG_AUDIO_PATH_CONTROL;
00120     if (bypassVar != false) {
00121         audio_path_control |= (1 << 3);       // bypass enabled
00122         audio_path_control &= ~(1 << 4);      // DAC disable
00123     } else {
00124         audio_path_control &= ~(1 << 3);      // bypass disable
00125         audio_path_control |= (1 << 4);       // DAC enabled
00126     }
00127     cmd[1] = audio_path_control;
00128     mI2c_.write(mAddr, cmd, 2);
00129 }
00130 
00131 void TLV320_RBSP::mic(bool micVar) {
00132     cmd[0] = ANALOG_AUDIO_PATH_CONTROL;
00133     if (micVar != false) {
00134         audio_path_control |= (1 << 2);        // INSEL Microphone
00135     } else {
00136         audio_path_control &= ~(1 << 2);       // INSEL Line
00137     }
00138     cmd[1] = audio_path_control;
00139     mI2c_.write(mAddr, cmd, 2);
00140 }
00141 
00142 void TLV320_RBSP::micVolume(bool mute, bool boost) {
00143     cmd[0] = ANALOG_AUDIO_PATH_CONTROL;
00144     if (mute != false) {
00145         audio_path_control |= (1 << 1);        // MICM Muted
00146     } else {
00147         audio_path_control &= ~(1 << 1);       // MICM Normal
00148     }
00149     if (boost != false) {
00150         audio_path_control |= (1 << 0);        // MICB 20dB
00151     } else {
00152         audio_path_control &= ~(1 << 0);       // MICB 0dB
00153     }
00154     cmd[1] = audio_path_control;
00155     mI2c_.write(mAddr, cmd, 2);
00156 }
00157 
00158 void TLV320_RBSP::mute(bool softMute) {
00159     cmd[0] = DIGITAL_AUDIO_PATH_CONTROL;
00160     if (softMute != false) {
00161         cmd[1] = 0x08;           // set instruction to mute
00162     } else {
00163         cmd[1] = 0x00;           // set instruction to NOT mute
00164     }
00165     mI2c_.write(mAddr, cmd, 2);
00166 }
00167 
00168 void TLV320_RBSP::power(int device) {
00169     cmd[0] = POWER_DOWN_CONTROL;
00170     cmd[1] = (char)device;       // set user defined commands
00171     mI2c_.write(mAddr, cmd, 2);
00172 }
00173 
00174 bool TLV320_RBSP::format(char length) {
00175     cmd[0] = DIGITAL_AUDIO_INTERFACE_FORMAT;
00176     cmd[1] = (1 << 6);           // Master
00177     switch (length) {            // input data into instruction byte
00178         case 16:
00179             ssif_cfg.data_word = SSIF_CFG_DATA_WORD_16;
00180             cmd[1] |= 0x02;
00181             break;
00182         case 20:
00183             ssif_cfg.data_word = SSIF_CFG_DATA_WORD_20;
00184             cmd[1] |= 0x06;
00185             break;
00186         case 24:
00187             ssif_cfg.data_word = SSIF_CFG_DATA_WORD_24;
00188             cmd[1] |= 0x0A;
00189             break;
00190         case 32:
00191             ssif_cfg.data_word = SSIF_CFG_DATA_WORD_32;
00192             cmd[1] |= 0x0E;
00193             break;
00194         default:
00195             return false;
00196     }
00197     mI2s_.ConfigChannel(&ssif_cfg);
00198     mI2c_.write(mAddr, cmd, 2);
00199 
00200     return true;
00201 }
00202 
00203 bool TLV320_RBSP::frequency(int hz) {
00204     char control_setting;
00205 
00206 #if defined(MCLK_12MHZ)
00207     switch (hz) {
00208         case 96000:
00209             control_setting = 0x1D;
00210             break;
00211         case 88200:
00212             control_setting = 0x3F;
00213             break;
00214         case 48000:
00215             control_setting = 0x01;
00216             break;
00217         case 44100:
00218             control_setting = 0x23;
00219             break;
00220         case 32000:
00221             control_setting = 0x19;
00222             break;
00223         case 8021:
00224             control_setting = 0x2F;
00225             break;
00226         case 8000:
00227             control_setting = 0x0D;
00228             break;
00229         default:
00230             return false;
00231     }
00232 #elif defined(MCLK_11_2896MHZ)
00233     switch (hz) {
00234         case 88200:
00235             control_setting = 0x3C;
00236             break;
00237         case 44100:
00238             control_setting = 0x20;
00239             break;
00240         case 8021:
00241             control_setting = 0x2C;
00242             break;
00243         default:
00244             return false;
00245     }
00246 #else
00247     #error MCLK error
00248 #endif
00249     cmd[0] = SAMPLE_RATE_CONTROL;
00250     cmd[1] = control_setting;
00251     mI2c_.write(mAddr, cmd, 2);
00252 
00253     return true;
00254 }
00255 
00256 void TLV320_RBSP::reset(void) {
00257     cmd[0] = RESET_REGISTER;
00258     cmd[1] = 0x00;               // Write 000000000 to this register triggers reset
00259     mI2c_.write(mAddr, cmd, 2);
00260 }
00261 
00262 // Private Functions
00263 void TLV320_RBSP::activateDigitalInterface_(void) {
00264     cmd[0] = DIGITAL_INTERFACE_ACTIVATION;
00265     cmd[1] = 0x01;               // Activate
00266     mI2c_.write(mAddr, cmd, 2);
00267 }