stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c
Go to the documentation of this file.
1 
20 /* Includes ------------------------------------------------------------------*/
21 #include "wm8994.h"
22 
40 /* Audio codec driver structure initialization */
42 {
61 };
62 
70 static int32_t WM8994_ReadRegWrap(void *handle, uint16_t Reg, uint8_t* Data, uint16_t Length);
71 static int32_t WM8994_WriteRegWrap(void *handle, uint16_t Reg, uint8_t* Data, uint16_t Length);
72 static int32_t WM8994_Delay(WM8994_Object_t *pObj, uint32_t Delay);
73 
89 {
90  int32_t ret;
91  static uint8_t ColdStartup = 1;
92  uint16_t tmp;
93 
94  /* wm8994 Errata Work-Arounds */
95  tmp = 0x0003;
96  ret = wm8994_write_reg(&pObj->Ctx, 0x102, &tmp, 2);
97  tmp = 0x0000;
98  ret += wm8994_write_reg(&pObj->Ctx, 0x817, &tmp, 2);
99  ret += wm8994_write_reg(&pObj->Ctx, 0x102, &tmp, 2);
100 
101  /* Enable VMID soft start (fast), Start-up Bias Current Enabled: 0x006C at reg 0x39 */
102  /* Bias Enable */
103  tmp = 0x006C;
104  ret += wm8994_write_reg(&pObj->Ctx, WM8994_ANTIPOP2, &tmp, 2);
105 
106  /* Enable bias generator, Enable VMID */
107  if (pInit->InputDevice != WM8994_IN_NONE)
108  {
109  tmp = 0x0013;
110  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_1, &tmp, 2);
111  }
112  else
113  {
114  tmp = 0x0003;
115  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_1, &tmp, 2);
116  }
117 
118  /* Add Delay */
119  (void)WM8994_Delay(pObj, 50);
120 
121  /* Path Configurations for output */
122  switch (pInit->OutputDevice)
123  {
124  case WM8994_OUT_SPEAKER:
125  /* Enable DAC1 (Left), Enable DAC1 (Right),
126  Disable DAC2 (Left), Disable DAC2 (Right)*/
127  tmp = 0x0C0C;
128  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_5, &tmp, 2);
129 
130  /* Disable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */
131  tmp = 0x0000;
132  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_LMR, &tmp, 2);
133 
134  /* Disable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */
135  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_RMR, &tmp, 2);
136 
137  /* Enable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */
138  tmp = 0x0002;
139  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC2_LMR, &tmp, 2);
140 
141  /* Disable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */
142  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC2_RMR, &tmp, 2);
143  break;
144 
145  case WM8994_OUT_HEADPHONE:
146  /* Disable DAC1 (Left), Disable DAC1 (Right),
147  Enable DAC2 (Left), Enable DAC2 (Right)*/
148  tmp = 0x0303;
149  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_5, &tmp, 2);
150 
151  /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */
152  tmp = 0x0001;
153  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_LMR, &tmp, 2);
154 
155  /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */
156  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_RMR, &tmp, 2);
157 
158  /* Disable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */
159  tmp = 0x0000;
160  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC2_LMR, &tmp, 2);
161 
162  /* Disable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */
163  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC2_RMR, &tmp, 2);
164  break;
165 
166  case WM8994_OUT_BOTH:
167  if (pInit->InputDevice == WM8994_IN_MIC1_MIC2)
168  {
169  /* Enable DAC1 (Left), Enable DAC1 (Right),
170  also Enable DAC2 (Left), Enable DAC2 (Right)*/
171  tmp = 0x0F0F;
172  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_5, &tmp, 2);
173 
174  /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path
175  Enable the AIF1 Timeslot 1 (Left) to DAC 1 (Left) mixer path */
176  tmp = 0x0003;
177  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_LMR, &tmp, 2);
178 
179  /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path
180  Enable the AIF1 Timeslot 1 (Right) to DAC 1 (Right) mixer path */
181  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_RMR, &tmp, 2);
182 
183  /* Enable the AIF1 Timeslot 0 (Left) to DAC 2 (Left) mixer path
184  Enable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */
185  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC2_LMR, &tmp, 2);
186 
187  /* Enable the AIF1 Timeslot 0 (Right) to DAC 2 (Right) mixer path
188  Enable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */
189  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC2_RMR, &tmp, 2);
190  }
191  else
192  {
193  /* Enable DAC1 (Left), Enable DAC1 (Right),
194  also Enable DAC2 (Left), Enable DAC2 (Right)*/
195  tmp = 0x0F0F;
196  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_5, &tmp, 2);
197 
198  /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */
199  tmp = 0x0001;
200  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_LMR, &tmp, 2);
201 
202  /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */
203  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_RMR, &tmp, 2);
204 
205  /* Enable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */
206  tmp = 0x0002;
207  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC2_LMR, &tmp, 2);
208 
209  /* Enable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */
210  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC2_RMR, &tmp, 2);
211  }
212  break;
213 
214  case WM8994_OUT_NONE:
215  break;
216  case WM8994_OUT_AUTO :
217  default:
218  /* Disable DAC1 (Left), Disable DAC1 (Right),
219  Enable DAC2 (Left), Enable DAC2 (Right)*/
220  tmp = 0x0303;
221  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_5, &tmp, 2);
222 
223  /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */
224  tmp = 0x0001;
225  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_LMR, &tmp, 2);
226 
227  /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */
228  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_RMR, &tmp, 2);
229 
230  /* Disable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */
231  tmp = 0x0000;
232  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC2_LMR, &tmp, 2);
233 
234  /* Disable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */
235  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC2_RMR, &tmp, 2);
236  break;
237  }
238 
239  /* Path Configurations for input */
240  switch (pInit->InputDevice)
241  {
242  case WM8994_IN_MIC2 :
243  /* Enable AIF1ADC2 (Left), Enable AIF1ADC2 (Right)
244  * Enable DMICDAT2 (Left), Enable DMICDAT2 (Right)
245  * Enable Left ADC, Enable Right ADC */
246  tmp = 0x0C30;
247  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_4, &tmp, 2);
248 
249  /* Enable AIF1 DRC2 Signal Detect & DRC in AIF1ADC2 Left/Right Timeslot 1 */
250  tmp = 0x00DB;
251  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DRC2, &tmp, 2);
252 
253  /* Disable IN1L, IN1R, IN2L, IN2R, Enable Thermal sensor & shutdown */
254  tmp = 0x6000;
255  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_2, &tmp, 2);
256 
257  /* Enable the DMIC2(Left) to AIF1 Timeslot 1 (Left) mixer path */
258  tmp = 0x0002;
259  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_ADC2_LMR, &tmp, 2);
260 
261  /* Enable the DMIC2(Right) to AIF1 Timeslot 1 (Right) mixer path */
262  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_ADC2_RMR, &tmp, 2);
263 
264  /* GPIO1 pin configuration GP1_DIR = output, GP1_FN = AIF1 DRC2 signal detect */
265  tmp = 0x000E;
266  ret += wm8994_write_reg(&pObj->Ctx, WM8994_GPIO1, &tmp, 2);
267  break;
268 
269  case WM8994_IN_LINE1 :
270  /* IN1LN_TO_IN1L, IN1RN_TO_IN1R */
271  tmp = 0x0011;
272  ret += wm8994_write_reg(&pObj->Ctx, WM8994_INPUT_MIXER_2, &tmp, 2);
273 
274  /* Disable mute on IN1L_TO_MIXINL and +30dB on IN1L PGA output */
275  tmp = 0x0035;
276  ret += wm8994_write_reg(&pObj->Ctx, WM8994_INPUT_MIXER_3, &tmp, 2);
277 
278  /* Disable mute on IN1R_TO_MIXINL, Gain = +30dB */
279  ret += wm8994_write_reg(&pObj->Ctx, WM8994_INPUT_MIXER_4, &tmp, 2);
280 
281  /* Enable AIF1ADC1 (Left), Enable AIF1ADC1 (Right)
282  * Enable Left ADC, Enable Right ADC */
283  tmp = 0x0303;
284  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_4, &tmp, 2);
285 
286  /* Enable AIF1 DRC1 Signal Detect & DRC in AIF1ADC1 Left/Right Timeslot 0 */
287  tmp = 0x00DB;
288  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DRC1, &tmp, 2);
289 
290  /* Enable IN1L and IN1R, Disable IN2L and IN2R, Enable Thermal sensor & shutdown */
291  tmp = 0x6350;
292  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_2, &tmp, 2);
293 
294  /* Enable the ADCL(Left) to AIF1 Timeslot 0 (Left) mixer path */
295  tmp = 0x0002;
296  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_ADC1_LMR, &tmp, 2);
297 
298  /* Enable the ADCR(Right) to AIF1 Timeslot 0 (Right) mixer path */
299  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_ADC1_RMR, &tmp, 2);
300 
301  /* GPIO1 pin configuration GP1_DIR = output, GP1_FN = AIF1 DRC1 signal detect */
302  tmp = 0x800D;
303  ret += wm8994_write_reg(&pObj->Ctx, WM8994_GPIO1, &tmp, 2);
304  break;
305 
306  case WM8994_IN_MIC1 :
307  /* Enable AIF1ADC1 (Left), Enable AIF1ADC1 (Right)
308  * Enable DMICDAT1 (Left), Enable DMICDAT1 (Right)
309  * Enable Left ADC, Enable Right ADC */
310  tmp = 0x030C;
311  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_4, &tmp, 2);
312 
313  /* Enable AIF1 DRC1 Signal Detect & DRC in AIF1ADC1 Left/Right Timeslot 0 */
314  tmp = 0x00DB;
315  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DRC1, &tmp, 2);
316 
317  /* Enable IN1L and IN1R, Disable IN2L and IN2R, Enable Thermal sensor & shutdown */
318  tmp = 0x6350;
319  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_2, &tmp, 2);
320 
321  /* Enable the ADCL(Left) to AIF1 Timeslot 0 (Left) mixer path */
322  tmp = 0x0002;
323  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_ADC1_LMR, &tmp, 2);
324 
325  /* Enable the ADCR(Right) to AIF1 Timeslot 0 (Right) mixer path */
326  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_ADC1_RMR, &tmp, 2);
327 
328  /* GPIO1 pin configuration GP1_DIR = output, GP1_FN = AIF1 DRC1 signal detect */
329  tmp = 0x000D;
330  ret += wm8994_write_reg(&pObj->Ctx, WM8994_GPIO1, &tmp, 2);
331  break;
332 
333  case WM8994_IN_MIC1_MIC2 :
334  /* Enable AIF1ADC1 (Left), Enable AIF1ADC1 (Right)
335  * Enable DMICDAT1 (Left), Enable DMICDAT1 (Right)
336  * Enable Left ADC, Enable Right ADC */
337  tmp = 0x0F3C;
338  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_4, &tmp, 2);
339 
340  /* Enable AIF1 DRC2 Signal Detect & DRC in AIF1ADC2 Left/Right Timeslot 1 */
341  tmp = 0x00DB;
342  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DRC2, &tmp, 2);
343 
344  /* Enable AIF1 DRC2 Signal Detect & DRC in AIF1ADC1 Left/Right Timeslot 0 */
345  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DRC1, &tmp, 2);
346 
347  /* Disable IN1L, IN1R, Enable IN2L, IN2R, Thermal sensor & shutdown */
348  tmp = 0x63A0;
349  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_2, &tmp, 2);
350 
351  /* Enable the ADCL(Left) to AIF1 Timeslot 0 (Left) mixer path */
352  tmp = 0x0002;
353  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_ADC1_LMR, &tmp, 2);
354 
355  /* Enable the ADCR(Right) to AIF1 Timeslot 0 (Right) mixer path */
356  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_ADC1_RMR, &tmp, 2);
357 
358  /* Enable the DMIC2(Left) to AIF1 Timeslot 1 (Left) mixer path */
359  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_ADC2_LMR, &tmp, 2);
360 
361  /* Enable the DMIC2(Right) to AIF1 Timeslot 1 (Right) mixer path */
362  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_ADC2_RMR, &tmp, 2);
363 
364  /* GPIO1 pin configuration GP1_DIR = output, GP1_FN = AIF1 DRC1 signal detect */
365  tmp = 0x000D;
366  ret += wm8994_write_reg(&pObj->Ctx, WM8994_GPIO1, &tmp, 2);
367 
368  break;
369  case WM8994_IN_LINE2 :
370  case WM8994_IN_NONE:
371  default:
372  /* Actually, no other input devices supported */
373  break;
374  }
375 
376  /* Clock Configurations */
377  ret += WM8994_SetFrequency(pObj, pInit->Frequency);
378 
379  if(pInit->InputDevice == WM8994_IN_MIC1_MIC2)
380  {
381  /* AIF1 Word Length = 16-bits, AIF1 Format = DSP mode */
384  ret += wm8994_aif1_control1_adcr_src(&pObj->Ctx, 1);
385  }
386  else
387  {
388  /* AIF1 Word Length = 16-bits, AIF1 Format = I2S (Default Register Value) */
389  ret += WM8994_SetResolution(pObj, pInit->Resolution);
391  ret += wm8994_aif1_control1_adcr_src(&pObj->Ctx, 1);
392  }
393 
394  /* slave mode */
395  tmp = 0x0000;
396  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_MASTER_SLAVE, &tmp, 2);
397 
398  /* Enable the DSP processing clock for AIF1, Enable the core clock */
399  tmp = 0x000A;
400  ret += wm8994_write_reg(&pObj->Ctx, WM8994_CLOCKING1, &tmp, 2);
401 
402  /* Enable AIF1 Clock, AIF1 Clock Source = MCLK1 pin */
403  tmp = 0x0001;
404  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_CLOCKING1, &tmp, 2);
405 
406  if (pInit->OutputDevice != WM8994_OUT_NONE) /* Audio output selected */
407  {
408  if ((pInit->OutputDevice == WM8994_OUT_HEADPHONE) && (pInit->InputDevice == WM8994_IN_NONE))
409  {
410  tmp = 0x0100;
411  /* Select DAC1 (Left) to Left Headphone Output PGA (HPOUT1LVOL) path */
412  ret += wm8994_write_reg(&pObj->Ctx, WM8994_OUTPUT_MIXER_1, &tmp, 2);
413 
414  /* Select DAC1 (Right) to Right Headphone Output PGA (HPOUT1RVOL) path */
415  ret += wm8994_write_reg(&pObj->Ctx, WM8994_OUTPUT_MIXER_2, &tmp, 2);
416 
417  /* Startup sequence for Headphone */
418  if(ColdStartup == 1U)
419  {
420  /* Enable/Start the write sequencer */
421  tmp = 0x8100;
422  ret += wm8994_write_reg(&pObj->Ctx, WM8994_WRITE_SEQ_CTRL1, &tmp, 2);
423 
424  ColdStartup=0;
425  /* Add Delay */
426  (void)WM8994_Delay(pObj, 325);
427  }
428  else
429  {
430  /* Headphone Warm Start-Up */
431  tmp = 0x8108;
432  ret += wm8994_write_reg(&pObj->Ctx, WM8994_WRITE_SEQ_CTRL1, &tmp, 2);
433 
434  /* Add Delay */
435  (void)WM8994_Delay(pObj, 50);
436  }
437 
438  /* Soft un-Mute the AIF1 Timeslot 0 DAC1 path L&R */
439  tmp = 0x0000;
440  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_FILTER1, &tmp, 2);
441  }
442  else
443  {
444  /* Analog Output Configuration */
445 
446  /* Enable SPKRVOL PGA, Enable SPKMIXR, Enable SPKLVOL PGA, Enable SPKMIXL */
447  tmp = 0x0300;
448  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_3, &tmp, 2);
449 
450  /* Left Speaker Mixer Volume = 0dB */
451  tmp = 0x0000;
452  ret += wm8994_write_reg(&pObj->Ctx, WM8994_SPKMIXL_ATT, &tmp, 2);
453 
454  /* Speaker output mode = Class D, Right Speaker Mixer Volume = 0dB ((0x23, 0x0100) = class AB)*/
455  ret += wm8994_write_reg(&pObj->Ctx, WM8994_SPKMIXR_ATT, &tmp, 2);
456 
457  /* Unmute DAC2 (Left) to Left Speaker Mixer (SPKMIXL) path,
458  Unmute DAC2 (Right) to Right Speaker Mixer (SPKMIXR) path */
459  tmp = 0x0300;
460  ret += wm8994_write_reg(&pObj->Ctx, WM8994_SPEAKER_MIXER, &tmp, 2);
461 
462  /* Enable bias generator, Enable VMID, Enable SPKOUTL, Enable SPKOUTR */
463  tmp = 0x3003;
464  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_1, &tmp, 2);
465  /* Headphone/Speaker Enable */
466 
467  if (pInit->InputDevice == WM8994_IN_MIC1_MIC2)
468  {
469  /* Enable Class W, Class W Envelope Tracking = AIF1 Timeslots 0 and 1 */
470  tmp = 0x0205;
471  ret += wm8994_write_reg(&pObj->Ctx, WM8994_CLASS_W, &tmp, 2);
472  }
473  else
474  {
475  /* Enable Class W, Class W Envelope Tracking = AIF1 Timeslot 0 */
476  tmp = 0x0005;
477  ret += wm8994_write_reg(&pObj->Ctx, WM8994_CLASS_W, &tmp, 2);
478  }
479 
480  /* Enable bias generator, Enable VMID, Enable HPOUT1 (Left) and Enable HPOUT1 (Right) input stages */
481  /* idem for Speaker */
482  tmp = 0x3303;
483  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_1, &tmp, 2);
484 
485  /* Enable HPOUT1 (Left) and HPOUT1 (Right) intermediate stages */
486  tmp = 0x0022;
487  ret += wm8994_write_reg(&pObj->Ctx, WM8994_ANALOG_HP, &tmp, 2);
488 
489  /* Enable Charge Pump */
490  tmp = 0x9F25;
491  ret += wm8994_write_reg(&pObj->Ctx, WM8994_CHARGE_PUMP1, &tmp, 2);
492 
493  /* Add Delay */
494  (void)WM8994_Delay(pObj, 15);
495 
496  tmp = 0x0001;
497  /* Select DAC1 (Left) to Left Headphone Output PGA (HPOUT1LVOL) path */
498  ret += wm8994_write_reg(&pObj->Ctx, WM8994_OUTPUT_MIXER_1, &tmp, 2);
499 
500  /* Select DAC1 (Right) to Right Headphone Output PGA (HPOUT1RVOL) path */
501  ret += wm8994_write_reg(&pObj->Ctx, WM8994_OUTPUT_MIXER_2, &tmp, 2);
502 
503  /* Enable Left Output Mixer (MIXOUTL), Enable Right Output Mixer (MIXOUTR) */
504  /* idem for SPKOUTL and SPKOUTR */
505  tmp = 0x0330;
506  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_3, &tmp, 2);
507 
508  /* Enable DC Servo and trigger start-up mode on left and right channels */
509  tmp = 0x0033;
510  ret += wm8994_write_reg(&pObj->Ctx, WM8994_DC_SERVO1, &tmp, 2);
511 
512  /* Add Delay */
513  (void)WM8994_Delay(pObj, 257);
514 
515  /* Enable HPOUT1 (Left) and HPOUT1 (Right) intermediate and output stages. Remove clamps */
516  tmp = 0x00EE;
517  ret += wm8994_write_reg(&pObj->Ctx, WM8994_ANALOG_HP, &tmp, 2);
518  }
519 
520  /* Unmutes */
521 
522  /* Unmute DAC 1 (Left) */
523  tmp = 0x00C0;
524  ret += wm8994_write_reg(&pObj->Ctx, WM8994_DAC1_LEFT_VOL, &tmp, 2);
525 
526  /* Unmute DAC 1 (Right) */
527  ret += wm8994_write_reg(&pObj->Ctx, WM8994_DAC1_RIGHT_VOL, &tmp, 2);
528 
529  /* Unmute the AIF1 Timeslot 0 DAC path */
530  tmp = 0x0010;
531  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_FILTER1, &tmp, 2);
532 
533  /* Unmute DAC 2 (Left) */
534  tmp = 0x00C0;
535  ret += wm8994_write_reg(&pObj->Ctx, WM8994_DAC2_LEFT_VOL, &tmp, 2);
536 
537  /* Unmute DAC 2 (Right) */
538  ret += wm8994_write_reg(&pObj->Ctx, WM8994_DAC2_RIGHT_VOL, &tmp, 2);
539 
540  /* Unmute the AIF1 Timeslot 1 DAC2 path */
541  tmp = 0x0010;
542  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC2_FILTER1, &tmp, 2);
543 
544  /* Volume Control */
545  ret += WM8994_SetVolume(pObj, VOLUME_OUTPUT, (uint8_t)pInit->Volume);
546  }
547 
548  if (pInit->InputDevice != WM8994_IN_NONE) /* Audio input selected */
549  {
550  if ((pInit->InputDevice == WM8994_IN_MIC1) || (pInit->InputDevice == WM8994_IN_MIC2))
551  {
552  /* Enable Microphone bias 1 generator, Enable VMID */
553  tmp = 0x0013;
554  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_1, &tmp, 2);
555 
556  /* ADC oversample enable */
557  tmp = 0x0002;
558  ret += wm8994_write_reg(&pObj->Ctx, WM8994_OVERSAMPLING, &tmp, 2);
559 
560  /* AIF ADC2 HPF enable, HPF cut = voice mode 1 fc=127Hz at fs=8kHz */
561  tmp = 0x3800;
562  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_ADC2_FILTERS, &tmp, 2);
563  }
564  else if(pInit->InputDevice == WM8994_IN_MIC1_MIC2)
565  {
566  /* Enable Microphone bias 1 generator, Enable VMID */
567  tmp = 0x0013;
568  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_1, &tmp, 2);
569 
570  /* ADC oversample enable */
571  tmp = 0x0002;
572  ret += wm8994_write_reg(&pObj->Ctx, WM8994_OVERSAMPLING, &tmp, 2);
573 
574  /* AIF ADC1 HPF enable, HPF cut = voice mode 1 fc=127Hz at fs=8kHz */
575  tmp = 0x1800;
576  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_ADC1_FILTERS, &tmp, 2);
577 
578  /* AIF ADC2 HPF enable, HPF cut = voice mode 1 fc=127Hz at fs=8kHz */
579  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_ADC2_FILTERS, &tmp, 2);
580  }
581  else /* ((pInit->InputDevice == WM8994_IN_LINE1) || (pInit->InputDevice == WM8994_IN_LINE2)) */
582  {
583  /* Disable mute on IN1L, IN1L Volume = +0dB */
584  tmp = 0x000B;
585  ret += wm8994_write_reg(&pObj->Ctx, WM8994_LEFT_LINE_IN12_VOL, &tmp, 2);
586 
587  /* Disable mute on IN1R, IN1R Volume = +0dB */
588  ret += wm8994_write_reg(&pObj->Ctx, WM8994_RIGHT_LINE_IN12_VOL, &tmp, 2);
589 
590  /* AIF ADC1 HPF enable, HPF cut = voice mode 1 fc=127Hz at fs=8kHz */
591  tmp = 0x1800;
592  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_ADC1_FILTERS, &tmp, 2);
593  }
594  /* Volume Control */
595  ret += WM8994_SetVolume(pObj, VOLUME_INPUT, (uint8_t)pInit->Volume);
596  }
597 
598  if(ret != WM8994_OK)
599  {
600  ret = WM8994_ERROR;
601  }
602 
603  return ret;
604 }
605 
612 {
613  /* De-Initialize Audio Codec interface */
614  return WM8994_Stop(pObj, WM8994_PDWN_HW);
615 }
616 
623 int32_t WM8994_ReadID(WM8994_Object_t *pObj, uint32_t *Id)
624 {
625  int32_t ret;
626  uint16_t wm8994_id;
627 
628  /* Initialize the Control interface of the Audio Codec */
629  pObj->IO.Init();
630  /* Get ID from component */
631  ret = wm8994_sw_reset_r(&pObj->Ctx, &wm8994_id);
632 
633  *Id = wm8994_id;
634 
635  return ret;
636 }
637 
645 {
646  /* Resumes the audio file playing */
647  /* Unmute the output first */
648  return WM8994_SetMute(pObj, WM8994_MUTE_OFF);
649 }
650 
657 {
658  int32_t ret;
659  uint16_t tmp = 0x0001;
660 
661  /* Pause the audio file playing */
662  /* Mute the output first */
664  {
665  ret = WM8994_ERROR;
666  }/* Put the Codec in Power save mode */
667  else if(wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_2, &tmp, 2) != WM8994_OK)
668  {
669  ret = WM8994_ERROR;
670  }
671  else
672  {
673  ret = WM8994_OK;
674  }
675 
676  return ret;
677 }
678 
685 {
686  /* Resumes the audio file playing */
687  /* Unmute the output first */
688  return WM8994_SetMute(pObj, WM8994_MUTE_OFF);
689 }
690 
704 int32_t WM8994_Stop(WM8994_Object_t *pObj, uint32_t CodecPdwnMode)
705 {
706  int32_t ret;
707  uint16_t tmp;
708 
709  /* Mute the output first */
710  ret = WM8994_SetMute(pObj, WM8994_MUTE_ON);
711 
712  if (CodecPdwnMode == WM8994_PDWN_SW)
713  {
714  /* Only output mute required*/
715  }
716  else /* WM8994_PDWN_HW */
717  {
718  tmp = 0x0200;
719  /* Mute the AIF1 Timeslot 0 DAC1 path */
720  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_FILTER1, &tmp, 2);
721 
722  /* Mute the AIF1 Timeslot 1 DAC2 path */
723  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC2_FILTER1, &tmp, 2);
724 
725  tmp = 0x0000;
726  /* Disable DAC1L_TO_HPOUT1L */
727  ret += wm8994_write_reg(&pObj->Ctx, WM8994_OUTPUT_MIXER_1, &tmp, 2);
728 
729  /* Disable DAC1R_TO_HPOUT1R */
730  ret += wm8994_write_reg(&pObj->Ctx, WM8994_OUTPUT_MIXER_2, &tmp, 2);
731 
732  /* Disable DAC1 and DAC2 */
733  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_5, &tmp, 2);
734 
735  /* Reset Codec by writing in 0x0000 address register */
736  ret += wm8994_write_reg(&pObj->Ctx, WM8994_SW_RESET, &tmp, 2);
737  }
738 
739  if(ret != WM8994_OK)
740  {
741  ret = WM8994_ERROR;
742  }
743 
744  return ret;
745 }
746 
755 int32_t WM8994_SetVolume(WM8994_Object_t *pObj, uint32_t InputOutput, uint8_t Volume)
756 {
757  int32_t ret;
758  uint16_t tmp;
759 
760  /* Output volume */
761  if (InputOutput == VOLUME_OUTPUT)
762  {
763  if(Volume > 0x3EU)
764  {
765  /* Unmute audio codec */
766  ret = WM8994_SetMute(pObj, WM8994_MUTE_OFF);
767  tmp = 0x3FU | 0x140U;
768 
769  /* Left Headphone Volume */
770  ret += wm8994_write_reg(&pObj->Ctx, WM8994_LEFT_OUTPUT_VOL, &tmp, 2);
771 
772  /* Right Headphone Volume */
773  ret += wm8994_write_reg(&pObj->Ctx, WM8994_RIGHT_OUTPUT_VOL, &tmp, 2);
774 
775  /* Left Speaker Volume */
776  ret += wm8994_write_reg(&pObj->Ctx, WM8994_SPK_LEFT_VOL, &tmp, 2);
777 
778  /* Right Speaker Volume */
779  ret += wm8994_write_reg(&pObj->Ctx, WM8994_SPK_RIGHT_VOL, &tmp, 2);
780  }
781  else if (Volume == 0U)
782  {
783  /* Mute audio codec */
784  ret = WM8994_SetMute(pObj, WM8994_MUTE_ON);
785  }
786  else
787  {
788  /* Unmute audio codec */
789  ret = WM8994_SetMute(pObj, WM8994_MUTE_OFF);
790 
791  tmp = Volume | 0x140U;
792 
793  /* Left Headphone Volume */
794  ret += wm8994_write_reg(&pObj->Ctx, WM8994_LEFT_OUTPUT_VOL, &tmp, 2);
795 
796  /* Right Headphone Volume */
797  ret += wm8994_write_reg(&pObj->Ctx, WM8994_RIGHT_OUTPUT_VOL, &tmp, 2);
798 
799  /* Left Speaker Volume */
800  ret += wm8994_write_reg(&pObj->Ctx, WM8994_SPK_LEFT_VOL, &tmp, 2);
801 
802  /* Right Speaker Volume */
803  ret += wm8994_write_reg(&pObj->Ctx, WM8994_SPK_RIGHT_VOL, &tmp, 2);
804  }
805  }
806  else /* Input volume: VOLUME_INPUT */
807  {
808  tmp = Volume | 0x100U;
809 
810  /* Left AIF1 ADC1 volume */
811  ret = wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_ADC1_LEFT_VOL, &tmp, 2);
812 
813  /* Right AIF1 ADC1 volume */
814  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_ADC1_RIGHT_VOL, &tmp, 2);
815 
816  /* Left AIF1 ADC2 volume */
817  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_ADC2_LEFT_VOL, &tmp, 2);
818 
819  /* Right AIF1 ADC2 volume */
820  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_ADC2_RIGHT_VOL, &tmp, 2);
821  }
822 
823  if(ret != WM8994_OK)
824  {
825  ret = WM8994_ERROR;
826  }
827 
828  return ret;
829 }
830 
838 int32_t WM8994_GetVolume(WM8994_Object_t *pObj, uint32_t InputOutput, uint8_t *Volume)
839 {
840  int32_t ret = WM8994_OK;
841  uint16_t invertedvol;
842 
843  /* Output volume */
844  if (InputOutput == VOLUME_OUTPUT)
845  {
846  if(wm8994_lo_hpout1l_vol_r(&pObj->Ctx, &invertedvol) != WM8994_OK)
847  {
848  ret = WM8994_ERROR;
849  }
850  else
851  {
852  *Volume = VOLUME_OUT_INVERT(invertedvol);
853  }
854  }
855  else /* Input volume: VOLUME_INPUT */
856  {
857  if(wm8994_aif1_adc1_left_vol_adc1l_r(&pObj->Ctx, &invertedvol) != WM8994_OK)
858  {
859  ret = WM8994_ERROR;
860  }
861  else
862  {
863  *Volume = VOLUME_IN_INVERT(invertedvol);
864  }
865  }
866 
867  return ret;
868 }
869 
877 int32_t WM8994_SetMute(WM8994_Object_t *pObj, uint32_t Cmd)
878 {
879  int32_t ret;
880  uint16_t tmp;
881 
882  /* Set the Mute mode */
883  if(Cmd == WM8994_MUTE_ON)
884  {
885  tmp = 0x0200;
886  /* Soft Mute the AIF1 Timeslot 0 DAC1 path L&R */
887  ret = wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_FILTER1, &tmp, 2);
888 
889  /* Soft Mute the AIF1 Timeslot 1 DAC2 path L&R */
890  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC2_FILTER1, &tmp, 2);
891  }
892  else /* WM8994_MUTE_OFF Disable the Mute */
893  {
894  tmp = 0x0010;
895  /* Unmute the AIF1 Timeslot 0 DAC1 path L&R */
896  ret = wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_FILTER1, &tmp, 2);
897 
898  /* Unmute the AIF1 Timeslot 1 DAC2 path L&R */
899  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC2_FILTER1, &tmp, 2);
900  }
901 
902  if(ret != WM8994_OK)
903  {
904  ret = WM8994_ERROR;
905  }
906 
907  return ret;
908 }
909 
918 int32_t WM8994_SetOutputMode(WM8994_Object_t *pObj, uint32_t Output)
919 {
920  int32_t ret;
921  uint16_t tmp;
922 
924  {
925  /* Disable bias generator, Enable VMID, Enable SPKOUTL, Enable SPKOUTR */
926  tmp = 0x0000;
927  ret = wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_1, &tmp, 2);
928 
929  /* Disable DAC1 (Left), Disable DAC1 (Right),
930  Enable DAC2 (Left), Enable DAC2 (Right)*/
931  tmp = 0x0303;
932  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_5, &tmp, 2);
933 
934  /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */
935  tmp = 0x0001;
936  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_LMR, &tmp, 2);
937 
938  /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */
939  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_RMR, &tmp, 2);
940 
941  /* Disable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */
942  tmp = 0x0000;
943  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC2_LMR, &tmp, 2);
944 
945  /* Disable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */
946  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC2_RMR, &tmp, 2);
947 
948  /* Select DAC1 (Left) to Left Headphone Output PGA (HPOUT1LVOL) path */
949  tmp = 0x0100;
950  ret += wm8994_write_reg(&pObj->Ctx, WM8994_OUTPUT_MIXER_1, &tmp, 2);
951 
952  /* Select DAC1 (Right) to Right Headphone Output PGA (HPOUT1RVOL) path */
953  ret += wm8994_write_reg(&pObj->Ctx, WM8994_OUTPUT_MIXER_2, &tmp, 2);
954 
955  /* Startup sequence for Headphone */
956  /* Enable/Start the write sequencer */
957  tmp = 0x8100;
958  ret += wm8994_write_reg(&pObj->Ctx, WM8994_WRITE_SEQ_CTRL1, &tmp, 2);
959 
960  /* Add Delay */
961  (void)WM8994_Delay(pObj, 300);
962 
963  /* Soft un-Mute the AIF1 Timeslot 0 DAC1 path L&R */
964  tmp = 0x0000;
965  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_FILTER1, &tmp, 2);
966  }
967  else
968  {
969  switch (Output)
970  {
971  case WM8994_OUT_SPEAKER:
972  /* Enable DAC1 (Left), Enable DAC1 (Right),
973  Disable DAC2 (Left), Disable DAC2 (Right)*/
974  tmp = 0x0C0C;
975  ret = wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_5, &tmp, 2);
976 
977  /* Disable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */
978  tmp = 0x0000;
979  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_LMR, &tmp, 2);
980 
981  /* Disable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */
982  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_RMR, &tmp, 2);
983 
984  /* Enable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */
985  tmp = 0x0002;
986  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC2_LMR, &tmp, 2);
987 
988  /* Disable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */
989  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC2_RMR, &tmp, 2);
990  break;
991 
992  case WM8994_OUT_BOTH:
993  default:
994  /* Enable DAC1 (Left), Enable DAC1 (Right),
995  also Enable DAC2 (Left), Enable DAC2 (Right)*/
996  tmp = 0x0F0F;
997  ret = wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_5, &tmp, 2);
998 
999  /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */
1000  tmp = 0x0001;
1001  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_LMR, &tmp, 2);
1002 
1003  /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */
1004  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC1_RMR, &tmp, 2);
1005 
1006  /* Enable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */
1007  tmp = 0x0002;
1008  ret += wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_DAC2_LMR, &tmp, 2);
1009  break;
1010  }
1011 
1012  /* Enable SPKRVOL PGA, Enable SPKMIXR, Enable SPKLVOL PGA, Enable SPKMIXL */
1013  tmp = 0x0300;
1014  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_3, &tmp, 2);
1015 
1016  /* Left Speaker Mixer Volume = 0dB */
1017  tmp = 0x0000;
1018  ret += wm8994_write_reg(&pObj->Ctx, WM8994_SPKMIXL_ATT, &tmp, 2);
1019 
1020  /* Speaker output mode = Class D, Right Speaker Mixer Volume = 0dB ((0x23, 0x0100) = class AB)*/
1021  ret += wm8994_write_reg(&pObj->Ctx, WM8994_SPKMIXR_ATT, &tmp, 2);
1022 
1023  /* Unmute DAC2 (Left) to Left Speaker Mixer (SPKMIXL) path,
1024  Unmute DAC2 (Right) to Right Speaker Mixer (SPKMIXR) path */
1025  tmp = 0x0300;
1026  ret += wm8994_write_reg(&pObj->Ctx, WM8994_SPEAKER_MIXER, &tmp, 2);
1027 
1028  /* Enable bias generator, Enable VMID, Enable SPKOUTL, Enable SPKOUTR */
1029  tmp = 0x3003;
1030  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_1, &tmp, 2);
1031  /* Headphone/Speaker Enable */
1032 
1033  /* Enable Class W, Class W Envelope Tracking = AIF1 Timeslot 0 */
1034  tmp = 0x0005;
1035  ret += wm8994_write_reg(&pObj->Ctx, WM8994_CLASS_W, &tmp, 2);
1036 
1037  /* Enable bias generator, Enable VMID, Enable HPOUT1 (Left) and Enable HPOUT1 (Right) input stages */
1038  /* idem for Speaker */
1039  tmp = 0x3303;
1040  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_1, &tmp, 2);
1041 
1042  /* Enable HPOUT1 (Left) and HPOUT1 (Right) intermediate stages */
1043  tmp = 0x0022;
1044  ret += wm8994_write_reg(&pObj->Ctx, WM8994_ANALOG_HP, &tmp, 2);
1045 
1046  /* Enable Charge Pump */
1047  tmp = 0x9F25;
1048  ret += wm8994_write_reg(&pObj->Ctx, WM8994_CHARGE_PUMP1, &tmp, 2);
1049 
1050  /* Add Delay */
1051  (void)WM8994_Delay(pObj, 15);
1052 
1053  /* Select DAC1 (Left) to Left Headphone Output PGA (HPOUT1LVOL) path */
1054  tmp = 0x0001;
1055  ret += wm8994_write_reg(&pObj->Ctx, WM8994_OUTPUT_MIXER_1, &tmp, 2);
1056 
1057  /* Select DAC1 (Right) to Right Headphone Output PGA (HPOUT1RVOL) path */
1058  ret += wm8994_write_reg(&pObj->Ctx, WM8994_OUTPUT_MIXER_2, &tmp, 2);
1059 
1060  /* Enable Left Output Mixer (MIXOUTL), Enable Right Output Mixer (MIXOUTR) */
1061  /* idem for SPKOUTL and SPKOUTR */
1062  tmp = 0x0330;
1063  ret += wm8994_write_reg(&pObj->Ctx, WM8994_PWR_MANAGEMENT_3, &tmp, 2);
1064 
1065  /* Enable DC Servo and trigger start-up mode on left and right channels */
1066  tmp = 0x0033;
1067  ret += wm8994_write_reg(&pObj->Ctx, WM8994_DC_SERVO1, &tmp, 2);
1068 
1069  /* Add Delay */
1070  (void)WM8994_Delay(pObj, 257);
1071 
1072  /* Enable HPOUT1 (Left) and HPOUT1 (Right) intermediate and output stages. Remove clamps */
1073  tmp = 0x00EE;
1074  ret += wm8994_write_reg(&pObj->Ctx, WM8994_ANALOG_HP, &tmp, 2);
1075  }
1076 
1077  if(ret != WM8994_OK)
1078  {
1079  ret = WM8994_ERROR;
1080  }
1081 
1082  return ret;
1083 }
1084 
1093 int32_t WM8994_SetResolution(WM8994_Object_t *pObj, uint32_t Resolution)
1094 {
1095  int32_t ret = WM8994_OK;
1096 
1097  if(wm8994_aif1_control1_wl(&pObj->Ctx, (uint16_t)Resolution) != WM8994_OK)
1098  {
1099  ret = WM8994_ERROR;
1100  }
1101 
1102  return ret;
1103 }
1104 
1110 int32_t WM8994_GetResolution(WM8994_Object_t *pObj, uint32_t *Resolution)
1111 {
1112  int32_t ret = WM8994_OK;
1113  uint16_t resolution = 0;
1114 
1115  if(wm8994_aif1_control1_wl_r(&pObj->Ctx, &resolution) != WM8994_OK)
1116  {
1117  ret = WM8994_ERROR;
1118  }
1119  else
1120  {
1121  switch(resolution)
1122  {
1123  case 0:
1124  *Resolution = WM8994_RESOLUTION_16b;
1125  break;
1126  case 1:
1127  *Resolution = WM8994_RESOLUTION_20b;
1128  break;
1129  case 2:
1130  *Resolution = WM8994_RESOLUTION_24b;
1131  break;
1132  case 3:
1133  *Resolution = WM8994_RESOLUTION_32b;
1134  break;
1135  default:
1136  *Resolution = WM8994_RESOLUTION_16b;
1137  break;
1138  }
1139  }
1140 
1141  return ret;
1142 }
1143 
1152 int32_t WM8994_SetProtocol(WM8994_Object_t *pObj, uint32_t Protocol)
1153 {
1154  int32_t ret = WM8994_OK;
1155 
1156  if(wm8994_aif1_control1_fmt(&pObj->Ctx, (uint16_t)Protocol) != WM8994_OK)
1157  {
1158  ret = WM8994_ERROR;
1159  }
1160 
1161  return ret;
1162 }
1163 
1169 int32_t WM8994_GetProtocol(WM8994_Object_t *pObj, uint32_t *Protocol)
1170 {
1171  int32_t ret = WM8994_OK;
1172  uint16_t protocol;
1173 
1174  if(wm8994_aif1_control1_fmt_r(&pObj->Ctx, &protocol) != WM8994_OK)
1175  {
1176  ret = WM8994_ERROR;
1177  }
1178  else
1179  {
1180  *Protocol = protocol;
1181  }
1182 
1183  return ret;
1184 }
1185 
1192 int32_t WM8994_SetFrequency(WM8994_Object_t *pObj, uint32_t AudioFreq)
1193 {
1194  int32_t ret;
1195  uint16_t tmp;
1196 
1197  switch (AudioFreq)
1198  {
1199  case WM8994_FREQUENCY_8K:
1200  /* AIF1 Sample Rate = 8 (KHz), ratio=256 */
1201  tmp = 0x0003;
1202  ret = wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_RATE, &tmp, 2);
1203  break;
1204 
1205  case WM8994_FREQUENCY_16K:
1206  /* AIF1 Sample Rate = 16 (KHz), ratio=256 */
1207  tmp = 0x0033;
1208  ret = wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_RATE, &tmp, 2);
1209  break;
1210 
1211  case WM8994_FREQUENCY_32K:
1212  /* AIF1 Sample Rate = 32 (KHz), ratio=256 */
1213  tmp = 0x0063;
1214  ret = wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_RATE, &tmp, 2);
1215  break;
1216 
1217  case WM8994_FREQUENCY_96K:
1218  /* AIF1 Sample Rate = 96 (KHz), ratio=256 */
1219  tmp = 0x00A3;
1220  ret = wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_RATE, &tmp, 2);
1221  break;
1222 
1223  case WM8994_FREQUENCY_11K:
1224  /* AIF1 Sample Rate = 11.025 (KHz), ratio=256 */
1225  tmp = 0x0013;
1226  ret = wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_RATE, &tmp, 2);
1227  break;
1228 
1229  case WM8994_FREQUENCY_22K:
1230  /* AIF1 Sample Rate = 22.050 (KHz), ratio=256 */
1231  tmp = 0x0043;
1232  ret = wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_RATE, &tmp, 2);
1233  break;
1234 
1235  case WM8994_FREQUENCY_44K:
1236  /* AIF1 Sample Rate = 44.1 (KHz), ratio=256 */
1237  tmp = 0x0073;
1238  ret = wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_RATE, &tmp, 2);
1239  break;
1240 
1241  case WM8994_FREQUENCY_48K:
1242  default:
1243  /* AIF1 Sample Rate = 48 (KHz), ratio=256 */
1244  tmp = 0x0083;
1245  ret = wm8994_write_reg(&pObj->Ctx, WM8994_AIF1_RATE, &tmp, 2);
1246  break;
1247  }
1248 
1249  return ret;
1250 }
1251 
1258 int32_t WM8994_GetFrequency(WM8994_Object_t *pObj, uint32_t *AudioFreq)
1259 {
1260  int32_t ret = WM8994_OK;
1261  uint16_t freq = 0;
1262 
1263  if(wm8994_aif1_sr_r(&pObj->Ctx, &freq) != WM8994_OK)
1264  {
1265  ret = WM8994_ERROR;
1266  }
1267  else
1268  {
1269  switch(freq)
1270  {
1271  case 0:
1272  *AudioFreq = WM8994_FREQUENCY_8K;
1273  break;
1274  case 1:
1275  *AudioFreq = WM8994_FREQUENCY_11K;
1276  break;
1277  case 3:
1278  *AudioFreq = WM8994_FREQUENCY_16K;
1279  break;
1280  case 4:
1281  *AudioFreq = WM8994_FREQUENCY_22K;
1282  break;
1283  case 6:
1284  *AudioFreq = WM8994_FREQUENCY_32K;
1285  break;
1286  case 7:
1287  *AudioFreq = WM8994_FREQUENCY_44K;
1288  break;
1289  case 8:
1290  *AudioFreq = WM8994_FREQUENCY_48K;
1291  break;
1292  case 10:
1293  *AudioFreq = WM8994_FREQUENCY_96K;
1294  break;
1295  default:
1296  break;
1297  }
1298  }
1299 
1300  return ret;
1301 }
1302 
1309 {
1310  int32_t ret = WM8994_OK;
1311 
1312  /* Reset Codec by writing in 0x0000 address register */
1313  if(wm8994_sw_reset_w(&pObj->Ctx, 0x0000) != WM8994_OK)
1314  {
1315  ret = WM8994_ERROR;
1316  }
1317 
1318  return ret;
1319 }
1320 
1321 /******************** Static functions ****************************************/
1328 {
1329  int32_t ret;
1330 
1331  if (pObj == NULL)
1332  {
1333  ret = WM8994_ERROR;
1334  }
1335  else
1336  {
1337  pObj->IO.Init = pIO->Init;
1338  pObj->IO.DeInit = pIO->DeInit;
1339  pObj->IO.Address = pIO->Address;
1340  pObj->IO.WriteReg = pIO->WriteReg;
1341  pObj->IO.ReadReg = pIO->ReadReg;
1342  pObj->IO.GetTick = pIO->GetTick;
1343 
1344  pObj->Ctx.ReadReg = WM8994_ReadRegWrap;
1346  pObj->Ctx.handle = pObj;
1347 
1348  if(pObj->IO.Init != NULL)
1349  {
1350  ret = pObj->IO.Init();
1351  }
1352  else
1353  {
1354  ret = WM8994_ERROR;
1355  }
1356  }
1357 
1358  return ret;
1359 }
1360 
1367 static int32_t WM8994_Delay(WM8994_Object_t *pObj, uint32_t Delay)
1368 {
1369  uint32_t tickstart;
1370 
1371  tickstart = pObj->IO.GetTick();
1372  while((pObj->IO.GetTick() - tickstart) < Delay)
1373  {
1374  }
1375  return WM8994_OK;
1376 }
1377 
1386 static int32_t WM8994_ReadRegWrap(void *handle, uint16_t Reg, uint8_t* pData, uint16_t Length)
1387 {
1388  WM8994_Object_t *pObj = (WM8994_Object_t *)handle;
1389 
1390  return pObj->IO.ReadReg(pObj->IO.Address, Reg, pData, Length);
1391 }
1392 
1401 static int32_t WM8994_WriteRegWrap(void *handle, uint16_t Reg, uint8_t* pData, uint16_t Length)
1402 {
1403  WM8994_Object_t *pObj = (WM8994_Object_t *)handle;
1404 
1405  return pObj->IO.WriteReg(pObj->IO.Address, Reg, pData, Length);
1406 }
1407 
1424 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
WM8994_INPUT_MIXER_2
#define WM8994_INPUT_MIXER_2
Definition: wm8994_reg.h:91
WM8994_Init_t::InputDevice
uint32_t InputDevice
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:71
wm8994_ctx_t::handle
void * handle
Definition: wm8994_reg.h:375
WM8994_IN_MIC2
#define WM8994_IN_MIC2
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:115
WM8994_SPK_RIGHT_VOL
#define WM8994_SPK_RIGHT_VOL
Definition: wm8994_reg.h:88
WM8994_Reset
int32_t WM8994_Reset(WM8994_Object_t *pObj)
Resets wm8994 registers.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:1308
WM8994_DAC2_RIGHT_VOL
#define WM8994_DAC2_RIGHT_VOL
Definition: wm8994_reg.h:321
WM8994_ReadRegWrap
static int32_t WM8994_ReadRegWrap(void *handle, uint16_t Reg, uint8_t *Data, uint16_t Length)
Function.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:1386
WM8994_FREQUENCY_8K
#define WM8994_FREQUENCY_8K
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:138
WM8994_WriteRegWrap
static int32_t WM8994_WriteRegWrap(void *handle, uint16_t Reg, uint8_t *Data, uint16_t Length)
Function.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:1401
WM8994_IO_t::Address
uint16_t Address
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:55
WM8994_WRITE_SEQ_CTRL1
#define WM8994_WRITE_SEQ_CTRL1
Definition: wm8994_reg.h:132
WM8994_FREQUENCY_16K
#define WM8994_FREQUENCY_16K
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:136
wm8994_lo_hpout1l_vol_r
int32_t wm8994_lo_hpout1l_vol_r(wm8994_ctx_t *ctx, uint16_t *value)
Definition: wm8994_reg.c:1999
NULL
#define NULL
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/extras/speex_resampler/thirdparty/resample.c:92
WM8994_Resume
int32_t WM8994_Resume(WM8994_Object_t *pObj)
Resumes playing on the audio codec.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:684
WM8994_IO_t
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:51
WM8994_Object_t
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:62
WM8994_PWR_MANAGEMENT_4
#define WM8994_PWR_MANAGEMENT_4
Definition: wm8994_reg.h:58
WM8994_AIF1_ADC1_LMR
#define WM8994_AIF1_ADC1_LMR
Definition: wm8994_reg.h:309
WM8994_IN_MIC1_MIC2
#define WM8994_IN_MIC1_MIC2
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:118
WM8994_DC_SERVO1
#define WM8994_DC_SERVO1
Definition: wm8994_reg.h:122
WM8994_AIF1_DAC2_LMR
#define WM8994_AIF1_DAC2_LMR
Definition: wm8994_reg.h:305
wm8994_aif1_control1_wl_r
int32_t wm8994_aif1_control1_wl_r(wm8994_ctx_t *ctx, uint16_t *value)
Definition: wm8994_reg.c:5227
WM8994_AIF1_DAC1_RMR
#define WM8994_AIF1_DAC1_RMR
Definition: wm8994_reg.h:301
VOLUME_IN_INVERT
#define VOLUME_IN_INVERT(Volume)
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:165
WM8994_IO_t::ReadReg
WM8994_ReadReg_Func ReadReg
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:57
WM8994_IO_t::GetTick
WM8994_GetTick_Func GetTick
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:58
WM8994_AIF1_ADC1_RMR
#define WM8994_AIF1_ADC1_RMR
Definition: wm8994_reg.h:311
WM8994_FREQUENCY_22K
#define WM8994_FREQUENCY_22K
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:135
WM8994_RIGHT_OUTPUT_VOL
#define WM8994_RIGHT_OUTPUT_VOL
Definition: wm8994_reg.h:72
WM8994_AIF1_DRC1
#define WM8994_AIF1_DRC1
Definition: wm8994_reg.h:200
WM8994_AIF1_ADC1_FILTERS
#define WM8994_AIF1_ADC1_FILTERS
Definition: wm8994_reg.h:192
WM8994_OUT_NONE
#define WM8994_OUT_NONE
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:121
WM8994_LEFT_OUTPUT_VOL
#define WM8994_LEFT_OUTPUT_VOL
Definition: wm8994_reg.h:71
WM8994_PDWN_HW
#define WM8994_PDWN_HW
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:147
WM8994_AIF1_DAC1_LMR
#define WM8994_AIF1_DAC1_LMR
Definition: wm8994_reg.h:299
WM8994_ANALOG_HP
#define WM8994_ANALOG_HP
Definition: wm8994_reg.h:128
WM8994_PDWN_SW
#define WM8994_PDWN_SW
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:148
WM8994_Stop
int32_t WM8994_Stop(WM8994_Object_t *pObj, uint32_t CodecPdwnMode)
Stops audio Codec playing. It powers down the codec.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:704
VOLUME_OUT_INVERT
#define VOLUME_OUT_INVERT(Volume)
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:164
WM8994_PWR_MANAGEMENT_1
#define WM8994_PWR_MANAGEMENT_1
Definition: wm8994_reg.h:55
WM8994_DeInit
int32_t WM8994_DeInit(WM8994_Object_t *pObj)
Deinitializes the audio codec.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:611
WM8994_CHARGE_PUMP1
#define WM8994_CHARGE_PUMP1
Definition: wm8994_reg.h:117
wm8994_sw_reset_r
int32_t wm8994_sw_reset_r(wm8994_ctx_t *ctx, uint16_t *value)
Definition: wm8994_reg.c:111
WM8994_DAC1_LEFT_VOL
#define WM8994_DAC1_LEFT_VOL
Definition: wm8994_reg.h:318
WM8994_Drv_t
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:78
WM8994_SetFrequency
int32_t WM8994_SetFrequency(WM8994_Object_t *pObj, uint32_t AudioFreq)
Sets new frequency.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:1192
WM8994_PROTOCOL_DSP
#define WM8994_PROTOCOL_DSP
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:162
wm8994_write_reg
int32_t wm8994_write_reg(wm8994_ctx_t *ctx, uint16_t reg, uint16_t *data, uint16_t length)
Definition: wm8994_reg.c:69
wm8994_aif1_control1_adcr_src
int32_t wm8994_aif1_control1_adcr_src(wm8994_ctx_t *ctx, uint16_t value)
Definition: wm8994_reg.c:5324
WM8994_SetMute
int32_t WM8994_SetMute(WM8994_Object_t *pObj, uint32_t Cmd)
Enables or disables the mute feature on the audio codec.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:877
WM8994_INPUT_MIXER_3
#define WM8994_INPUT_MIXER_3
Definition: wm8994_reg.h:92
WM8994_AIF1_ADC2_FILTERS
#define WM8994_AIF1_ADC2_FILTERS
Definition: wm8994_reg.h:193
WM8994_OUT_SPEAKER
#define WM8994_OUT_SPEAKER
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:122
WM8994_FREQUENCY_11K
#define WM8994_FREQUENCY_11K
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:137
WM8994_OUT_AUTO
#define WM8994_OUT_AUTO
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:125
WM8994_OUT_BOTH
#define WM8994_OUT_BOTH
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:124
wm8994_ctx_t::WriteReg
WM8994_Write_Func WriteReg
Definition: wm8994_reg.h:373
wm8994_aif1_control1_fmt
int32_t wm8994_aif1_control1_fmt(wm8994_ctx_t *ctx, uint16_t value)
Definition: wm8994_reg.c:5155
WM8994_SW_RESET
#define WM8994_SW_RESET
Definition: wm8994_reg.h:52
WM8994_AIF1_DAC1_FILTER1
#define WM8994_AIF1_DAC1_FILTER1
Definition: wm8994_reg.h:194
WM8994_SetProtocol
int32_t WM8994_SetProtocol(WM8994_Object_t *pObj, uint32_t Protocol)
Set Audio Protocol.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:1152
WM8994_IN_MIC1
#define WM8994_IN_MIC1
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:114
WM8994_GetVolume
int32_t WM8994_GetVolume(WM8994_Object_t *pObj, uint32_t InputOutput, uint8_t *Volume)
Get higher or lower the codec volume level.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:838
WM8994_Init
int32_t WM8994_Init(WM8994_Object_t *pObj, WM8994_Init_t *pInit)
Initializes the audio codec and the control interface.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:88
WM8994_OK
#define WM8994_OK
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:106
WM8994_AIF1_DAC2_RMR
#define WM8994_AIF1_DAC2_RMR
Definition: wm8994_reg.h:307
WM8994_AIF1_ADC1_LEFT_VOL
#define WM8994_AIF1_ADC1_LEFT_VOL
Definition: wm8994_reg.h:182
WM8994_PROTOCOL_I2S
#define WM8994_PROTOCOL_I2S
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:161
WM8994_IO_t::WriteReg
WM8994_WriteReg_Func WriteReg
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:56
WM8994_SetResolution
int32_t WM8994_SetResolution(WM8994_Object_t *pObj, uint32_t Resolution)
Set Audio resolution.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:1093
WM8994_IO_t::DeInit
WM8994_DeInit_Func DeInit
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:54
WM8994_OUTPUT_MIXER_2
#define WM8994_OUTPUT_MIXER_2
Definition: wm8994_reg.h:99
WM8994_OUTPUT_MIXER_1
#define WM8994_OUTPUT_MIXER_1
Definition: wm8994_reg.h:98
wm8994_ctx_t::ReadReg
WM8994_Read_Func ReadReg
Definition: wm8994_reg.h:374
WM8994_Pause
int32_t WM8994_Pause(WM8994_Object_t *pObj)
Pauses playing on the audio codec.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:656
WM8994_Object_t::Ctx
wm8994_ctx_t Ctx
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:65
WM8994_ReadID
int32_t WM8994_ReadID(WM8994_Object_t *pObj, uint32_t *Id)
Get the WM8994 ID.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:623
WM8994_Init_t::OutputDevice
uint32_t OutputDevice
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:72
WM8994_ANTIPOP2
#define WM8994_ANTIPOP2
Definition: wm8994_reg.h:111
WM8994_ERROR
#define WM8994_ERROR
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:107
WM8994_GPIO1
#define WM8994_GPIO1
Definition: wm8994_reg.h:328
WM8994_DAC2_LEFT_VOL
#define WM8994_DAC2_LEFT_VOL
Definition: wm8994_reg.h:320
WM8994_Init_t::Resolution
uint32_t Resolution
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:74
WM8994_IN_LINE1
#define WM8994_IN_LINE1
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:116
WM8994_LEFT_LINE_IN12_VOL
#define WM8994_LEFT_LINE_IN12_VOL
Definition: wm8994_reg.h:65
WM8994_CLOCKING1
#define WM8994_CLOCKING1
Definition: wm8994_reg.h:140
WM8994_AIF1_RATE
#define WM8994_AIF1_RATE
Definition: wm8994_reg.h:142
WM8994_Object_t::IO
WM8994_IO_t IO
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:64
WM8994_FREQUENCY_32K
#define WM8994_FREQUENCY_32K
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:134
WM8994_AIF1_ADC2_LMR
#define WM8994_AIF1_ADC2_LMR
Definition: wm8994_reg.h:313
WM8994_PWR_MANAGEMENT_3
#define WM8994_PWR_MANAGEMENT_3
Definition: wm8994_reg.h:57
WM8994_IN_NONE
#define WM8994_IN_NONE
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:113
WM8994_Driver
WM8994_Drv_t WM8994_Driver
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:41
WM8994_IO_t::Init
WM8994_Init_Func Init
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:53
WM8994_CLASS_W
#define WM8994_CLASS_W
Definition: wm8994_reg.h:120
WM8994_RESOLUTION_24b
#define WM8994_RESOLUTION_24b
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:143
WM8994_RESOLUTION_16b
#define WM8994_RESOLUTION_16b
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:141
ColdStartup
static uint8_t ColdStartup
Definition: stm32f769/stm32f769i-disco/Drivers/BSP/Components/wm8994/wm8994.c:107
WM8994_OVERSAMPLING
#define WM8994_OVERSAMPLING
Definition: wm8994_reg.h:324
wm8994_aif1_control1_fmt_r
int32_t wm8994_aif1_control1_fmt_r(wm8994_ctx_t *ctx, uint16_t *value)
Definition: wm8994_reg.c:5180
WM8994_SetOutputMode
int32_t WM8994_SetOutputMode(WM8994_Object_t *pObj, uint32_t Output)
Switch dynamically (while audio file is played) the output target (speaker or headphone).
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:918
WM8994_RESOLUTION_20b
#define WM8994_RESOLUTION_20b
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:142
WM8994_RESOLUTION_32b
#define WM8994_RESOLUTION_32b
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:144
WM8994_IN_LINE2
#define WM8994_IN_LINE2
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:117
WM8994_SetVolume
int32_t WM8994_SetVolume(WM8994_Object_t *pObj, uint32_t InputOutput, uint8_t Volume)
Set higher or lower the codec volume level.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:755
WM8994_GetResolution
int32_t WM8994_GetResolution(WM8994_Object_t *pObj, uint32_t *Resolution)
Get Audio resolution.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:1110
WM8994_INPUT_MIXER_4
#define WM8994_INPUT_MIXER_4
Definition: wm8994_reg.h:93
wm8994_aif1_control1_wl
int32_t wm8994_aif1_control1_wl(wm8994_ctx_t *ctx, uint16_t value)
Definition: wm8994_reg.c:5202
WM8994_Init_t::Volume
uint32_t Volume
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:75
WM8994_FREQUENCY_96K
#define WM8994_FREQUENCY_96K
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:130
WM8994_PWR_MANAGEMENT_2
#define WM8994_PWR_MANAGEMENT_2
Definition: wm8994_reg.h:56
VOLUME_OUTPUT
#define VOLUME_OUTPUT
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:152
Output
Output
WM8994_AIF1_ADC2_RMR
#define WM8994_AIF1_ADC2_RMR
Definition: wm8994_reg.h:315
WM8994_FREQUENCY_44K
#define WM8994_FREQUENCY_44K
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:133
WM8994_SPKMIXR_ATT
#define WM8994_SPKMIXR_ATT
Definition: wm8994_reg.h:83
WM8994_SPK_LEFT_VOL
#define WM8994_SPK_LEFT_VOL
Definition: wm8994_reg.h:87
WM8994_AIF1_CLOCKING1
#define WM8994_AIF1_CLOCKING1
Definition: wm8994_reg.h:136
WM8994_SPEAKER_MIXER
#define WM8994_SPEAKER_MIXER
Definition: wm8994_reg.h:107
WM8994_AIF1_DRC2
#define WM8994_AIF1_DRC2
Definition: wm8994_reg.h:206
WM8994_AIF1_MASTER_SLAVE
#define WM8994_AIF1_MASTER_SLAVE
Definition: wm8994_reg.h:164
WM8994_AIF1_ADC2_RIGHT_VOL
#define WM8994_AIF1_ADC2_RIGHT_VOL
Definition: wm8994_reg.h:187
WM8994_RegisterBusIO
int32_t WM8994_RegisterBusIO(WM8994_Object_t *pObj, WM8994_IO_t *pIO)
Function.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:1327
wm8994_sw_reset_w
int32_t wm8994_sw_reset_w(wm8994_ctx_t *ctx, uint16_t value)
Definition: wm8994_reg.c:99
WM8994_SPKMIXL_ATT
#define WM8994_SPKMIXL_ATT
Definition: wm8994_reg.h:82
WM8994_MUTE_OFF
#define WM8994_MUTE_OFF
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:156
wm8994.h
This file contains all the functions prototypes for the wm8994.c driver.
WM8994_DAC1_RIGHT_VOL
#define WM8994_DAC1_RIGHT_VOL
Definition: wm8994_reg.h:319
WM8994_GetProtocol
int32_t WM8994_GetProtocol(WM8994_Object_t *pObj, uint32_t *Protocol)
Get Audio Protocol.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:1169
WM8994_AIF1_DAC2_FILTER1
#define WM8994_AIF1_DAC2_FILTER1
Definition: wm8994_reg.h:196
WM8994_RIGHT_LINE_IN12_VOL
#define WM8994_RIGHT_LINE_IN12_VOL
Definition: wm8994_reg.h:67
WM8994_Delay
static int32_t WM8994_Delay(WM8994_Object_t *pObj, uint32_t Delay)
This function provides accurate delay (in milliseconds)
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:1367
WM8994_Play
int32_t WM8994_Play(WM8994_Object_t *pObj)
Start the audio Codec play feature.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:644
Length
Length
WM8994_PWR_MANAGEMENT_5
#define WM8994_PWR_MANAGEMENT_5
Definition: wm8994_reg.h:59
WM8994_AIF1_ADC1_RIGHT_VOL
#define WM8994_AIF1_ADC1_RIGHT_VOL
Definition: wm8994_reg.h:183
wm8994_aif1_adc1_left_vol_adc1l_r
int32_t wm8994_aif1_adc1_left_vol_adc1l_r(wm8994_ctx_t *ctx, uint16_t *value)
Definition: wm8994_reg.c:5476
WM8994_MUTE_ON
#define WM8994_MUTE_ON
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:155
WM8994_Init_t
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:69
WM8994_Init_t::Frequency
uint32_t Frequency
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:73
wm8994_aif1_sr_r
int32_t wm8994_aif1_sr_r(wm8994_ctx_t *ctx, uint16_t *value)
Definition: wm8994_reg.c:5133
WM8994_OUT_HEADPHONE
#define WM8994_OUT_HEADPHONE
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:123
VOLUME_INPUT
#define VOLUME_INPUT
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:151
WM8994_AIF1_ADC2_LEFT_VOL
#define WM8994_AIF1_ADC2_LEFT_VOL
Definition: wm8994_reg.h:186
WM8994_GetFrequency
int32_t WM8994_GetFrequency(WM8994_Object_t *pObj, uint32_t *AudioFreq)
Get frequency.
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.c:1258
WM8994_FREQUENCY_48K
#define WM8994_FREQUENCY_48K
Definition: stm32h747/stm32h747i-disco/CM7/Drivers/BSP/Components/wm8994/wm8994.h:132


picovoice_driver
Author(s):
autogenerated on Fri Apr 1 2022 02:14:55