1 /*
2 * Copyright (c) 2015-2016, Freescale Semiconductor, Inc.
3 * Copyright 2016-2020 NXP
4 * All rights reserved.
5 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 */
8
9 #include "fsl_dialog7212.h"
10
11 /*******************************************************************************
12 * Definitations
13 ******************************************************************************/
14 /*! @brief da7212 reigster structure */
15 typedef struct _da7212_register_value
16 {
17 uint8_t addr;
18 uint8_t value;
19 } da7212_register_value_t;
20
21 /*******************************************************************************
22 * Prototypes
23 ******************************************************************************/
24 /*!
25 * @brief DA7212 modify register.
26 *
27 * @param handle DA7212 handle structure.
28 * @param reg register address.
29 * @param mask register bits mask.
30 * @param value value to write.
31 * @return kStatus_Success, else failed.
32 */
33 static status_t DA7212_ModifyRegister(da7212_handle_t *handle, uint8_t reg, uint8_t mask, uint8_t value);
34 /*******************************************************************************
35 * Variables
36 ******************************************************************************/
37 static const da7212_register_value_t kInputRegisterSequence[kDA7212_Input_MAX][17] = {
38 /* DA7212_Input_AUX */
39 {
40 {DIALOG7212_MIXIN_L_SELECT, 0x01},
41 {DIALOG7212_MIXIN_R_SELECT, 0x01},
42 {DIALOG7212_CP_CTRL, 0xFD},
43 {DIALOG7212_AUX_L_CTRL, 0xB4},
44 {DIALOG7212_AUX_R_CTRL, 0xB0},
45 {DIALOG7212_MIC_1_CTRL, 0x04},
46 {DIALOG7212_MIC_2_CTRL, 0x04},
47 {DIALOG7212_MIXIN_L_CTRL, 0x88},
48 {DIALOG7212_MIXIN_R_CTRL, 0x88},
49 {DIALOG7212_ADC_L_CTRL, 0xA0},
50 {DIALOG7212_GAIN_RAMP_CTRL, 0x02},
51 {DIALOG7212_PC_COUNT, 0x02},
52 {DIALOG7212_CP_DELAY, 0x95},
53 {0, 0},
54 {0, 0},
55 {0, 0},
56 {0, 0},
57 },
58 /* DA7212_Input_MIC1_Dig */
59 {
60 {DIALOG7212_MICBIAS_CTRL, 0xA9},
61 {DIALOG7212_CP_CTRL, 0xF1},
62 {DIALOG7212_MIXIN_L_SELECT, 0x80},
63 {DIALOG7212_MIXIN_R_SELECT, 0x80},
64 {DIALOG7212_SYSTEM_MODES_INPUT, 0xFE},
65 {DIALOG7212_SYSTEM_MODES_OUTPUT, 0xF7},
66 {DIALOG7212_MIC_CONFIG, 0x07},
67 {DIALOG7212_MIC_2_GAIN, 0x04},
68 {DIALOG7212_MIC_2_CTRL, 0x84},
69 {DIALOG7212_MIC_1_GAIN, 0x01},
70 {DIALOG7212_MIC_1_CTRL, 0x80},
71 {DIALOG7212_ADC_FILTERS1, 0x08},
72 {0, 0},
73 {0, 0},
74 {0, 0},
75 {0, 0},
76 {0, 0},
77 },
78 /* DA7212_Input_MIC1_An */
79 {
80 {DIALOG7212_MIXIN_L_SELECT, 0x02},
81 {DIALOG7212_MIXIN_R_SELECT, 0x04},
82 {DIALOG7212_MIC_1_GAIN, 0x03},
83 {DIALOG7212_CP_CTRL, 0xFD},
84 {DIALOG7212_MIXOUT_L_SELECT, 0x08},
85 {DIALOG7212_MIXOUT_R_SELECT, 0x08},
86 {DIALOG7212_AUX_R_CTRL, 0x40},
87 {DIALOG7212_MICBIAS_CTRL, 0x19},
88 {DIALOG7212_MIC_1_CTRL, 0x84},
89 {DIALOG7212_MIC_2_CTRL, 0x04},
90 {DIALOG7212_MIXIN_L_CTRL, 0x88},
91 {DIALOG7212_MIXIN_R_CTRL, 0x88},
92 {DIALOG7212_ADC_L_CTRL, 0xA0},
93 {DIALOG7212_GAIN_RAMP_CTRL, 0x02},
94 {DIALOG7212_PC_COUNT, 0x02},
95 {DIALOG7212_CP_DELAY, 0x95},
96 {0, 0},
97 },
98 /* DA7212_Input_MIC2 */
99 {
100 {DIALOG7212_MIXIN_L_SELECT, 0x04},
101 {DIALOG7212_MIXIN_R_SELECT, 0x02},
102 {DIALOG7212_MIC_2_GAIN, 0x04},
103 {DIALOG7212_CP_CTRL, 0xFD},
104 {DIALOG7212_AUX_R_CTRL, 0x40},
105 {DIALOG7212_MICBIAS_CTRL, 0x91},
106 {DIALOG7212_MIC_1_CTRL, 0x08},
107 {DIALOG7212_MIC_2_CTRL, 0x84},
108 {DIALOG7212_MIXIN_L_CTRL, 0x88},
109 {DIALOG7212_MIXIN_R_CTRL, 0x88},
110 {DIALOG7212_ADC_L_CTRL, 0xA0},
111 {DIALOG7212_GAIN_RAMP_CTRL, 0x02},
112 {DIALOG7212_PC_COUNT, 0x02},
113 {DIALOG7212_CP_DELAY, 0x95},
114 {0, 0},
115 {0, 0},
116 {0, 0},
117 }};
118
119 static const da7212_register_value_t kOutputRegisterSequence[kDA7212_Output_MAX][4] = {
120 /* DA7212_Output_HP */
121 {
122 {DIALOG7212_CP_CTRL, 0xF9},
123 {DIALOG7212_LINE_CTRL, 0},
124 {DIALOG7212_HP_L_CTRL, (DIALOG7212_HP_L_CTRL_AMP_EN_MASK | DIALOG7212_HP_L_CTRL_AMP_RAMP_EN_MASK |
125 DIALOG7212_HP_L_CTRL_AMP_ZC_EN_MASK | DIALOG7212_HP_L_CTRL_AMP_OE_MASK)},
126 {DIALOG7212_HP_R_CTRL, (DIALOG7212_HP_R_CTRL_AMP_EN_MASK | DIALOG7212_HP_R_CTRL_AMP_RAMP_EN_MASK |
127 DIALOG7212_HP_R_CTRL_AMP_ZC_EN_MASK | DIALOG7212_HP_R_CTRL_AMP_OE_MASK)},
128 },
129 /* DA7212_Output_SP */
130 {
131 {DIALOG7212_CP_CTRL, 0x3D},
132 {DIALOG7212_HP_L_CTRL, 0x40},
133 {DIALOG7212_HP_R_CTRL, 0x40},
134 {DIALOG7212_LINE_CTRL, 0xA8},
135 }};
136
137 static const da7212_register_value_t kInitRegisterSequence[DA7212_INIT_SIZE] = {
138 {
139 DIALOG7212_CIF_CTRL,
140 0x80,
141 },
142 {
143 DIALOG7212_DIG_ROUTING_DAI,
144 0x10,
145 },
146 {
147 DIALOG7212_SR,
148 DIALOG7212_SR_16KHZ,
149 },
150 {
151 DIALOG7212_REFERENCES,
152 DIALOG7212_REFERENCES_BIAS_EN_MASK,
153 },
154 {
155 DIALOG7212_PLL_FRAC_TOP,
156 CLEAR_REGISTER,
157 },
158 {
159 DIALOG7212_PLL_FRAC_BOT,
160 CLEAR_REGISTER,
161 },
162 {
163 DIALOG7212_PLL_INTEGER,
164 0x20,
165 },
166 {
167 DIALOG7212_PLL_CTRL,
168 0U,
169 },
170 {
171 DIALOG7212_DAI_CLK_MODE,
172 (DIALOG7212_DAI_BCLKS_PER_WCLK_BCLK64),
173 },
174 {
175 DIALOG7212_DAI_CTRL,
176 (DIALOG7212_DAI_EN_MASK | DIALOG7212_DAI_OE_MASK | DIALOG7212_DAI_WORD_LENGTH_16B |
177 DIALOG7212_DAI_FORMAT_I2S_MODE),
178 },
179 {
180 DIALOG7212_DIG_ROUTING_DAC,
181 (DIALOG7212_DIG_ROUTING_DAC_R_RSC_DAC_R | DIALOG7212_DIG_ROUTING_DAC_L_RSC_DAC_L),
182 },
183 {
184 DIALOG7212_CP_CTRL,
185 (DIALOG7212_CP_CTRL_EN_MASK | DIALOG7212_CP_CTRL_SMALL_SWIT_CH_FREQ_EN_MASK |
186 DIALOG7212_CP_CTRL_MCHANGE_OUTPUT | DIALOG7212_CP_CTRL_MOD_CPVDD_1 |
187 DIALOG7212_CP_CTRL_ANALOG_VLL_LV_BOOSTS_CP),
188 },
189 {
190 DIALOG7212_MIXOUT_L_SELECT,
191 (DIALOG7212_MIXOUT_L_SELECT_DAC_L_MASK),
192 },
193 {
194 DIALOG7212_MIXOUT_R_SELECT,
195 (DIALOG7212_MIXOUT_R_SELECT_DAC_R_MASK),
196 },
197 {
198 DIALOG7212_DAC_L_CTRL,
199 (DIALOG7212_DAC_L_CTRL_ADC_EN_MASK | DIALOG7212_DAC_L_CTRL_ADC_RAMP_EN_MASK),
200 },
201 {
202 DIALOG7212_DAC_R_CTRL,
203 (DIALOG7212_DAC_R_CTRL_ADC_EN_MASK | DIALOG7212_DAC_R_CTRL_ADC_RAMP_EN_MASK),
204 },
205 {
206 DIALOG7212_HP_L_CTRL,
207 (DIALOG7212_HP_L_CTRL_AMP_EN_MASK |
208 DIALOG7212_HP_L_CTRL_AMP_ZC_EN_MASK | DIALOG7212_HP_L_CTRL_AMP_OE_MASK),
209 },
210 {
211 DIALOG7212_HP_R_CTRL,
212 (DIALOG7212_HP_R_CTRL_AMP_EN_MASK |
213 DIALOG7212_HP_R_CTRL_AMP_ZC_EN_MASK | DIALOG7212_HP_R_CTRL_AMP_OE_MASK),
214 },
215 {
216 DIALOG7212_MIXOUT_L_CTRL,
217 (DIALOG7212_MIXOUT_L_CTRL_AMP_EN_MASK | DIALOG7212_MIXOUT_L_CTRL_AMP_SOFT_MIX_EN_MASK |
218 DIALOG7212_MIXOUT_L_CTRL_AMP_MIX_EN_MASK),
219 },
220 {
221 DIALOG7212_MIXOUT_R_CTRL,
222 (DIALOG7212_MIXOUT_R_CTRL_AMP_EN_MASK | DIALOG7212_MIXOUT_R_CTRL_AMP_SOFT_MIX_EN_MASK |
223 DIALOG7212_MIXOUT_R_CTRL_AMP_MIX_EN_MASK),
224 },
225 {
226 DIALOG7212_CP_VOL_THRESHOLD1,
227 DIALOG7212_CP_VOL_THRESHOLD1_VDD2(0x32),
228 },
229 {
230 DIALOG7212_SYSTEM_STATUS,
231 CLEAR_REGISTER,
232 },
233 {
234 DIALOG7212_DAC_L_GAIN,
235 (uint8_t)kDA7212_DACGainM6DB,
236 },
237 {
238 DIALOG7212_DAC_R_GAIN,
239 (uint8_t)kDA7212_DACGainM6DB,
240 },
241 {
242 DIALOG7212_MIXIN_L_SELECT,
243 DIALOG7212_MIXIN_L_SELECT_AUX_L_SEL_MASK,
244 },
245 {
246 DIALOG7212_MIXIN_R_SELECT,
247 DIALOG7212_MIXIN_R_SELECT_AUX_R_SEL_MASK,
248 },
249 {
250 DIALOG7212_MIXIN_L_GAIN,
251 DIALOG7212_MIXIN_L_AMP_GAIN(0x03),
252 },
253 {
254 DIALOG7212_MIXIN_R_GAIN,
255 DIALOG7212_MIXIN_R_AMP_GAIN(0x03),
256 },
257 {
258 DIALOG7212_ADC_L_GAIN,
259 DIALOG7212_ADC_L_DIGITAL_GAIN(0x6F),
260 },
261 {
262 DIALOG7212_ADC_R_GAIN,
263 DIALOG7212_ADC_R_DIGITAL_GAIN(0x6F),
264 },
265 {
266 DIALOG7212_AUX_L_CTRL,
267 DIALOG7212_AUX_L_CTRL_AMP_EN_MASK | DIALOG7212_AUX_L_CTRL_AMP_RAMP_EN_MASK |
268 DIALOG7212_AUX_L_CTRL_AMP_ZC_EN_MASK,
269 },
270 {
271 DIALOG7212_AUX_R_CTRL,
272 DIALOG7212_AUX_R_CTRL_AMP_EN_MASK | DIALOG7212_AUX_R_CTRL_AMP_RAMP_EN_MASK |
273 DIALOG7212_AUX_R_CTRL_AMP_ZC_EN_MASK,
274 },
275 {
276 DIALOG7212_MIXIN_L_CTRL,
277 DIALOG7212_MIXIN_L_CTRL_AMP_EN_MASK | DIALOG7212_MIXIN_L_CTRL_AMP_MIX_EN_MASK,
278 },
279 {
280 DIALOG7212_MIXIN_R_CTRL,
281 DIALOG7212_MIXIN_R_CTRL_AMP_EN_MASK | DIALOG7212_MIXIN_R_CTRL_AMP_MIX_EN_MASK,
282 },
283 {
284 DIALOG7212_ADC_L_CTRL,
285 DIALOG7212_ADC_L_CTRL_ADC_EN_MASK | DIALOG7212_ADC_L_CTRL_ADC_RAMP_EN_MASK,
286 },
287 {
288 DIALOG7212_ADC_R_CTRL,
289 DIALOG7212_ADC_R_CTRL_ADC_EN_MASK | DIALOG7212_ADC_R_CTRL_ADC_RAMP_EN_MASK,
290 },
291 };
292
293 /*******************************************************************************
294 * Code
295 ******************************************************************************/
DA7212_WriteRegister(da7212_handle_t * handle,uint8_t u8Register,uint8_t u8RegisterData)296 status_t DA7212_WriteRegister(da7212_handle_t *handle, uint8_t u8Register, uint8_t u8RegisterData)
297 {
298 assert(handle->config);
299 assert(handle->config->slaveAddress != 0U);
300
301 uint8_t writeValue = u8RegisterData;
302
303 return CODEC_I2C_Send(handle->i2cHandle, handle->config->slaveAddress, u8Register, 1U, (uint8_t *)&writeValue, 1U);
304 }
305
DA7212_ReadRegister(da7212_handle_t * handle,uint8_t u8Register,uint8_t * pu8RegisterData)306 status_t DA7212_ReadRegister(da7212_handle_t *handle, uint8_t u8Register, uint8_t *pu8RegisterData)
307 {
308 assert(handle->config);
309 assert(handle->config->slaveAddress != 0U);
310
311 return CODEC_I2C_Receive(handle->i2cHandle, handle->config->slaveAddress, u8Register, 1U,
312 (uint8_t *)pu8RegisterData, 1U);
313 }
314
DA7212_ModifyRegister(da7212_handle_t * handle,uint8_t reg,uint8_t mask,uint8_t value)315 static status_t DA7212_ModifyRegister(da7212_handle_t *handle, uint8_t reg, uint8_t mask, uint8_t value)
316 {
317 status_t result;
318 uint8_t regValue = 0;
319
320 result = DA7212_ReadRegister(handle, reg, ®Value);
321 if (result != kStatus_Success)
322 {
323 return result;
324 }
325
326 regValue &= (uint8_t)~mask;
327 regValue |= value;
328
329 return DA7212_WriteRegister(handle, reg, regValue);
330 }
331
DA7212_Init(da7212_handle_t * handle,da7212_config_t * codecConfig)332 status_t DA7212_Init(da7212_handle_t *handle, da7212_config_t *codecConfig)
333 {
334 assert(codecConfig != NULL);
335 assert(handle != NULL);
336
337 uint32_t i = 0;
338 status_t error = kStatus_Success;
339 da7212_config_t *config = codecConfig;
340 uint32_t sysClock = config->format.mclk_HZ;
341 handle->config = config;
342
343 /* i2c bus initialization */
344 if (CODEC_I2C_Init(handle->i2cHandle, config->i2cConfig.codecI2CInstance, DA7212_I2C_BAUDRATE,
345 config->i2cConfig.codecI2CSourceClock) != (status_t)kStatus_HAL_I2cSuccess)
346 {
347 return kStatus_Fail;
348 }
349
350 /* If no config structure, use default settings */
351 for (i = 0; i < DA7212_INIT_SIZE; i++)
352 {
353 if ((DA7212_WriteRegister(handle, kInitRegisterSequence[i].addr, kInitRegisterSequence[i].value)) !=
354 kStatus_Success)
355 {
356 return kStatus_Fail;
357 }
358 }
359
360 if (config->isMaster)
361 {
362 /* clock configurations */
363 if ((DA7212_WriteRegister(handle, DIALOG7212_DAI_CLK_MODE,
364 (config->format.isBclkInvert ? 1U << 2U : 0U) | (1U << 7U))) != kStatus_Success)
365 {
366 return kStatus_Fail;
367 }
368
369 if (DA7212_SetMasterModeBits(handle, config->format.bitWidth) != kStatus_Success)
370 {
371 return kStatus_Fail;
372 }
373 }
374
375 /* Set DA7212 functionality */
376 if (config->dacSource == kDA7212_DACSourceADC)
377 {
378 if ((DA7212_WriteRegister(handle, DIALOG7212_DIG_ROUTING_DAC, 0x10)) != kStatus_Success)
379 {
380 return kStatus_Fail;
381 }
382 }
383 else
384 {
385 if ((DA7212_WriteRegister(handle, DIALOG7212_DIG_ROUTING_DAC, 0x32)) != kStatus_Success)
386 {
387 return kStatus_Fail;
388 }
389 }
390
391 /* Set the audio protocol */
392 if ((DA7212_WriteRegister(handle, DIALOG7212_DAI_CTRL,
393 (uint8_t)(DIALOG7212_DAI_EN_MASK | (uint8_t)(config->protocol)))) != kStatus_Success)
394 {
395 return kStatus_Fail;
396 }
397
398 if (codecConfig->sysClkSource == kDA7212_SysClkSourcePLL)
399 {
400 if (DA7212_SetPLLConfig(handle, codecConfig->pll) != kStatus_Success)
401 {
402 return kStatus_Fail;
403 }
404
405 sysClock = (uint32_t)(codecConfig->pll->outputClock_HZ);
406 }
407
408 DA7212_ChangeInput(handle, codecConfig->inputSource);
409
410 error = DA7212_ConfigAudioFormat(handle, sysClock, config->format.sampleRate, config->format.bitWidth);
411
412 return error;
413 }
414
DA7212_SetPLLConfig(da7212_handle_t * handle,da7212_pll_config_t * config)415 status_t DA7212_SetPLLConfig(da7212_handle_t *handle, da7212_pll_config_t *config)
416 {
417 assert(config != NULL);
418 status_t retVal = kStatus_Success;
419
420 uint8_t indiv = 0, inputDiv = 0, regVal = 0;
421 uint64_t pllValue = 0;
422 uint32_t pllFractional;
423 uint8_t pllInteger;
424 uint8_t pllFracTop;
425 uint8_t pllFracBottom;
426 uint8_t pllEnMask = DIALOG7212_PLL_EN_MASK;
427
428 if (config->refClock_HZ == 32768U)
429 {
430 pllEnMask |= DIALOG7212_PLL_SRM_EN_MASK | DIALOG7212_PLL_32K_MODE_MASK;
431 indiv = DIALOG7212_PLL_INDIV_2_10MHZ;
432 inputDiv = 1;
433 }
434 /* Compute the PLL_INDIV and DIV value for sysClock */
435 else if ((config->refClock_HZ > 2000000U) && (config->refClock_HZ <= 10000000U))
436 {
437 indiv = DIALOG7212_PLL_INDIV_2_10MHZ;
438 inputDiv = 2;
439 }
440 else if ((config->refClock_HZ > 10000000U) && (config->refClock_HZ <= 20000000U))
441 {
442 indiv = DIALOG7212_PLL_INDIV_10_20MHZ;
443 inputDiv = 4;
444 }
445 else if ((config->refClock_HZ > 20000000U) && (config->refClock_HZ <= 40000000U))
446 {
447 indiv = DIALOG7212_PLL_INDIV_20_40MHZ;
448 inputDiv = 8;
449 }
450 else
451 {
452 indiv = DIALOG7212_PLL_INDIV_40_80MHZ;
453 inputDiv = 16;
454 }
455
456 /* PLL feedback divider is a Q13 value */
457 pllValue =
458 (uint64_t)(((uint64_t)((((uint64_t)config->outputClock_HZ * 8U) * inputDiv) << 13U)) / (config->refClock_HZ));
459
460 /* extract integer and fractional */
461 pllInteger = (uint8_t)(pllValue >> 13U);
462 pllFractional = (uint32_t)(pllValue - ((uint64_t)pllInteger << 13U));
463 pllFracTop = (uint8_t)(pllFractional >> 8U);
464 pllFracBottom = (uint8_t)(pllFractional & 0xFFU);
465
466 retVal = DA7212_WriteRegister(handle, DIALOG7212_PLL_FRAC_TOP, pllFracTop);
467
468 retVal = DA7212_WriteRegister(handle, DIALOG7212_PLL_FRAC_BOT, pllFracBottom);
469
470 retVal = DA7212_WriteRegister(handle, DIALOG7212_PLL_INTEGER, pllInteger);
471
472 regVal = pllEnMask | indiv;
473
474 retVal = DA7212_WriteRegister(handle, DIALOG7212_PLL_CTRL, regVal);
475
476 /* wait for PLL lock bits */
477 while ((regVal & 1U) == 0U)
478 {
479 retVal = DA7212_ReadRegister(handle, DIALOG7212_PLL_STATUS, ®Val);
480 }
481
482 return retVal;
483 }
484
DA7212_SetProtocol(da7212_handle_t * handle,da7212_protocol_t protocol)485 status_t DA7212_SetProtocol(da7212_handle_t *handle, da7212_protocol_t protocol)
486 {
487 return DA7212_WriteRegister(handle, DIALOG7212_DAI_CTRL, (uint8_t)(DIALOG7212_DAI_EN_MASK | (uint8_t)protocol));
488 }
489
DA7212_ConfigAudioFormat(da7212_handle_t * handle,uint32_t masterClock_Hz,uint32_t sampleRate_Hz,uint32_t dataBits)490 status_t DA7212_ConfigAudioFormat(da7212_handle_t *handle,
491 uint32_t masterClock_Hz,
492 uint32_t sampleRate_Hz,
493 uint32_t dataBits)
494 {
495 uint8_t regVal = 0;
496 status_t retVal = kStatus_Success;
497
498 switch (sampleRate_Hz)
499 {
500 case 8000:
501 retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_8KHZ);
502 break;
503 case 11025:
504 retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_11_025KHZ);
505 break;
506 case 12000:
507 retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_12KHZ);
508 break;
509 case 16000:
510 retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_16KHZ);
511 break;
512 case 22050:
513 retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_22KHZ);
514 break;
515 case 24000:
516 retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_24KHZ);
517 break;
518 case 32000:
519 retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_32KHZ);
520 break;
521 case 44100:
522 retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_44_1KHZ);
523 break;
524 case 48000:
525 retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_48KHZ);
526 break;
527 case 88200:
528 retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_88_2KHZ);
529 break;
530 case 96000:
531 retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_96KHZ);
532 break;
533 default:
534 /* Avoid MISRA 16.4 violation */
535 break;
536 }
537
538 /* Set data bits of word */
539 retVal = DA7212_ReadRegister(handle, DIALOG7212_DAI_CTRL, ®Val);
540 regVal &= ~(uint8_t)DIALOG7212_DAI_WORD_LENGTH_MASK;
541 switch (dataBits)
542 {
543 case 16:
544 regVal |= (uint8_t)DIALOG7212_DAI_WORD_LENGTH_16B;
545 break;
546 case 20:
547 regVal |= (uint8_t)DIALOG7212_DAI_WORD_LENGTH_20B;
548 break;
549 case 24:
550 regVal |= (uint8_t)DIALOG7212_DAI_WORD_LENGTH_24B;
551 break;
552 case 32:
553 regVal |= (uint8_t)DIALOG7212_DAI_WORD_LENGTH_32B;
554 break;
555 default:
556 /* Avoid MISRA 16.4 violation */
557 break;
558 }
559 retVal = DA7212_WriteRegister(handle, DIALOG7212_DAI_CTRL, regVal);
560
561 return retVal;
562 }
563
DA7212_SetMasterModeBits(da7212_handle_t * handle,uint32_t bitWidth)564 status_t DA7212_SetMasterModeBits(da7212_handle_t *handle, uint32_t bitWidth)
565 {
566 uint8_t regVal = 0U;
567
568 switch (bitWidth)
569 {
570 case 16:
571 regVal = 0U;
572 break;
573 case 32:
574 regVal = 1U;
575 break;
576 case 64:
577 regVal = 2U;
578 break;
579 case 128:
580 regVal = 3U;
581 break;
582 default:
583 assert(false);
584 break;
585 }
586
587 return DA7212_ModifyRegister(handle, DIALOG7212_DAI_CLK_MODE, 3, regVal);
588 }
589
DA7212_ChangeInput(da7212_handle_t * handle,da7212_Input_t DA7212_Input)590 void DA7212_ChangeInput(da7212_handle_t *handle, da7212_Input_t DA7212_Input)
591 {
592 uint32_t i = 0;
593 uint32_t seqSize = sizeof(kInputRegisterSequence[DA7212_Input]) / sizeof(da7212_register_value_t);
594
595 for (i = 0; i < seqSize; i++)
596 {
597 (void)DA7212_WriteRegister(handle, kInputRegisterSequence[DA7212_Input][i].addr,
598 kInputRegisterSequence[DA7212_Input][i].value);
599 }
600 }
601
DA7212_ChangeOutput(da7212_handle_t * handle,da7212_Output_t DA7212_Output)602 void DA7212_ChangeOutput(da7212_handle_t *handle, da7212_Output_t DA7212_Output)
603 {
604 uint32_t i = 0;
605 uint32_t seqSize = sizeof(kOutputRegisterSequence[DA7212_Output]) / sizeof(da7212_register_value_t);
606
607 for (i = 0; i < seqSize; i++)
608 {
609 (void)DA7212_WriteRegister(handle, kOutputRegisterSequence[DA7212_Output][i].addr,
610 kOutputRegisterSequence[DA7212_Output][i].value);
611 }
612 }
613
DA7212_ChangeHPVolume(da7212_handle_t * handle,da7212_volume_t volume)614 void DA7212_ChangeHPVolume(da7212_handle_t *handle, da7212_volume_t volume)
615 {
616 (void)DA7212_WriteRegister(handle, DIALOG7212_DAC_L_GAIN, (uint8_t)volume);
617 (void)DA7212_WriteRegister(handle, DIALOG7212_DAC_R_GAIN, (uint8_t)volume);
618 }
619
DA7212_Mute(da7212_handle_t * handle,bool isMuted)620 void DA7212_Mute(da7212_handle_t *handle, bool isMuted)
621 {
622 uint8_t val = 0;
623
624 if (isMuted)
625 {
626 val = DA7212_DAC_MUTE_ENABLED;
627 }
628 else
629 {
630 val = DA7212_DAC_MUTE_DISABLED;
631 }
632
633 (void)DA7212_WriteRegister(handle, DIALOG7212_DAC_L_CTRL, val);
634 (void)DA7212_WriteRegister(handle, DIALOG7212_DAC_R_CTRL, val);
635 }
636
DA7212_SetChannelVolume(da7212_handle_t * handle,uint32_t channel,uint32_t volume)637 status_t DA7212_SetChannelVolume(da7212_handle_t *handle, uint32_t channel, uint32_t volume)
638 {
639 status_t retVal = kStatus_Success;
640
641 if (volume > DA7212_HEADPHONE_MAX_VOLUME_VALUE)
642 {
643 return kStatus_InvalidArgument;
644 }
645
646 if ((channel & (uint32_t)kDA7212_HeadphoneLeft) != 0U)
647 {
648 retVal = DA7212_WriteRegister(handle, DIALOG7212_HP_L_GAIN, (uint8_t)volume);
649 }
650
651 if ((channel & (uint32_t)kDA7212_HeadphoneRight) != 0U)
652 {
653 retVal = DA7212_WriteRegister(handle, DIALOG7212_HP_R_GAIN, (uint8_t)volume);
654 }
655
656 if ((channel & (uint32_t)kDA7212_Speaker) != 0U)
657 {
658 retVal = DA7212_WriteRegister(handle, DIALOG7212_LINE_GAIN, (uint8_t)volume);
659 }
660
661 return retVal;
662 }
663
DA7212_SetChannelMute(da7212_handle_t * handle,uint32_t channel,bool isMute)664 status_t DA7212_SetChannelMute(da7212_handle_t *handle, uint32_t channel, bool isMute)
665 {
666 uint8_t regValue = isMute == true ? 0x40U : 0x80U;
667 status_t retVal = kStatus_Success;
668
669 if ((channel & (uint32_t)kDA7212_HeadphoneLeft) != 0U)
670 {
671 retVal = DA7212_ModifyRegister(handle, DIALOG7212_HP_L_CTRL, 0xC0U, regValue);
672 }
673
674 if ((channel & (uint32_t)kDA7212_HeadphoneRight) != 0U)
675 {
676 retVal = DA7212_ModifyRegister(handle, DIALOG7212_HP_R_CTRL, 0xC0U, regValue);
677 }
678
679 if ((channel & (uint32_t)kDA7212_Speaker) != 0U)
680 {
681 retVal = DA7212_ModifyRegister(handle, DIALOG7212_LINE_CTRL, 0xC0U, regValue);
682 }
683
684 return retVal;
685 }
686
DA7212_Deinit(da7212_handle_t * handle)687 status_t DA7212_Deinit(da7212_handle_t *handle)
688 {
689 return kStatus_Success;
690 }
691