Contains the BSP driver for the DISCO_F413ZH board.
Dependents: DISCO_F413ZH-LCD-demo DISCO_F413ZH-touch-screen-demo DISCO_F413ZH-SD-demo DISCO_F413ZH-PSRAM-demo ... more
wm8994.c
00001 /** 00002 ****************************************************************************** 00003 * @file wm8994.c 00004 * @author MCD Application Team 00005 * @version V2.1.0 00006 * @date 22-February-2016 00007 * @brief This file provides the WM8994 Audio Codec driver. 00008 ****************************************************************************** 00009 * @attention 00010 * 00011 * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> 00012 * 00013 * Redistribution and use in source and binary forms, with or without modification, 00014 * are permitted provided that the following conditions are met: 00015 * 1. Redistributions of source code must retain the above copyright notice, 00016 * this list of conditions and the following disclaimer. 00017 * 2. Redistributions in binary form must reproduce the above copyright notice, 00018 * this list of conditions and the following disclaimer in the documentation 00019 * and/or other materials provided with the distribution. 00020 * 3. Neither the name of STMicroelectronics nor the names of its contributors 00021 * may be used to endorse or promote products derived from this software 00022 * without specific prior written permission. 00023 * 00024 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00025 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00026 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00027 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 00028 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00029 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 00030 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00031 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 00032 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 00033 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00034 * 00035 ****************************************************************************** 00036 */ 00037 00038 /* Includes ------------------------------------------------------------------*/ 00039 #include "wm8994.h" 00040 00041 /** @addtogroup BSP 00042 * @{ 00043 */ 00044 00045 /** @addtogroup Components 00046 * @{ 00047 */ 00048 00049 /** @addtogroup wm8994 00050 * @brief This file provides a set of functions needed to drive the 00051 * WM8994 audio codec. 00052 * @{ 00053 */ 00054 00055 /** @defgroup WM8994_Private_Types 00056 * @{ 00057 */ 00058 00059 /** 00060 * @} 00061 */ 00062 00063 /** @defgroup WM8994_Private_Defines 00064 * @{ 00065 */ 00066 /* Uncomment this line to enable verifying data sent to codec after each write 00067 operation (for debug purpose) */ 00068 #if !defined (VERIFY_WRITTENDATA) 00069 /*#define VERIFY_WRITTENDATA*/ 00070 #endif /* VERIFY_WRITTENDATA */ 00071 /** 00072 * @} 00073 */ 00074 00075 /** @defgroup WM8994_Private_Macros 00076 * @{ 00077 */ 00078 00079 /** 00080 * @} 00081 */ 00082 00083 /** @defgroup WM8994_Private_Variables 00084 * @{ 00085 */ 00086 00087 /* Audio codec driver structure initialization */ 00088 AUDIO_DrvTypeDef wm8994_drv = 00089 { 00090 wm8994_Init, 00091 wm8994_DeInit, 00092 wm8994_ReadID, 00093 00094 wm8994_Play, 00095 wm8994_Pause, 00096 wm8994_Resume, 00097 wm8994_Stop, 00098 00099 wm8994_SetFrequency, 00100 wm8994_SetVolume, 00101 wm8994_SetMute, 00102 wm8994_SetOutputMode, 00103 00104 wm8994_Reset 00105 }; 00106 00107 static uint32_t outputEnabled = 0; 00108 static uint32_t inputEnabled = 0; 00109 /** 00110 * @} 00111 */ 00112 00113 /** @defgroup WM8994_Function_Prototypes 00114 * @{ 00115 */ 00116 static uint8_t CODEC_IO_Write(uint8_t Addr, uint16_t Reg, uint16_t Value); 00117 /** 00118 * @} 00119 */ 00120 00121 /** @defgroup WM8994_Private_Functions 00122 * @{ 00123 */ 00124 00125 /** 00126 * @brief Initializes the audio codec and the control interface. 00127 * @param DeviceAddr: Device address on communication Bus. 00128 * @param OutputInputDevice: can be OUTPUT_DEVICE_SPEAKER, OUTPUT_DEVICE_HEADPHONE, 00129 * OUTPUT_DEVICE_BOTH, OUTPUT_DEVICE_AUTO, INPUT_DEVICE_DIGITAL_MICROPHONE_1, 00130 * INPUT_DEVICE_DIGITAL_MICROPHONE_2, INPUT_DEVICE_DIGITAL_MIC1_MIC2, 00131 * INPUT_DEVICE_INPUT_LINE_1 or INPUT_DEVICE_INPUT_LINE_2. 00132 * @param Volume: Initial volume level (from 0 (Mute) to 100 (Max)) 00133 * @param AudioFreq: Audio Frequency 00134 * @retval 0 if correct communication, else wrong communication 00135 */ 00136 uint32_t wm8994_Init(uint16_t DeviceAddr, uint16_t OutputInputDevice, uint8_t Volume, uint32_t AudioFreq) 00137 { 00138 uint32_t counter = 0; 00139 uint16_t output_device = OutputInputDevice & 0xFF; 00140 uint16_t input_device = OutputInputDevice & 0xFF00; 00141 uint16_t power_mgnt_reg_1 = 0; 00142 00143 /* Initialize the Control interface of the Audio Codec */ 00144 AUDIO_IO_Init(); 00145 /* wm8994 Errata Work-Arounds */ 00146 counter += CODEC_IO_Write(DeviceAddr, 0x102, 0x0003); 00147 counter += CODEC_IO_Write(DeviceAddr, 0x817, 0x0000); 00148 counter += CODEC_IO_Write(DeviceAddr, 0x102, 0x0000); 00149 00150 /* Enable VMID soft start (fast), Start-up Bias Current Enabled */ 00151 counter += CODEC_IO_Write(DeviceAddr, 0x39, 0x006C); 00152 00153 /* Enable bias generator, Enable VMID */ 00154 if (input_device > 0) 00155 { 00156 counter += CODEC_IO_Write(DeviceAddr, 0x01, 0x0013); 00157 } 00158 else 00159 { 00160 counter += CODEC_IO_Write(DeviceAddr, 0x01, 0x0003); 00161 } 00162 00163 /* Add Delay */ 00164 AUDIO_IO_Delay(50); 00165 00166 /* Path Configurations for output */ 00167 if (output_device > 0) 00168 { 00169 outputEnabled = 1; 00170 switch (output_device) 00171 { 00172 case OUTPUT_DEVICE_SPEAKER: 00173 /* Enable DAC1 (Left), Enable DAC1 (Right), 00174 Disable DAC2 (Left), Disable DAC2 (Right)*/ 00175 counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0C0C); 00176 00177 /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */ 00178 counter += CODEC_IO_Write(DeviceAddr, 0x601, 0x0000); 00179 00180 /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */ 00181 counter += CODEC_IO_Write(DeviceAddr, 0x602, 0x0000); 00182 00183 /* Disable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */ 00184 counter += CODEC_IO_Write(DeviceAddr, 0x604, 0x0002); 00185 00186 /* Disable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */ 00187 counter += CODEC_IO_Write(DeviceAddr, 0x605, 0x0002); 00188 break; 00189 00190 case OUTPUT_DEVICE_HEADPHONE: 00191 /* Disable DAC1 (Left), Disable DAC1 (Right), 00192 Enable DAC2 (Left), Enable DAC2 (Right)*/ 00193 counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0303); 00194 00195 /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */ 00196 counter += CODEC_IO_Write(DeviceAddr, 0x601, 0x0001); 00197 00198 /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */ 00199 counter += CODEC_IO_Write(DeviceAddr, 0x602, 0x0001); 00200 00201 /* Disable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */ 00202 counter += CODEC_IO_Write(DeviceAddr, 0x604, 0x0000); 00203 00204 /* Disable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */ 00205 counter += CODEC_IO_Write(DeviceAddr, 0x605, 0x0000); 00206 break; 00207 00208 case OUTPUT_DEVICE_BOTH: 00209 if (input_device == INPUT_DEVICE_DIGITAL_MIC1_MIC2) 00210 { 00211 /* Enable DAC1 (Left), Enable DAC1 (Right), 00212 also Enable DAC2 (Left), Enable DAC2 (Right)*/ 00213 counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0303 | 0x0C0C); 00214 00215 /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path 00216 Enable the AIF1 Timeslot 1 (Left) to DAC 1 (Left) mixer path */ 00217 counter += CODEC_IO_Write(DeviceAddr, 0x601, 0x0003); 00218 00219 /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path 00220 Enable the AIF1 Timeslot 1 (Right) to DAC 1 (Right) mixer path */ 00221 counter += CODEC_IO_Write(DeviceAddr, 0x602, 0x0003); 00222 00223 /* Enable the AIF1 Timeslot 0 (Left) to DAC 2 (Left) mixer path 00224 Enable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */ 00225 counter += CODEC_IO_Write(DeviceAddr, 0x604, 0x0003); 00226 00227 /* Enable the AIF1 Timeslot 0 (Right) to DAC 2 (Right) mixer path 00228 Enable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */ 00229 counter += CODEC_IO_Write(DeviceAddr, 0x605, 0x0003); 00230 } 00231 else 00232 { 00233 /* Enable DAC1 (Left), Enable DAC1 (Right), 00234 also Enable DAC2 (Left), Enable DAC2 (Right)*/ 00235 counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0303 | 0x0C0C); 00236 00237 /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */ 00238 counter += CODEC_IO_Write(DeviceAddr, 0x601, 0x0001); 00239 00240 /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */ 00241 counter += CODEC_IO_Write(DeviceAddr, 0x602, 0x0001); 00242 00243 /* Enable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */ 00244 counter += CODEC_IO_Write(DeviceAddr, 0x604, 0x0002); 00245 00246 /* Enable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */ 00247 counter += CODEC_IO_Write(DeviceAddr, 0x605, 0x0002); 00248 } 00249 break; 00250 00251 case OUTPUT_DEVICE_AUTO : 00252 default: 00253 /* Disable DAC1 (Left), Disable DAC1 (Right), 00254 Enable DAC2 (Left), Enable DAC2 (Right)*/ 00255 counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0303); 00256 00257 /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */ 00258 counter += CODEC_IO_Write(DeviceAddr, 0x601, 0x0001); 00259 00260 /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */ 00261 counter += CODEC_IO_Write(DeviceAddr, 0x602, 0x0001); 00262 00263 /* Disable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */ 00264 counter += CODEC_IO_Write(DeviceAddr, 0x604, 0x0000); 00265 00266 /* Disable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */ 00267 counter += CODEC_IO_Write(DeviceAddr, 0x605, 0x0000); 00268 break; 00269 } 00270 } 00271 else 00272 { 00273 outputEnabled = 0; 00274 } 00275 00276 /* Path Configurations for input */ 00277 if (input_device > 0) 00278 { 00279 inputEnabled = 1; 00280 switch (input_device) 00281 { 00282 case INPUT_DEVICE_DIGITAL_MICROPHONE_2 : 00283 /* Enable AIF1ADC2 (Left), Enable AIF1ADC2 (Right) 00284 * Enable DMICDAT2 (Left), Enable DMICDAT2 (Right) 00285 * Enable Left ADC, Enable Right ADC */ 00286 counter += CODEC_IO_Write(DeviceAddr, 0x04, 0x0C30); 00287 00288 /* Enable AIF1 DRC2 Signal Detect & DRC in AIF1ADC2 Left/Right Timeslot 1 */ 00289 counter += CODEC_IO_Write(DeviceAddr, 0x450, 0x00DB); 00290 00291 /* Disable IN1L, IN1R, IN2L, IN2R, Enable Thermal sensor & shutdown */ 00292 counter += CODEC_IO_Write(DeviceAddr, 0x02, 0x6000); 00293 00294 /* Enable the DMIC2(Left) to AIF1 Timeslot 1 (Left) mixer path */ 00295 counter += CODEC_IO_Write(DeviceAddr, 0x608, 0x0002); 00296 00297 /* Enable the DMIC2(Right) to AIF1 Timeslot 1 (Right) mixer path */ 00298 counter += CODEC_IO_Write(DeviceAddr, 0x609, 0x0002); 00299 00300 /* GPIO1 pin configuration GP1_DIR = output, GP1_FN = AIF1 DRC2 signal detect */ 00301 counter += CODEC_IO_Write(DeviceAddr, 0x700, 0x000E); 00302 break; 00303 00304 case INPUT_DEVICE_INPUT_LINE_1 : 00305 /* IN1LN_TO_IN1L, IN1LP_TO_VMID, IN1RN_TO_IN1R, IN1RP_TO_VMID */ 00306 counter += CODEC_IO_Write(DeviceAddr, 0x28, 0x0011); 00307 00308 /* Disable mute on IN1L_TO_MIXINL and +30dB on IN1L PGA output */ 00309 counter += CODEC_IO_Write(DeviceAddr, 0x29, 0x0035); 00310 00311 /* Disable mute on IN1R_TO_MIXINL, Gain = +30dB */ 00312 counter += CODEC_IO_Write(DeviceAddr, 0x2A, 0x0035); 00313 00314 /* Enable AIF1ADC1 (Left), Enable AIF1ADC1 (Right) 00315 * Enable Left ADC, Enable Right ADC */ 00316 counter += CODEC_IO_Write(DeviceAddr, 0x04, 0x0303); 00317 00318 /* Enable AIF1 DRC1 Signal Detect & DRC in AIF1ADC1 Left/Right Timeslot 0 */ 00319 counter += CODEC_IO_Write(DeviceAddr, 0x440, 0x00DB); 00320 00321 /* Enable IN1L and IN1R, Disable IN2L and IN2R, Enable Thermal sensor & shutdown */ 00322 counter += CODEC_IO_Write(DeviceAddr, 0x02, 0x6350); 00323 00324 /* Enable the ADCL(Left) to AIF1 Timeslot 0 (Left) mixer path */ 00325 counter += CODEC_IO_Write(DeviceAddr, 0x606, 0x0002); 00326 00327 /* Enable the ADCR(Right) to AIF1 Timeslot 0 (Right) mixer path */ 00328 counter += CODEC_IO_Write(DeviceAddr, 0x607, 0x0002); 00329 00330 /* GPIO1 pin configuration GP1_DIR = output, GP1_FN = AIF1 DRC1 signal detect */ 00331 counter += CODEC_IO_Write(DeviceAddr, 0x700, 0x000D); 00332 break; 00333 00334 case INPUT_DEVICE_DIGITAL_MICROPHONE_1 : 00335 /* Enable AIF1ADC1 (Left), Enable AIF1ADC1 (Right) 00336 * Enable DMICDAT1 (Left), Enable DMICDAT1 (Right) 00337 * Enable Left ADC, Enable Right ADC */ 00338 counter += CODEC_IO_Write(DeviceAddr, 0x04, 0x030C); 00339 00340 /* Enable AIF1 DRC2 Signal Detect & DRC in AIF1ADC1 Left/Right Timeslot 0 */ 00341 counter += CODEC_IO_Write(DeviceAddr, 0x440, 0x00DB); 00342 00343 /* Disable IN1L, IN1R, IN2L, IN2R, Enable Thermal sensor & shutdown */ 00344 counter += CODEC_IO_Write(DeviceAddr, 0x02, 0x6350); 00345 00346 /* Enable the DMIC2(Left) to AIF1 Timeslot 0 (Left) mixer path */ 00347 counter += CODEC_IO_Write(DeviceAddr, 0x606, 0x0002); 00348 00349 /* Enable the DMIC2(Right) to AIF1 Timeslot 0 (Right) mixer path */ 00350 counter += CODEC_IO_Write(DeviceAddr, 0x607, 0x0002); 00351 00352 /* GPIO1 pin configuration GP1_DIR = output, GP1_FN = AIF1 DRC1 signal detect */ 00353 counter += CODEC_IO_Write(DeviceAddr, 0x700, 0x000D); 00354 break; 00355 case INPUT_DEVICE_DIGITAL_MIC1_MIC2 : 00356 /* Enable AIF1ADC1 (Left), Enable AIF1ADC1 (Right) 00357 * Enable DMICDAT1 (Left), Enable DMICDAT1 (Right) 00358 * Enable Left ADC, Enable Right ADC */ 00359 counter += CODEC_IO_Write(DeviceAddr, 0x04, 0x0F3C); 00360 00361 /* Enable AIF1 DRC2 Signal Detect & DRC in AIF1ADC2 Left/Right Timeslot 1 */ 00362 counter += CODEC_IO_Write(DeviceAddr, 0x450, 0x00DB); 00363 00364 /* Enable AIF1 DRC2 Signal Detect & DRC in AIF1ADC1 Left/Right Timeslot 0 */ 00365 counter += CODEC_IO_Write(DeviceAddr, 0x440, 0x00DB); 00366 00367 /* Disable IN1L, IN1R, Enable IN2L, IN2R, Thermal sensor & shutdown */ 00368 counter += CODEC_IO_Write(DeviceAddr, 0x02, 0x63A0); 00369 00370 /* Enable the DMIC2(Left) to AIF1 Timeslot 0 (Left) mixer path */ 00371 counter += CODEC_IO_Write(DeviceAddr, 0x606, 0x0002); 00372 00373 /* Enable the DMIC2(Right) to AIF1 Timeslot 0 (Right) mixer path */ 00374 counter += CODEC_IO_Write(DeviceAddr, 0x607, 0x0002); 00375 00376 /* Enable the DMIC2(Left) to AIF1 Timeslot 1 (Left) mixer path */ 00377 counter += CODEC_IO_Write(DeviceAddr, 0x608, 0x0002); 00378 00379 /* Enable the DMIC2(Right) to AIF1 Timeslot 1 (Right) mixer path */ 00380 counter += CODEC_IO_Write(DeviceAddr, 0x609, 0x0002); 00381 00382 /* GPIO1 pin configuration GP1_DIR = output, GP1_FN = AIF1 DRC1 signal detect */ 00383 counter += CODEC_IO_Write(DeviceAddr, 0x700, 0x000D); 00384 break; 00385 case INPUT_DEVICE_INPUT_LINE_2 : 00386 default: 00387 /* Actually, no other input devices supported */ 00388 counter++; 00389 break; 00390 } 00391 } 00392 else 00393 { 00394 inputEnabled = 0; 00395 } 00396 00397 /* Clock Configurations */ 00398 switch (AudioFreq) 00399 { 00400 case AUDIO_FREQUENCY_8K: 00401 /* AIF1 Sample Rate = 8 (KHz), ratio=256 */ 00402 counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0003); 00403 break; 00404 00405 case AUDIO_FREQUENCY_16K: 00406 /* AIF1 Sample Rate = 16 (KHz), ratio=256 */ 00407 counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0033); 00408 break; 00409 00410 case AUDIO_FREQUENCY_32K: 00411 /* AIF1 Sample Rate = 32 (KHz), ratio=256 */ 00412 counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0063); 00413 break; 00414 00415 case AUDIO_FREQUENCY_48K: 00416 /* AIF1 Sample Rate = 48 (KHz), ratio=256 */ 00417 counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0083); 00418 break; 00419 00420 case AUDIO_FREQUENCY_96K: 00421 /* AIF1 Sample Rate = 96 (KHz), ratio=256 */ 00422 counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x00A3); 00423 break; 00424 00425 case AUDIO_FREQUENCY_11K: 00426 /* AIF1 Sample Rate = 11.025 (KHz), ratio=256 */ 00427 counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0013); 00428 break; 00429 00430 case AUDIO_FREQUENCY_22K: 00431 /* AIF1 Sample Rate = 22.050 (KHz), ratio=256 */ 00432 counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0043); 00433 break; 00434 00435 case AUDIO_FREQUENCY_44K: 00436 /* AIF1 Sample Rate = 44.1 (KHz), ratio=256 */ 00437 counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0073); 00438 break; 00439 00440 default: 00441 /* AIF1 Sample Rate = 48 (KHz), ratio=256 */ 00442 counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0083); 00443 break; 00444 } 00445 00446 if(input_device == INPUT_DEVICE_DIGITAL_MIC1_MIC2) 00447 { 00448 /* AIF1 Word Length = 16-bits, AIF1 Format = DSP mode */ 00449 counter += CODEC_IO_Write(DeviceAddr, 0x300, 0x4018); 00450 } 00451 else 00452 { 00453 /* AIF1 Word Length = 16-bits, AIF1 Format = I2S (Default Register Value) */ 00454 counter += CODEC_IO_Write(DeviceAddr, 0x300, 0x4010); 00455 } 00456 00457 /* slave mode */ 00458 counter += CODEC_IO_Write(DeviceAddr, 0x302, 0x0000); 00459 00460 /* Enable the DSP processing clock for AIF1, Enable the core clock */ 00461 counter += CODEC_IO_Write(DeviceAddr, 0x208, 0x000A); 00462 00463 /* Enable AIF1 Clock, AIF1 Clock Source = MCLK1 pin */ 00464 counter += CODEC_IO_Write(DeviceAddr, 0x200, 0x0001); 00465 00466 if (output_device > 0) /* Audio output selected */ 00467 { 00468 /* Analog Output Configuration */ 00469 00470 /* Enable SPKRVOL PGA, Enable SPKMIXR, Enable SPKLVOL PGA, Enable SPKMIXL */ 00471 counter += CODEC_IO_Write(DeviceAddr, 0x03, 0x0300); 00472 00473 /* Left Speaker Mixer Volume = 0dB */ 00474 counter += CODEC_IO_Write(DeviceAddr, 0x22, 0x0000); 00475 00476 /* Speaker output mode = Class D, Right Speaker Mixer Volume = 0dB ((0x23, 0x0100) = class AB)*/ 00477 counter += CODEC_IO_Write(DeviceAddr, 0x23, 0x0000); 00478 00479 /* Unmute DAC2 (Left) to Left Speaker Mixer (SPKMIXL) path, 00480 Unmute DAC2 (Right) to Right Speaker Mixer (SPKMIXR) path */ 00481 counter += CODEC_IO_Write(DeviceAddr, 0x36, 0x0300); 00482 00483 /* Enable bias generator, Enable VMID, Enable SPKOUTL, Enable SPKOUTR */ 00484 counter += CODEC_IO_Write(DeviceAddr, 0x01, 0x3003); 00485 00486 /* Headphone/Speaker Enable */ 00487 00488 if (input_device == INPUT_DEVICE_DIGITAL_MIC1_MIC2) 00489 { 00490 /* Enable Class W, Class W Envelope Tracking = AIF1 Timeslots 0 and 1 */ 00491 counter += CODEC_IO_Write(DeviceAddr, 0x51, 0x0205); 00492 } 00493 else 00494 { 00495 /* Enable Class W, Class W Envelope Tracking = AIF1 Timeslot 0 */ 00496 counter += CODEC_IO_Write(DeviceAddr, 0x51, 0x0005); 00497 } 00498 00499 /* Enable bias generator, Enable VMID, Enable HPOUT1 (Left) and Enable HPOUT1 (Right) input stages */ 00500 /* idem for Speaker */ 00501 power_mgnt_reg_1 |= 0x0303 | 0x3003; 00502 counter += CODEC_IO_Write(DeviceAddr, 0x01, power_mgnt_reg_1); 00503 00504 /* Enable HPOUT1 (Left) and HPOUT1 (Right) intermediate stages */ 00505 counter += CODEC_IO_Write(DeviceAddr, 0x60, 0x0022); 00506 00507 /* Enable Charge Pump */ 00508 counter += CODEC_IO_Write(DeviceAddr, 0x4C, 0x9F25); 00509 00510 /* Add Delay */ 00511 AUDIO_IO_Delay(15); 00512 00513 /* Select DAC1 (Left) to Left Headphone Output PGA (HPOUT1LVOL) path */ 00514 counter += CODEC_IO_Write(DeviceAddr, 0x2D, 0x0001); 00515 00516 /* Select DAC1 (Right) to Right Headphone Output PGA (HPOUT1RVOL) path */ 00517 counter += CODEC_IO_Write(DeviceAddr, 0x2E, 0x0001); 00518 00519 /* Enable Left Output Mixer (MIXOUTL), Enable Right Output Mixer (MIXOUTR) */ 00520 /* idem for SPKOUTL and SPKOUTR */ 00521 counter += CODEC_IO_Write(DeviceAddr, 0x03, 0x0030 | 0x0300); 00522 00523 /* Enable DC Servo and trigger start-up mode on left and right channels */ 00524 counter += CODEC_IO_Write(DeviceAddr, 0x54, 0x0033); 00525 00526 /* Add Delay */ 00527 AUDIO_IO_Delay(250); 00528 00529 /* Enable HPOUT1 (Left) and HPOUT1 (Right) intermediate and output stages. Remove clamps */ 00530 counter += CODEC_IO_Write(DeviceAddr, 0x60, 0x00EE); 00531 00532 /* Unmutes */ 00533 00534 /* Unmute DAC 1 (Left) */ 00535 counter += CODEC_IO_Write(DeviceAddr, 0x610, 0x00C0); 00536 00537 /* Unmute DAC 1 (Right) */ 00538 counter += CODEC_IO_Write(DeviceAddr, 0x611, 0x00C0); 00539 00540 /* Unmute the AIF1 Timeslot 0 DAC path */ 00541 counter += CODEC_IO_Write(DeviceAddr, 0x420, 0x0000); 00542 00543 /* Unmute DAC 2 (Left) */ 00544 counter += CODEC_IO_Write(DeviceAddr, 0x612, 0x00C0); 00545 00546 /* Unmute DAC 2 (Right) */ 00547 counter += CODEC_IO_Write(DeviceAddr, 0x613, 0x00C0); 00548 00549 /* Unmute the AIF1 Timeslot 1 DAC2 path */ 00550 counter += CODEC_IO_Write(DeviceAddr, 0x422, 0x0000); 00551 00552 /* Volume Control */ 00553 wm8994_SetVolume(DeviceAddr, Volume); 00554 } 00555 00556 if (input_device > 0) /* Audio input selected */ 00557 { 00558 if ((input_device == INPUT_DEVICE_DIGITAL_MICROPHONE_1) || (input_device == INPUT_DEVICE_DIGITAL_MICROPHONE_2)) 00559 { 00560 /* Enable Microphone bias 1 generator, Enable VMID */ 00561 power_mgnt_reg_1 |= 0x0013; 00562 counter += CODEC_IO_Write(DeviceAddr, 0x01, power_mgnt_reg_1); 00563 00564 /* ADC oversample enable */ 00565 counter += CODEC_IO_Write(DeviceAddr, 0x620, 0x0002); 00566 00567 /* AIF ADC2 HPF enable, HPF cut = voice mode 1 fc=127Hz at fs=8kHz */ 00568 counter += CODEC_IO_Write(DeviceAddr, 0x411, 0x3800); 00569 } 00570 else if(input_device == INPUT_DEVICE_DIGITAL_MIC1_MIC2) 00571 { 00572 /* Enable Microphone bias 1 generator, Enable VMID */ 00573 power_mgnt_reg_1 |= 0x0013; 00574 counter += CODEC_IO_Write(DeviceAddr, 0x01, power_mgnt_reg_1); 00575 00576 /* ADC oversample enable */ 00577 counter += CODEC_IO_Write(DeviceAddr, 0x620, 0x0002); 00578 00579 /* AIF ADC1 HPF enable, HPF cut = voice mode 1 fc=127Hz at fs=8kHz */ 00580 counter += CODEC_IO_Write(DeviceAddr, 0x410, 0x1800); 00581 00582 /* AIF ADC2 HPF enable, HPF cut = voice mode 1 fc=127Hz at fs=8kHz */ 00583 counter += CODEC_IO_Write(DeviceAddr, 0x411, 0x1800); 00584 } 00585 else if ((input_device == INPUT_DEVICE_INPUT_LINE_1) || (input_device == INPUT_DEVICE_INPUT_LINE_2)) 00586 { 00587 00588 /* Disable mute on IN1L, IN1L Volume = +0dB */ 00589 counter += CODEC_IO_Write(DeviceAddr, 0x18, 0x000B); 00590 00591 /* Disable mute on IN1R, IN1R Volume = +0dB */ 00592 counter += CODEC_IO_Write(DeviceAddr, 0x1A, 0x000B); 00593 00594 /* AIF ADC1 HPF enable, HPF cut = hifi mode fc=4Hz at fs=48kHz */ 00595 counter += CODEC_IO_Write(DeviceAddr, 0x410, 0x1800); 00596 } 00597 /* Volume Control */ 00598 wm8994_SetVolume(DeviceAddr, Volume); 00599 } 00600 /* Return communication control value */ 00601 return counter; 00602 } 00603 00604 /** 00605 * @brief Deinitializes the audio codec. 00606 * @param None 00607 * @retval None 00608 */ 00609 void wm8994_DeInit(void) 00610 { 00611 /* Deinitialize Audio Codec interface */ 00612 AUDIO_IO_DeInit(); 00613 } 00614 00615 /** 00616 * @brief Get the WM8994 ID. 00617 * @param DeviceAddr: Device address on communication Bus. 00618 * @retval The WM8994 ID 00619 */ 00620 uint32_t wm8994_ReadID(uint16_t DeviceAddr) 00621 { 00622 /* Initialize the Control interface of the Audio Codec */ 00623 AUDIO_IO_Init(); 00624 00625 return ((uint32_t)AUDIO_IO_Read(DeviceAddr, WM8994_CHIPID_ADDR)); 00626 } 00627 00628 /** 00629 * @brief Start the audio Codec play feature. 00630 * @note For this codec no Play options are required. 00631 * @param DeviceAddr: Device address on communication Bus. 00632 * @retval 0 if correct communication, else wrong communication 00633 */ 00634 uint32_t wm8994_Play(uint16_t DeviceAddr, uint16_t* pBuffer, uint16_t Size) 00635 { 00636 uint32_t counter = 0; 00637 00638 /* Resumes the audio file playing */ 00639 /* Unmute the output first */ 00640 counter += wm8994_SetMute(DeviceAddr, AUDIO_MUTE_OFF); 00641 00642 return counter; 00643 } 00644 00645 /** 00646 * @brief Pauses playing on the audio codec. 00647 * @param DeviceAddr: Device address on communication Bus. 00648 * @retval 0 if correct communication, else wrong communication 00649 */ 00650 uint32_t wm8994_Pause(uint16_t DeviceAddr) 00651 { 00652 uint32_t counter = 0; 00653 00654 /* Pause the audio file playing */ 00655 /* Mute the output first */ 00656 counter += wm8994_SetMute(DeviceAddr, AUDIO_MUTE_ON); 00657 00658 /* Put the Codec in Power save mode */ 00659 counter += CODEC_IO_Write(DeviceAddr, 0x02, 0x01); 00660 00661 return counter; 00662 } 00663 00664 /** 00665 * @brief Resumes playing on the audio codec. 00666 * @param DeviceAddr: Device address on communication Bus. 00667 * @retval 0 if correct communication, else wrong communication 00668 */ 00669 uint32_t wm8994_Resume(uint16_t DeviceAddr) 00670 { 00671 uint32_t counter = 0; 00672 00673 /* Resumes the audio file playing */ 00674 /* Unmute the output first */ 00675 counter += wm8994_SetMute(DeviceAddr, AUDIO_MUTE_OFF); 00676 00677 return counter; 00678 } 00679 00680 /** 00681 * @brief Stops audio Codec playing. It powers down the codec. 00682 * @param DeviceAddr: Device address on communication Bus. 00683 * @param CodecPdwnMode: selects the power down mode. 00684 * - CODEC_PDWN_SW: only mutes the audio codec. When resuming from this 00685 * mode the codec keeps the previous initialization 00686 * (no need to re-Initialize the codec registers). 00687 * - CODEC_PDWN_HW: Physically power down the codec. When resuming from this 00688 * mode, the codec is set to default configuration 00689 * (user should re-Initialize the codec in order to 00690 * play again the audio stream). 00691 * @retval 0 if correct communication, else wrong communication 00692 */ 00693 uint32_t wm8994_Stop(uint16_t DeviceAddr, uint32_t CodecPdwnMode) 00694 { 00695 uint32_t counter = 0; 00696 00697 if (outputEnabled != 0) 00698 { 00699 /* Mute the output first */ 00700 counter += wm8994_SetMute(DeviceAddr, AUDIO_MUTE_ON); 00701 00702 if (CodecPdwnMode == CODEC_PDWN_SW) 00703 { 00704 /* Only output mute required*/ 00705 } 00706 else /* CODEC_PDWN_HW */ 00707 { 00708 /* Mute the AIF1 Timeslot 0 DAC1 path */ 00709 counter += CODEC_IO_Write(DeviceAddr, 0x420, 0x0200); 00710 00711 /* Mute the AIF1 Timeslot 1 DAC2 path */ 00712 counter += CODEC_IO_Write(DeviceAddr, 0x422, 0x0200); 00713 00714 /* Disable DAC1L_TO_HPOUT1L */ 00715 counter += CODEC_IO_Write(DeviceAddr, 0x2D, 0x0000); 00716 00717 /* Disable DAC1R_TO_HPOUT1R */ 00718 counter += CODEC_IO_Write(DeviceAddr, 0x2E, 0x0000); 00719 00720 /* Disable DAC1 and DAC2 */ 00721 counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0000); 00722 00723 /* Reset Codec by writing in 0x0000 address register */ 00724 counter += CODEC_IO_Write(DeviceAddr, 0x0000, 0x0000); 00725 00726 outputEnabled = 0; 00727 } 00728 } 00729 return counter; 00730 } 00731 00732 /** 00733 * @brief Sets higher or lower the codec volume level. 00734 * @param DeviceAddr: Device address on communication Bus. 00735 * @param Volume: a byte value from 0 to 255 (refer to codec registers 00736 * description for more details). 00737 * @retval 0 if correct communication, else wrong communication 00738 */ 00739 uint32_t wm8994_SetVolume(uint16_t DeviceAddr, uint8_t Volume) 00740 { 00741 uint32_t counter = 0; 00742 uint8_t convertedvol = VOLUME_CONVERT(Volume); 00743 00744 /* Output volume */ 00745 if (outputEnabled != 0) 00746 { 00747 if(convertedvol > 0x3E) 00748 { 00749 /* Unmute audio codec */ 00750 counter += wm8994_SetMute(DeviceAddr, AUDIO_MUTE_OFF); 00751 00752 /* Left Headphone Volume */ 00753 counter += CODEC_IO_Write(DeviceAddr, 0x1C, 0x3F | 0x140); 00754 00755 /* Right Headphone Volume */ 00756 counter += CODEC_IO_Write(DeviceAddr, 0x1D, 0x3F | 0x140); 00757 00758 /* Left Speaker Volume */ 00759 counter += CODEC_IO_Write(DeviceAddr, 0x26, 0x3F | 0x140); 00760 00761 /* Right Speaker Volume */ 00762 counter += CODEC_IO_Write(DeviceAddr, 0x27, 0x3F | 0x140); 00763 } 00764 else if (Volume == 0) 00765 { 00766 /* Mute audio codec */ 00767 counter += wm8994_SetMute(DeviceAddr, AUDIO_MUTE_ON); 00768 } 00769 else 00770 { 00771 /* Unmute audio codec */ 00772 counter += wm8994_SetMute(DeviceAddr, AUDIO_MUTE_OFF); 00773 00774 /* Left Headphone Volume */ 00775 counter += CODEC_IO_Write(DeviceAddr, 0x1C, convertedvol | 0x140); 00776 00777 /* Right Headphone Volume */ 00778 counter += CODEC_IO_Write(DeviceAddr, 0x1D, convertedvol | 0x140); 00779 00780 /* Left Speaker Volume */ 00781 counter += CODEC_IO_Write(DeviceAddr, 0x26, convertedvol | 0x140); 00782 00783 /* Right Speaker Volume */ 00784 counter += CODEC_IO_Write(DeviceAddr, 0x27, convertedvol | 0x140); 00785 } 00786 } 00787 00788 /* Input volume */ 00789 if (inputEnabled != 0) 00790 { 00791 convertedvol = VOLUME_IN_CONVERT(Volume); 00792 00793 /* Left AIF1 ADC1 volume */ 00794 counter += CODEC_IO_Write(DeviceAddr, 0x400, convertedvol | 0x100); 00795 00796 /* Right AIF1 ADC1 volume */ 00797 counter += CODEC_IO_Write(DeviceAddr, 0x401, convertedvol | 0x100); 00798 00799 /* Left AIF1 ADC2 volume */ 00800 counter += CODEC_IO_Write(DeviceAddr, 0x404, convertedvol | 0x100); 00801 00802 /* Right AIF1 ADC2 volume */ 00803 counter += CODEC_IO_Write(DeviceAddr, 0x405, convertedvol | 0x100); 00804 } 00805 return counter; 00806 } 00807 00808 /** 00809 * @brief Enables or disables the mute feature on the audio codec. 00810 * @param DeviceAddr: Device address on communication Bus. 00811 * @param Cmd: AUDIO_MUTE_ON to enable the mute or AUDIO_MUTE_OFF to disable the 00812 * mute mode. 00813 * @retval 0 if correct communication, else wrong communication 00814 */ 00815 uint32_t wm8994_SetMute(uint16_t DeviceAddr, uint32_t Cmd) 00816 { 00817 uint32_t counter = 0; 00818 00819 if (outputEnabled != 0) 00820 { 00821 /* Set the Mute mode */ 00822 if(Cmd == AUDIO_MUTE_ON) 00823 { 00824 /* Soft Mute the AIF1 Timeslot 0 DAC1 path L&R */ 00825 counter += CODEC_IO_Write(DeviceAddr, 0x420, 0x0200); 00826 00827 /* Soft Mute the AIF1 Timeslot 1 DAC2 path L&R */ 00828 counter += CODEC_IO_Write(DeviceAddr, 0x422, 0x0200); 00829 } 00830 else /* AUDIO_MUTE_OFF Disable the Mute */ 00831 { 00832 /* Unmute the AIF1 Timeslot 0 DAC1 path L&R */ 00833 counter += CODEC_IO_Write(DeviceAddr, 0x420, 0x0000); 00834 00835 /* Unmute the AIF1 Timeslot 1 DAC2 path L&R */ 00836 counter += CODEC_IO_Write(DeviceAddr, 0x422, 0x0000); 00837 } 00838 } 00839 return counter; 00840 } 00841 00842 /** 00843 * @brief Switch dynamically (while audio file is played) the output target 00844 * (speaker or headphone). 00845 * @param DeviceAddr: Device address on communication Bus. 00846 * @param Output: specifies the audio output target: OUTPUT_DEVICE_SPEAKER, 00847 * OUTPUT_DEVICE_HEADPHONE, OUTPUT_DEVICE_BOTH or OUTPUT_DEVICE_AUTO 00848 * @retval 0 if correct communication, else wrong communication 00849 */ 00850 uint32_t wm8994_SetOutputMode(uint16_t DeviceAddr, uint8_t Output) 00851 { 00852 uint32_t counter = 0; 00853 00854 switch (Output) 00855 { 00856 case OUTPUT_DEVICE_SPEAKER: 00857 /* Enable DAC1 (Left), Enable DAC1 (Right), 00858 Disable DAC2 (Left), Disable DAC2 (Right)*/ 00859 counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0C0C); 00860 00861 /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */ 00862 counter += CODEC_IO_Write(DeviceAddr, 0x601, 0x0000); 00863 00864 /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */ 00865 counter += CODEC_IO_Write(DeviceAddr, 0x602, 0x0000); 00866 00867 /* Disable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */ 00868 counter += CODEC_IO_Write(DeviceAddr, 0x604, 0x0002); 00869 00870 /* Disable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */ 00871 counter += CODEC_IO_Write(DeviceAddr, 0x605, 0x0002); 00872 break; 00873 00874 case OUTPUT_DEVICE_HEADPHONE: 00875 /* Disable DAC1 (Left), Disable DAC1 (Right), 00876 Enable DAC2 (Left), Enable DAC2 (Right)*/ 00877 counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0303); 00878 00879 /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */ 00880 counter += CODEC_IO_Write(DeviceAddr, 0x601, 0x0001); 00881 00882 /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */ 00883 counter += CODEC_IO_Write(DeviceAddr, 0x602, 0x0001); 00884 00885 /* Disable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */ 00886 counter += CODEC_IO_Write(DeviceAddr, 0x604, 0x0000); 00887 00888 /* Disable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */ 00889 counter += CODEC_IO_Write(DeviceAddr, 0x605, 0x0000); 00890 break; 00891 00892 case OUTPUT_DEVICE_BOTH: 00893 /* Enable DAC1 (Left), Enable DAC1 (Right), 00894 also Enable DAC2 (Left), Enable DAC2 (Right)*/ 00895 counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0303 | 0x0C0C); 00896 00897 /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */ 00898 counter += CODEC_IO_Write(DeviceAddr, 0x601, 0x0001); 00899 00900 /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */ 00901 counter += CODEC_IO_Write(DeviceAddr, 0x602, 0x0001); 00902 00903 /* Enable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */ 00904 counter += CODEC_IO_Write(DeviceAddr, 0x604, 0x0002); 00905 00906 /* Enable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */ 00907 counter += CODEC_IO_Write(DeviceAddr, 0x605, 0x0002); 00908 break; 00909 00910 default: 00911 /* Disable DAC1 (Left), Disable DAC1 (Right), 00912 Enable DAC2 (Left), Enable DAC2 (Right)*/ 00913 counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0303); 00914 00915 /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */ 00916 counter += CODEC_IO_Write(DeviceAddr, 0x601, 0x0001); 00917 00918 /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */ 00919 counter += CODEC_IO_Write(DeviceAddr, 0x602, 0x0001); 00920 00921 /* Disable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */ 00922 counter += CODEC_IO_Write(DeviceAddr, 0x604, 0x0000); 00923 00924 /* Disable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */ 00925 counter += CODEC_IO_Write(DeviceAddr, 0x605, 0x0000); 00926 break; 00927 } 00928 return counter; 00929 } 00930 00931 /** 00932 * @brief Sets new frequency. 00933 * @param DeviceAddr: Device address on communication Bus. 00934 * @param AudioFreq: Audio frequency used to play the audio stream. 00935 * @retval 0 if correct communication, else wrong communication 00936 */ 00937 uint32_t wm8994_SetFrequency(uint16_t DeviceAddr, uint32_t AudioFreq) 00938 { 00939 uint32_t counter = 0; 00940 00941 /* Clock Configurations */ 00942 switch (AudioFreq) 00943 { 00944 case AUDIO_FREQUENCY_8K: 00945 /* AIF1 Sample Rate = 8 (KHz), ratio=256 */ 00946 counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0003); 00947 break; 00948 00949 case AUDIO_FREQUENCY_16K: 00950 /* AIF1 Sample Rate = 16 (KHz), ratio=256 */ 00951 counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0033); 00952 break; 00953 00954 case AUDIO_FREQUENCY_48K: 00955 /* AIF1 Sample Rate = 48 (KHz), ratio=256 */ 00956 counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0083); 00957 break; 00958 00959 case AUDIO_FREQUENCY_96K: 00960 /* AIF1 Sample Rate = 96 (KHz), ratio=256 */ 00961 counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x00A3); 00962 break; 00963 00964 case AUDIO_FREQUENCY_11K: 00965 /* AIF1 Sample Rate = 11.025 (KHz), ratio=256 */ 00966 counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0013); 00967 break; 00968 00969 case AUDIO_FREQUENCY_22K: 00970 /* AIF1 Sample Rate = 22.050 (KHz), ratio=256 */ 00971 counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0043); 00972 break; 00973 00974 case AUDIO_FREQUENCY_44K: 00975 /* AIF1 Sample Rate = 44.1 (KHz), ratio=256 */ 00976 counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0073); 00977 break; 00978 00979 default: 00980 /* AIF1 Sample Rate = 48 (KHz), ratio=256 */ 00981 counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0083); 00982 break; 00983 } 00984 return counter; 00985 } 00986 00987 /** 00988 * @brief Resets wm8994 registers. 00989 * @param DeviceAddr: Device address on communication Bus. 00990 * @retval 0 if correct communication, else wrong communication 00991 */ 00992 uint32_t wm8994_Reset(uint16_t DeviceAddr) 00993 { 00994 uint32_t counter = 0; 00995 00996 /* Reset Codec by writing in 0x0000 address register */ 00997 counter = CODEC_IO_Write(DeviceAddr, 0x0000, 0x0000); 00998 outputEnabled = 0; 00999 inputEnabled=0; 01000 01001 return counter; 01002 } 01003 01004 /** 01005 * @brief Writes/Read a single data. 01006 * @param Addr: I2C address 01007 * @param Reg: Reg address 01008 * @param Value: Data to be written 01009 * @retval None 01010 */ 01011 static uint8_t CODEC_IO_Write(uint8_t Addr, uint16_t Reg, uint16_t Value) 01012 { 01013 uint32_t result = 0; 01014 01015 AUDIO_IO_Write(Addr, Reg, Value); 01016 01017 #ifdef VERIFY_WRITTENDATA 01018 /* Verify that the data has been correctly written */ 01019 result = (AUDIO_IO_Read(Addr, Reg) == Value)? 0:1; 01020 #endif /* VERIFY_WRITTENDATA */ 01021 01022 return result; 01023 } 01024 01025 /** 01026 * @} 01027 */ 01028 01029 /** 01030 * @} 01031 */ 01032 01033 /** 01034 * @} 01035 */ 01036 01037 /** 01038 * @} 01039 */ 01040 01041 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Generated on Tue Jul 12 2022 13:54:37 by 1.7.2