/* Copyright (c) 2016, Texas Instruments Incorporated - http://www.ti.com/ All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * \file audio_dc_config.c * * \brief Configures Audio daughter card HW modules * */ #include "audio_dc_cfg.h" #include "vproccmds_a.h" #include #include "string.h" Platform_STATUS audioHDMIConfig(void); #define HSR4_I2C_ADDR 0x5D #define HSR4_I2C_PORT_NUM I2C_PORT_1 /* ------------------------------------------------------------------------ * * Prototypes * * ------------------------------------------------------------------------ */ /** * \brief Initializes ADC module * * This function initializes and configures the ADC modules * on audio daughter card * * \param devId [IN] ADC Device Id * \param config [IN] ADC configuration parameters * * \return Platform_EOK on Success or error code */ Platform_STATUS audioAdcConfig(AdcDevId devId, AdcConfig *config) { Platform_STATUS status; if(config == NULL) { IFPRINT(platform_write("Invalid Inputs\n")); return (Platform_EINVALID); } /* Initialize all the HW instances of ADC */ status = platformAudioAdcInit(devId); if(status != Platform_EOK) { IFPRINT(platform_write("audioAdcConfig : platformaudioAdcConfig Failed\n")); return (status); } /* Set ADC channel gain */ status = platformAudioAdcSetGain(devId, ADC_CH_ALL, config->gain); if(status != Platform_EOK) { IFPRINT(platform_write("audioAdcConfig : platformAudioAdcSetGain Failed\n")); return (status); } /* Configure Left input mux for ADC1L */ status = platformAudioAdcSetLeftInputMux(devId, ADC_CH1_LEFT, config->adc1LMux); if(status != Platform_EOK) { IFPRINT(platform_write("audioAdcConfig : platformAudioAdcSetLeftInputMux Failed\n")); return (status); } /* Configure Left input mux for ADC2L*/ status = platformAudioAdcSetLeftInputMux(devId, ADC_CH2_LEFT, config->adc2LMux); if(status != Platform_EOK) { IFPRINT(platform_write("audioAdcConfig : platformAudioAdcSetLeftInputMux Failed\n")); return (status); } /* Configure Right input mux for ADC1R */ status = platformAudioAdcSetRightInputMux(devId, ADC_CH1_RIGHT, config->adc1RMux); if(status != Platform_EOK) { IFPRINT(platform_write("audioAdcConfig : platformAudioAdcSetRightInputMux Failed\n")); return (status); } /* Configure Right input mux for ADC2R */ status = platformAudioAdcSetRightInputMux(devId, ADC_CH2_RIGHT, config->adc2RMux); if(status != Platform_EOK) { IFPRINT(platform_write("audioAdcConfig : platformAudioAdcSetRightInputMux Failed\n")); return (status); } /* Configure audio data format */ status = platformAudioAdcDataConfig(devId, config->wlen, config->format); if(status != Platform_EOK) { IFPRINT(platform_write("audioAdcConfig : platformAudioAdcDataConfig Failed\n")); return (status); } /* Configure all the interrupts */ status = platformAudioAdcConfigIntr(devId, ADC_INTR_ALL, config->intEnable); if(status != Platform_EOK) { IFPRINT(platform_write("audioAdcConfig : platformAudioAdcConfigIntr Failed\n")); return (status); } return (status); } /** * \brief Initializes DAC module * * This function initializes and configures the DAC modules * on audio daughter card * * \param devId [IN] DAC Device Id * \param config [IN] DAC configuration parameters * * \return Platform_EOK on Success or error code */ Platform_STATUS audioDacConfig(DacDevId devId, DacConfig *config) { Platform_STATUS status; if(config == NULL) { IFPRINT(platform_write("Invalid Inputs\n")); return (Platform_EINVALID); } /* Initialize Audio DAC */ status = platformAudioDacInit(devId); if(status != Platform_EOK) { IFPRINT(platform_write("audioDacConfig : platformaudioDacConfig Failed\n")); return (status); } /* Configure AMUTE control event */ status = platformAudioDacAmuteCtrl(devId, config->amuteCtrl, config->amuteEnable); if(status != Platform_EOK) { IFPRINT(platform_write("audioDacConfig : platformAudioDacAmuteCtrl Failed\n")); return (status); } /* Set sampling mode */ status = platformAudioDacSetSamplingMode(devId, config->samplingMode); if(status != Platform_EOK) { IFPRINT(platform_write("audioDacConfig : platformAudioDacSetSamplingMode Failed\n")); return (status); } /* Set data format */ status = platformAudioDacSetDataFormat(devId, config->dataFormat); if(status != Platform_EOK) { IFPRINT(platform_write("audioDacConfig : platformAudioDacSetDataFormat Failed\n")); return (status); } /* Enable soft mute control */ status = platformAudioDacSoftMuteCtrl(devId, DAC_CHAN_ALL, config->softMuteEnable); if(status != Platform_EOK) { IFPRINT(platform_write("audioDacConfig : platformAudioDacSoftMuteCtrl Failed\n")); return (status); } /* Set attenuation mode */ status = platformAudioDacSetAttnMode(devId, config->attnMode); if(status != Platform_EOK) { IFPRINT(platform_write("audioDacConfig : platformAudioDacSetAttnMode Failed\n")); return (status); } /* Set De-emphasis control */ status = platformAudioDacDeempCtrl(devId, config->deempCtrl); if(status != Platform_EOK) { IFPRINT(platform_write("audioDacConfig : platformAudioDacDeempCtrl Failed\n")); return (status); } /* Set DAC volume */ status = platformAudioDacSetVolume(devId, DAC_CHAN_ALL, config->volume); if(status != Platform_EOK) { IFPRINT(platform_write("audioDacConfig : platformAudioDacSetVolume Failed\n")); return (status); } return (status); } /** * \brief Initializes DIR module * * This function initializes and configures the DIR modules * on audio daughter card * * \return Platform_EOK on Success or error code */ Platform_STATUS audioDirConfig(void) { Platform_STATUS status; int8_t fsout; #ifdef CHECK_ERROR_STATUS uint32_t timeout; #endif status = platformAudioDirInit(); if(status != Platform_EOK) { IFPRINT(platform_write("audioDirConfig : Audio DIR Configuration Failed!\n")); return (status); } #ifdef CHECK_ERROR_STATUS /* DIR should be in PLL mode. Wait for ERROR signal to be low as DIR is configured for AUTO mode */ timeout = ERROR_STATUS_WAIT_TIMEOUT; while (timeout) { if(!platformAudioDirGetErrStatus()) { IFPRINT(platform_write("audioDirConfig : DIR in PLL Mode\n")); break; } IFPRINT(platform_write("audioDirConfig : Waiting for DIR to Enter PLL Mode...\n")); platform_delay(1000); timeout--; } if(!timeout) { IFPRINT(platform_write("audioDirConfig : DIR is not in PLL Mode!!\n")); return (Platform_EFAIL); } #endif fsout = platformAudioDirGetFsOut(); if(fsout == 2) { IFPRINT(platform_write("audioDirConfig : Out of Range Sampling Frequency\n")); } else if(fsout == 0) { IFPRINT(platform_write("audioDirConfig : Calculated Sampling Frequency Output is 43 kHz–45.2 kHz\n")); } else if(fsout == 1) { IFPRINT(platform_write("audioDirConfig : Calculated Sampling Frequency Output is 46.8 kHz–49.2 kHz\n")); } else if(fsout == 3) { IFPRINT(platform_write("audioDirConfig : Calculated Sampling Frequency Output is 31.2 kHz–32.8 kHz\n")); } else { IFPRINT(platform_write("audioDirConfig : Error in Reading FSOUT status \n")); status = Platform_EFAIL; } return (status); } int alpha_i2c_write(unsigned short, ...); void set_audio_desc(unsigned char ,unsigned char ,unsigned char ,unsigned char ,unsigned char ); void hrptredid(); void hdmi128(); int gret_val=0; int alpha_i2c_write(unsigned short var1, ...) { unsigned short alpha_type,length,temp_var; int i,offset,ret_val; unsigned char cmd[50]; char *s; va_list argp; va_start(argp, var1); alpha_type = var1>> 8; switch(alpha_type) { case 0xca: case 0xc2: case 0xc3: case 0xc4: length = 4; break; case 0xcb: length = 6; break; case 0xcc: length = 8; break; case 0xcd: case 0xc5: length= 8; // temporary - data starts after 8 bytes break; } cmd[0]=length; temp_var=var1; for(i=0;i> 8; temp_var=va_arg(argp, short); } cmd[i+1]= temp_var & 0xff; cmd[i+2]= temp_var >> 8; if(alpha_type == 0xcd) // special processing for variable length { offset=9; s = va_arg(argp, char *); // remaining data is in form of string length = temp_var; // last short indicates data length cmd[0]+=length; for(i=offset;i