aboutsummaryrefslogtreecommitdiff
path: root/inc/peripheral/rtl876x_codec.h
blob: 6fdc37b1d288268119149889083488752435131d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
/**
*********************************************************************************************************
*               Copyright(c) 2019, Realtek Semiconductor Corporation. All rights reserved.
*********************************************************************************************************
* \file     rtl876x_codec.h
* \brief    The header file of the peripheral CODEC driver.
* \details  This file provides all CODEC firmware functions.
* \author   Yuan
* \date     2020-11-16
* \version  v2.1.1
* *********************************************************************************************************
*/

#ifndef _RTL876X_CODEC_H_
#define _RTL876X_CODEC_H_

#ifdef __cplusplus
extern "C" {
#endif

/**
 * \addtogroup  IO          Peripheral Drivers
 * \defgroup    CODEC       CODEC
 *
 * \brief       Manage the CODEC peripheral functions.
 *
 * \ingroup     IO
 */

/*============================================================================*
 *                         Includes
 *============================================================================*/
#include "rtl876x.h"

/*============================================================================*
 *                         Types
 *============================================================================*/

/**
 * \defgroup    CODEC_Exported_Types    Init Params Struct
 *
 * \ingroup     CODEC
 */

/**
 * \brief       CODEC init structure definition.
 *
 * \ingroup     CODEC_Exported_Types
 */
typedef struct
{
    /* Basic parameters section */
    uint32_t CODEC_SampleRate;          /*!< Specifies the sample rate. */
    uint32_t CODEC_DmicClock;           /*!< Specifies the dmic clock. */
    uint32_t CODEC_I2SFormat;           /*!< Specifies the I2S Tx/Rx format of codec port. */
    uint32_t CODEC_I2SDataWidth;        /*!< Specifies the I2S Tx/Rx data width of codec port. */
    uint32_t CODEC_I2SChSequence;       /*!< Specifies the I2S Tx/Rx channel sequence. */
    uint32_t CODEC_MicBIAS;             /*!< Specifies the MICBIAS voltage. */
    uint32_t CODEC_MicBstGain;          /*!< Specifies the MICBST gain. */
    uint32_t CODEC_MicBstMode;          /*!< Specifies the MICBST mode. */

    /* MIC channel 0 initialization parameters section */
    uint32_t CODEC_Ch0Mute;             /*!< Specifies the channel 0 dmic mute status. */
    uint32_t CODEC_Ch0MicType;          /*!< Specifies the channel 0 mic type, which can be dmic or amic. */
    uint32_t CODEC_Ch0DmicDataLatch;    /*!< Specifies the channel 0 dmic data latch type. */
    uint32_t CODEC_Ch0AdGain;           /*!< Specifies the channel 0 ADC digital volume. */
    uint32_t CODEC_Ch0BoostGain;        /*!< Specifies the channel 0 boost gain. */
    uint32_t CODEC_Ch0ZeroDetTimeout;   /*!< Specifies the channel 0 zero detection timeout mode control. */

} CODEC_InitTypeDef;

/*============================================================================*
 *                         Register Defines
 *============================================================================*/

/* Peripheral: CODEC */
/* Description: CODEC register defines */

/* Register: ANA_CR0 ----------------------------------------------------------*/
/* Description: Control register 0. Offset: 0x00. Address: 0x40022000UL. */

/* ANA_CR0[10]: ADC_ANA_POW. 0x1: Powen on. 0x0: Power down. */
#define CODEC_ADC_ANA_POW_POS               (10)
#define CODEC_ADC_ANA_POW_MSK               (0x1 << CODEC_ADC_ANA_POW_POS)
#define CODEC_ADC_ANA_POW_CLR               (~CODEC_ADC_ANA_POW_MSK)
/* ANA_CR0[9]: DTSDM_CLK_EN. 0x1: Powen on. 0x0: Power down. */
#define CODEC_DTSDM_CLK_EN_POS              (9)
#define CODEC_DTSDM_CLK_EN_MSK              (0x1 << CODEC_DTSDM_CLK_EN_POS)
#define CODEC_DTSDM_CLK_EN_CLR              (~CODEC_DTSDM_CLK_EN_MSK)
/* ANA_CR0[0]: DAC_ADDACK_POW. 0x1: Powen on. 0x0: Power down. */
#define CODEC_DAC_ADDACK_POW_POS            (0)
#define CODEC_DAC_ADDACK_POW_MSK            (0x1 << CODEC_DAC_ADDACK_POW_POS)
#define CODEC_DAC_ADDACK_POW_CLR            (~CODEC_DAC_ADDACK_POW_MSK)

/* Register: ANA_CR1 ----------------------------------------------------------*/
/* Description: Control register 1. Offset: 0x04. Address: 0x40022004UL. */

/* ANA_CR1[27:26]: VREF_SEL. */
#define CODEC_VREF_SEL_POS                  (26)
#define CODEC_VREF_SEL_MSK                  (0x3 << CODEC_VREF_SEL_POS)
#define CODEC_VREF_SEL_CLR                  (~CODEC_VREF_SEL_MSK)
#define CODEC_VREF_SEL_DEFAULT_MSK          (0x2 << CODEC_VREF_SEL_POS)
/* ANA_CR1[25]: MICBST_POW. */
#define CODEC_MICBST_POW_POS                (25)
#define CODEC_MICBST_POW_MSK                (0x1 << CODEC_MICBST_POW_POS)
#define CODEC_MICBST_POW_CLR                (~CODEC_MICBST_POW_MSK)
/* ANA_CR1[21:20]: MICBST_MUTE. */
#define CODEC_MICBST_MUTE_POS               (20)
#define CODEC_MICBST_MUTE_MSK               (0x3 << CODEC_MICBST_MUTE_POS)
#define CODEC_MICBST_MUTE_CLR               (~CODEC_MICBST_MUTE_MSK)
#define CODEC_MICBST_MUTE_MIC_MSK           (0x2 << CODEC_MICBST_MUTE_POS)
/* ANA_CR1[17:16]: MICBST_GAIN. */
#define CODEC_MICBST_GAIN_POS               (16)
#define CODEC_MICBST_GAIN_MSK               (0x3 << CODEC_MICBST_GAIN_POS)
#define CODEC_MICBST_GAIN_CLR               (~CODEC_MICBST_GAIN_MSK)
/* ANA_CR1[15]: MICBST_VREF_POW. */
#define CODEC_MICBST_VREF_POW_POS           (15)
#define CODEC_MICBST_VREF_POW_MSK           (0x1 << CODEC_MICBST_VREF_POW_POS)
#define CODEC_MICBST_VREF_POW_CLR           (~CODEC_MICBST_VREF_POW_MSK)
/* ANA_CR1[14]: MICBST_ENDFL. */
#define CODEC_MICBST_ENDFL_POS              (14)
#define CODEC_MICBST_ENDFL_MSK              (0x1 << CODEC_MICBST_ENDFL_POS)
#define CODEC_MICBST_ENDFL_CLR              (~CODEC_MICBST_ENDFL_MSK)
/* ANA_CR1[13:11]: MICBIAS_VSET. */
#define CODEC_MICBIAS_VSET_POS              (11)
#define CODEC_MICBIAS_VSET_MSK              (0x7 << CODEC_MICBIAS_VSET_POS)
#define CODEC_MICBIAS_VSET_CLR              (~CODEC_MICBIAS_VSET_MSK)
/* ANA_CR1[10]: MICBIAS_POW. 0x1: Powen on. 0x0: Power down. */
#define CODEC_MICBIAS_POW_POS               (10)
#define CODEC_MICBIAS_POW_MSK               (0x1 << CODEC_MICBIAS_POW_POS)
#define CODEC_MICBIAS_POW_CLR               (~CODEC_MICBIAS_POW_MSK)
/* ANA_CR1[9]: MICBIAS_ENCHX. */
#define CODEC_MICBIAS_ENCHX_POS             (9)
#define CODEC_MICBIAS_ENCHX_MSK             (0x1 << CODEC_MICBIAS_ENCHX_POS)
#define CODEC_MICBIAS_ENCHX_CLR             (~CODEC_MICBIAS_ENCHX_MSK)

/* Register: ANA_CR2 ----------------------------------------------------------*/
/* Description: Control register 2. Offset: 0x08. Address: 0x40022008UL. */

/* ANA_CR2[15]: MICBIAS_LIMIT. */
#define CODEC_MICBIAS_LIMIT_POS             (15)
#define CODEC_MICBIAS_LIMIT_MSK             (0x1 << CODEC_MICBIAS_LIMIT_POS)
#define CODEC_MICBIAS_LIMIT_CLR             (~CODEC_MICBIAS_LIMIT_MSK)
#define CODEC_MICBIAS_LIMIT_DEFAULT_MSK     (0)

/* ANA_CR2[14]: MICBIAS_POWSHDT. */
#define CODEC_MICBIAS_POWSHDT_POS           (14)
#define CODEC_MICBIAS_POWSHDT_MSK           (0x1 << CODEC_MICBIAS_POWSHDT_POS)
#define CODEC_MICBIAS_POWSHDT_CLR           (~CODEC_MICBIAS_POWSHDT_MSK)
#define CODEC_MICBIAS_POWSHDT_DEFAULT_MSK   (0)

/* ANA_CR2[13:12]: MICBIAS_OCSEL. */
#define CODEC_MICBIAS_OCSEL_POS             (12)
#define CODEC_MICBIAS_OCSEL_MSK             (0x3 << CODEC_MICBIAS_OCSEL_POS)
#define CODEC_MICBIAS_OCSEL_CLR             (~CODEC_MICBIAS_OCSEL_MSK)
#define CODEC_MICBIAS_OCSEL_DEFAULT_MSK     (0x1 << CODEC_MICBIAS_OCSEL_POS)

/* ANA_CR2[11:8]: MICBIAS_COUNT. */
#define CODEC_MICBIAS_COUNT_POS             (8)
#define CODEC_MICBIAS_COUNT_MSK             (0xF << CODEC_MICBIAS_COUNT_POS)
#define CODEC_MICBIAS_COUNT_CLR             (~CODEC_MICBIAS_COUNT_MSK)
#define CODEC_MICBIAS_COUNT_DEFAULT_MSK     (0x1 << CODEC_MICBIAS_COUNT_POS)

/* Register: CR0 --------------------------------------------------------------*/
/* Description: audio Control register. Offset: 0x100. Address: 0x4002_2100UL. */

/* CR0[0]: AUDIO_IP_EN. */
#define CODEC_AUDIO_IP_EN_POS               (0)
#define CODEC_AUDIO_IP_EN_MSK               (0x1 << CODEC_AUDIO_IP_EN_POS)
#define CODEC_AUDIO_IP_EN_CLR               (~CODEC_AUDIO_IP_EN_MSK)

/* Register: ANA_CR1 -----------------------------------------------------------*/
/* Description: analog Control register. Offset: 0x104. Address: 0x4002_2104UL. */

/* ANA_CR1[3]: CKX_MICBIAS_EN. */
#define CODEC_CKX_MICBIAS_EN_POS           (3)
#define CODEC_CKX_MICBIAS_EN_MSK           (0x1 << CODEC_CKX_MICBIAS_EN_POS)
#define CODEC_CKX_MICBIAS_EN_CLR           (~CODEC_CKX_MICBIAS_EN_MSK)

/* Register: CLK_CR1 ----------------------------------------------------------*/
/* Description: clock Control register. Offset: 0x108. Address: 0x4002_2108UL. */

/* CLK_CR1[12]: AD_FILTER_CH0_CLK. 0x1: Enable clock. 0x0: Disable clock. */
#define CODEC_AD_FILTER_CH0_CLK_POS         (12)
#define CODEC_AD_FILTER_CH0_CLK_MSK         (0x1 << CODEC_AD_FILTER_CH0_CLK_POS)
#define CODEC_AD_FILTER_CH0_CLK_CLR         (~CODEC_AD_FILTER_CH0_CLK_MSK)
/* CLK_CR1[11]: AD_ANA_CLK_EN. 0x1: Enable ADC analog clock. 0x0: Disable ADC analog clock. */
#define CODEC_AD_ANA_CLK_EN_POS             (11)
#define CODEC_AD_ANA_CLK_EN_MSK             (0x1 << CODEC_AD_ANA_CLK_EN_POS)
#define CODEC_AD_ANA_CLK_EN_CLR             (~CODEC_AD_ANA_CLK_EN_MSK)
/* CLK_CR1[10]: AD_FIFO_CLK_EN. 0x1: Enable ADC FIFO clock. 0x0: Disable ADC FIFO clock. */
#define CODEC_AD_FIFO_CLK_EN_POS            (10)
#define CODEC_AD_FIFO_CLK_EN_MSK            (0x1 << CODEC_AD_FIFO_CLK_EN_POS)
#define CODEC_AD_FIFO_CLK_EN_CLR            (~CODEC_AD_FIFO_CLK_EN_MSK)
/* CLK_CR1[6]: AD_CH0_CLK. 0x1: Enable clock. 0x0: Disable clock. */
#define CODEC_AD_CH0_CLK_POS                (6)
#define CODEC_AD_CH0_CLK_MSK                (0x1 << CODEC_AD_CH0_CLK_POS)
#define CODEC_AD_CH0_CLK_CLR                (~CODEC_AD_CH0_CLK_MSK)

/* Register: CLK_CR2 ----------------------------------------------------------*/
/* Description: clock Control register. Offset: 0x10C. Address: 0x4002_210CUL. */

/* CLK_CR2[4]: DMIC1_CLK_SRC. 0x1: 8M. 0x0: 10M. */
#define CODEC_DMIC1_CLK_SRC_POS             (4)
#define CODEC_DMIC1_CLK_SRC_MSK             (0x1 << CODEC_DMIC1_CLK_SRC_POS)
#define CODEC_DMIC1_CLK_SRC_CLR             (~CODEC_DMIC1_CLK_SRC_MSK)
/* CLK_CR2[3]: DMIC1_CLK_EN. 0x1: Enable clock. 0x0: Disable clock. */
#define CODEC_DMIC1_CLK_EN_POS              (3)
#define CODEC_DMIC1_CLK_EN_MSK              (0x1 << CODEC_DMIC1_CLK_EN_POS)
#define CODEC_DMIC1_CLK_EN_CLR              (~CODEC_DMIC1_CLK_EN_MSK)
/* CLK_CR2[2:0]: DMIC1_CLK_SEL. */
#define CODEC_DMIC1_CLK_SEL_POS             (0)
#define CODEC_DMIC1_CLK_SEL_MSK             (0x7 << CODEC_DMIC1_CLK_SEL_POS)
#define CODEC_DMIC1_CLK_SEL_CLR             (~CODEC_DMIC1_CLK_SEL_MSK)

/* Register: CLK_CR3 ----------------------------------------------------------*/
/* Description: clock Control register. Offset: 0x110. Address: 0x4002_2110UL. */

/* CLK_CR3[13:12]: AD_LPF_CLK_SEL. */
#define CODEC_AD_LPF_CLK_SEL_POS            (12)
#define CODEC_AD_LPF_CLK_SEL_MSK            (0x3 << CODEC_AD_LPF_CLK_SEL_POS)
#define CODEC_AD_LPF_CLK_SEL_CLR            (~CODEC_AD_LPF_CLK_SEL_MSK)
//#define CODEC_AD_LPF_CLK_SEL_DEFAULT        (~CODEC_AD_LPF_CLK_SEL_MSK)

/* CLK_CR3[10]: ADC_LATCH_PHASE. */
#define CODEC_ADC_LATCH_PHASE_POS           (10)
#define CODEC_ADC_LATCH_PHASE_MSK           (0x1 << CODEC_ADC_LATCH_PHASE_POS)
#define CODEC_ADC_LATCH_PHASE_CLR           (~CODEC_ADC_LATCH_PHASE_MSK)

/* CLK_CR3[9]: AD_ANA_CLK_SEL. */
#define CODEC_AD_ANA_CLK_SEL_POS            (9)
#define CODEC_AD_ANA_CLK_SEL_MSK            (0x1 << CODEC_AD_ANA_CLK_SEL_POS)
#define CODEC_AD_ANA_CLK_SEL_CLR            (~CODEC_AD_ANA_CLK_SEL_MSK)

/* CLK_CR3[8]: ANA_CLK_RATE. */
#define CODEC_ANA_CLK_RATE_POS              (8)
#define CODEC_ANA_CLK_RATE_MSK              (0x1 << CODEC_ANA_CLK_RATE_POS)
#define CODEC_ANA_CLK_RATE_CLR              (~CODEC_ANA_CLK_RATE_MSK)

/* CLK_CR3[3:0]: SAMPLE_RATE. */
#define CODEC_SAMPLE_RATE_POS               (0)
#define CODEC_SAMPLE_RATE_MSK               (0xF << CODEC_SAMPLE_RATE_POS)
#define CODEC_SAMPLE_RATE_CLR               (~CODEC_SAMPLE_RATE_MSK)

/* Register: I2S_CTRL -------------------------------------------------------*/
/* Description: I2S Control register. Offset: 0x11C. Address: 0x4002_211CUL. */

/* I2S_CTRL[19:18]: I2S_RX_CH. */
#define CODEC_I2S_RX_CH_POS                 (18)
#define CODEC_I2S_RX_CH_MSK                 (0x3 << CODEC_I2S_RX_CH_POS)
#define CODEC_I2S_RX_CH_CLR                 (~CODEC_I2S_RX_CH_MSK)
/* I2S_CTRL[15:14]: I2S_RX_DATA_LEN. */
#define CODEC_I2S_RX_DATA_LEN_POS           (14)
#define CODEC_I2S_RX_DATA_LEN_MSK           (0x3 << CODEC_I2S_RX_DATA_LEN_POS)
#define CODEC_I2S_RX_DATA_LEN_CLR           (~CODEC_I2S_RX_DATA_LEN_MSK)
/* I2S_CTRL[11:10]: I2S_RX_DATA_FORMAT. */
#define CODEC_I2S_RX_DATA_FORMAT_POS        (10)
#define CODEC_I2S_RX_DATA_FORMAT_MSK        (0x3 << CODEC_I2S_RX_DATA_FORMAT_POS)
#define CODEC_I2S_RX_DATA_FORMAT_CLR        (~CODEC_I2S_RX_DATA_FORMAT_MSK)
/* I2S_CTRL[2]: I2S_SELF_LPBK. */
#define CODEC_I2S_SELF_LPBK_POS             (2)
#define CODEC_I2S_SELF_LPBK_MSK             (0x1 << CODEC_I2S_SELF_LPBK_POS)
#define CODEC_I2S_SELF_LPBK_CLR             (~CODEC_I2S_SELF_LPBK_MSK)
/* I2S_CTRL[1]: I2S_INV_SCLK. */
#define CODEC_I2S_INV_SCLK_POS              (1)
#define CODEC_I2S_INV_SCLK_MSK              (0x1 << CODEC_I2S_INV_SCLK_POS)
#define CODEC_I2S_INV_SCLK_CLR              (~CODEC_I2S_INV_SCLK_MSK)
/* I2S_CTRL[0]: AUDIO_RST_N. 0x1: Powen on. 0x0: Power down. */
#define CODEC_AUDIO_RST_N_POS               (0)
#define CODEC_AUDIO_RST_N_MSK               (0x1 << CODEC_AUDIO_RST_N_POS)
#define CODEC_AUDIO_RST_N_CLR               (~CODEC_AUDIO_RST_N_MSK)

/* Register: ADC0_CTRL0 -------------------------------------------------------*/
/* Description: ADC0 Control register. Offset: 0x120. Address: 0x4002_2120UL. */

/* ADC0_CTRL0[19:17]: ADC0_DCHPF_FC_SEL. */
#define CODEC_ADC0_DCHPF_FC_SEL_POS         (17)
#define CODEC_ADC0_DCHPF_FC_SEL_MSK         (0x7 << CODEC_ADC0_DCHPF_FC_SEL_POS)
#define CODEC_ADC0_DCHPF_FC_SEL_CLR         (~CODEC_ADC0_DCHPF_FC_SEL_MSK)

/* ADC0_CTRL0[16]: ADC0_DCHPF_EN. 0x1: enable. 0x0: disable. */
#define CODEC_ADC0_DCHPF_EN_POS             (16)
#define CODEC_ADC0_DCHPF_EN_MSK             (0x1 << CODEC_ADC0_DCHPF_EN_POS)
#define CODEC_ADC0_DCHPF_EN_CLR             (~CODEC_ADC0_DCHPF_EN_MSK)

/* ADC0_CTRL0[15]: AMIC_DMIC_CH0_SEL. 0x1: ADC path. 0x0: DMIC path. */
#define CODEC_AMIC_DMIC_CH0_SEL_POS         (15)
#define CODEC_AMIC_DMIC_CH0_SEL_MSK         (0x1 << CODEC_AMIC_DMIC_CH0_SEL_POS)
#define CODEC_AMIC_DMIC_CH0_SEL_CLR         (~CODEC_AMIC_DMIC_CH0_SEL_MSK)

/* ADC0_CTRL0[14:13]: ADC_CH0_BOOST_GAIN. */
#define CODEC_ADC_CH0_BOOST_GAIN_POS        (13)
#define CODEC_ADC_CH0_BOOST_GAIN_MSK        (0x3 << CODEC_ADC_CH0_BOOST_GAIN_POS)
#define CODEC_ADC_CH0_BOOST_GAIN_CLR        (~CODEC_ADC_CH0_BOOST_GAIN_MSK)

/* ADC0_CTRL0[12]: ADC_CH0_AD_MUTE. */
#define CODEC_ADC_CH0_AD_MUTE_POS           (12)
#define CODEC_ADC_CH0_AD_MUTE_MSK           (0x1 << CODEC_ADC_CH0_AD_MUTE_POS)
#define CODEC_ADC_CH0_AD_MUTE_CLR           (~CODEC_ADC_CH0_AD_MUTE_MSK)

/* ADC0_CTRL0[11:10]: ADC_CH0_ZDET_TOUT. */
#define CODEC_ADC_CH0_ZDET_TOUT_POS         (10)
#define CODEC_ADC_CH0_ZDET_TOUT_MSK         (0x3 << CODEC_ADC_CH0_ZDET_TOUT_POS)
#define CODEC_ADC_CH0_ZDET_TOUT_CLR         (~CODEC_ADC_CH0_ZDET_TOUT_MSK)

/* ADC0_CTRL0[9:8]: ADC_CH0_ZDET_FUN. 0x1: ADC path. 0x0: DMIC path. */
#define CODEC_ADC_CH0_ZDET_FUN_POS          (8)
#define CODEC_ADC_CH0_ZDET_FUN_MSK          (0x3 << CODEC_ADC_CH0_ZDET_FUN_POS)
#define CODEC_ADC_CH0_ZDET_FUN_CLR          (~CODEC_ADC_CH0_ZDET_FUN_MSK)
#define CODEC_ADC_CH0_ZDET_FUN_DEFAULT_MSK  (0x1 << CODEC_ADC_CH0_ZDET_FUN_POS)

/* ADC0_CTRL0[7:6]: ADC0_AD_LPF1ST_FC_SEL. */
#define CODEC_ADC0_AD_LPF1ST_FC_SEL_POS     (6)
#define CODEC_ADC0_AD_LPF1ST_FC_SEL_MSK     (0x3 << CODEC_ADC0_AD_LPF1ST_FC_SEL_POS)
#define CODEC_ADC0_AD_LPF1ST_FC_SEL_CLR     (~CODEC_ADC0_AD_LPF1ST_FC_SEL_MSK)

/* ADC0_CTRL0[5]: ADC0_AD_LPF1ST_EN. 0x1: enable. 0x0: disable. */
#define CODEC_ADC0_AD_LPF1ST_EN_POS         (5)
#define CODEC_ADC0_AD_LPF1ST_EN_MSK         (0x1 << CODEC_ADC0_AD_LPF1ST_EN_POS)
#define CODEC_ADC0_AD_LPF1ST_EN_CLR         (~CODEC_ADC0_AD_LPF1ST_EN_MSK)

/* ADC0_CTRL0[4]: ADC0_AD_LPF2ND_EN. 0x1: enable. 0x0: disable. */
#define CODEC_ADC0_AD_LPF2ND_EN_POS         (4)
#define CODEC_ADC0_AD_LPF2ND_EN_MSK         (0x1 << CODEC_ADC0_AD_LPF2ND_EN_POS)
#define CODEC_ADC0_AD_LPF2ND_EN_CLR         (~CODEC_ADC0_AD_LPF2ND_EN_MSK)

/* ADC0_CTRL0[1:0]: ADC0_DMIC_SRC_SEL. */
#define CODEC_ADC0_DMIC_SRC_SEL_POS         (0)
#define CODEC_ADC0_DMIC_SRC_SEL_MSK         (0x3 << CODEC_ADC0_DMIC_SRC_SEL_POS)
#define CODEC_ADC0_DMIC_SRC_SEL_CLR         (~CODEC_ADC0_DMIC_SRC_SEL_MSK)

#define CODEC_ADC0_CTRL0_REG_DEFAULT_MSK    ((0x2 << 17) | (0x01 << 16) | (0x01 << 10) | (0x02 << 8) | (0x03 <<4))

/*============================================================================*
 *                         Constants
 *============================================================================*/

/**
 * \defgroup    CODEC_Exported_Constants    Macro Definitions
 *
 * \ingroup     CODEC
 */

#define IS_CODEC_PERIPH(PERIPH) ((PERIPH) == CODEC)

/**
 * \defgroup    MICBST_Gain MICBST Gain
 * \{
 * \ingroup     CODEC_Exported_Constants
 */
#define MICBST_Gain_0dB                     ((uint32_t)(0x0))
#define MICBST_Gain_20dB                    ((uint32_t)(0x1 << CODEC_MICBST_GAIN_POS))
#define MICBST_Gain_30dB                    ((uint32_t)(0x2 << CODEC_MICBST_GAIN_POS))
#define MICBST_Gain_40dB                    ((uint32_t)(0x3 << CODEC_MICBST_GAIN_POS))
/** \} */
#define IS_MICBST_GAIN(GAIN) (((GAIN) == MICBST_Gain_0dB) || \
                              ((GAIN) == MICBST_Gain_20dB) || \
                              ((GAIN) == MICBST_Gain_30dB) || \
                              ((GAIN) == MICBST_Gain_40dB))

/**
 * \defgroup    MICBST_Mode MICBST Mode
 * \{
 * \ingroup     CODEC_Exported_Constants
 */
#define MICBST_Mode_Single                  ((uint32_t)(0x0))
#define MICBST_Mode_Differential            ((uint32_t)CODEC_MICBST_ENDFL_MSK)
/** \} */
#define IS_MICBST_MODE(MODE) (((MODE) == MICBST_Mode_Single) || \
                              ((MODE) == MICBST_Mode_Differential))

/**
 * \defgroup    CODEC_MIC_BIAS_Config CODEC MIC BIAS Config
 * \{
 * \ingroup     CODEC_Exported_Constants
 */

#define MICBIAS_VOLTAGE_1_507               ((uint32_t)(0x00))
#define MICBIAS_VOLTAGE_1_62                ((uint32_t)(0x01 << CODEC_MICBIAS_VSET_POS))
#define MICBIAS_VOLTAGE_1_705               ((uint32_t)(0x02 << CODEC_MICBIAS_VSET_POS))
#define MICBIAS_VOLTAGE_1_8                 ((uint32_t)(0x03 << CODEC_MICBIAS_VSET_POS))
#define MICBIAS_VOLTAGE_1_906               ((uint32_t)(0x04 << CODEC_MICBIAS_VSET_POS))
#define MICBIAS_VOLTAGE_2_025               ((uint32_t)(0x05 << CODEC_MICBIAS_VSET_POS))
#define MICBIAS_VOLTAGE_2_16                ((uint32_t)(0x06 << CODEC_MICBIAS_VSET_POS))
#define MICBIAS_VOLTAGE_2_314               ((uint32_t)(0x07 << CODEC_MICBIAS_VSET_POS))
/** \} */

#define IS_MICBIAS_CONFIG(CONFIG) (((CONFIG) == MICBIAS_VOLTAGE_1_507) || ((CONFIG) == MICBIAS_VOLTAGE_1_62) || \
                                   ((CONFIG) == MICBIAS_VOLTAGE_1_705) || ((CONFIG) == MICBIAS_VOLTAGE_1_8) || \
                                   ((CONFIG) == MICBIAS_VOLTAGE_1_906) || ((CONFIG) == MICBIAS_VOLTAGE_2_025) || \
                                   ((CONFIG) == MICBIAS_VOLTAGE_2_16) || ((CONFIG) == MICBIAS_VOLTAGE_2_314))

/**
 * \defgroup    Sample_Rate_Definition  Sample Rate Definition
 * \{
 * \ingroup     CODEC_Exported_Constants
 */
#define SAMPLE_RATE_48KHz                   ((uint32_t)(0x00 << CODEC_SAMPLE_RATE_POS))
#define SAMPLE_RATE_16KHz                   ((uint32_t)(0x05 << CODEC_SAMPLE_RATE_POS))
#define SAMPLE_RATE_8KHz                    ((uint32_t)(0x07 << CODEC_SAMPLE_RATE_POS))
/** \} */

#define IS_SAMPLE_RATE(RATE) (((RATE) == SAMPLE_RATE_16KHz) || ((RATE) == SAMPLE_RATE_8KHz)))

/**
 * \defgroup    CODEC_I2S_CH CODEC I2S CH
 * \{
 * \ingroup     CODEC_Exported_Constants
 */
#define CODEC_I2S_CH_L_R                    ((uint32_t)(0x00))
#define CODEC_I2S_CH_R_L                    ((uint32_t)(0x01 << CODEC_I2S_RX_CH_POS))
#define CODEC_I2S_CH_L_L                    ((uint32_t)(0x02 << CODEC_I2S_RX_CH_POS))
#define CODEC_I2S_CH_R_R                    ((uint32_t)(0x03 << CODEC_I2S_RX_CH_POS))
/** \} */

#define IS_CODEC_I2S_CH(CH) (((CH) == CODEC_I2S_CH_L_R) || \
                             ((CH) == CODEC_I2S_CH_R_L) || \
                             ((CH) == CODEC_I2S_CH_L_L) || \
                             ((CH) == CODEC_I2S_CH_R_R))

/**
 * \defgroup    I2S_Data_Width I2S Data Width
 * \{
 * \ingroup     CODEC_Exported_Constants
 */
#define CODEC_I2S_DataWidth_16Bits          ((uint32_t)(0x00))
#define CODEC_I2S_DataWidth_24Bits          ((uint32_t)(0x02 << CODEC_I2S_RX_DATA_LEN_POS)
#define CODEC_I2S_DataWidth_8Bits           ((uint32_t)(0x03 << CODEC_I2S_RX_DATA_LEN_POS)
/** \} */
#define IS_CODEC_I2S_DATA_WIDTH(WIDTH) (((WIDTH) == CODEC_I2S_DataWidth_16Bits) || \
                                        ((WIDTH) == CODEC_I2S_DataWidth_24Bits) || \
                                        ((WIDTH) == CODEC_I2S_DataWidth_8Bits))

/**
 * \defgroup    I2S_Data_Format I2S Data Format
 * \{
 * \ingroup     CODEC_Exported_Constants
 */
#define CODEC_I2S_DataFormat_I2S            ((uint32_t)(0x00))
#define CODEC_I2S_DataFormat_LeftJustified  ((uint32_t)(0x01 << CODEC_I2S_RX_DATA_FORMAT_POS)
#define CODEC_I2S_DataFormat_PCM_A          ((uint32_t)(0x02 << CODEC_I2S_RX_DATA_FORMAT_POS)
#define CODEC_I2S_DataFormat_PCM_B          ((uint32_t)(0x03 << CODEC_I2S_RX_DATA_FORMAT_POS)
/** \} */

#define IS_CODEC_I2S_DATA_FORMAT(FORMAT) (((FORMAT) == CODEC_I2S_DataFormat_I2S) || \
                                          ((FORMAT) == CODEC_I2S_DataFormat_LeftJustified) || \
                                          ((FORMAT) == CODEC_I2S_DataFormat_PCM_A) || \
                                          ((FORMAT) == CODEC_I2S_DataFormat_PCM_B))

/**
 * \defgroup    DMIC_Clock_Type_Definition DMIC Clock Type Definition
 * \{
 * \ingroup     CODEC_Exported_Constants
 */
#define DMIC_Clock_5MHz                     ((uint32_t)(0x0))
#define DMIC_Clock_2500KHz                  ((uint32_t)(0x01 << CODEC_DMIC1_CLK_SEL_POS))
#define DMIC_Clock_1250KHz                  ((uint32_t)(0x02 << CODEC_DMIC1_CLK_SEL_POS))
#define DMIC_Clock_625KHz                   ((uint32_t)(0x03 << CODEC_DMIC1_CLK_SEL_POS))
#define DMIC_Clock_312500Hz                 ((uint32_t)(0x04 << CODEC_DMIC1_CLK_SEL_POS))
/** \} */

#define IS_CODEC_DMIC_CLOCK(CLOCK) (((CLOCK) == DMIC_Clock_5MHz) || ((CLOCK) == DMIC_Clock_2500KHz) || \
                                    ((CLOCK) == DMIC_Clock_1250KHz) || ((CLOCK) == DMIC_Clock_625KHz) || \
                                    ((CLOCK) == DMIC_Clock_312500Hz))

/**
 * \defgroup    CODEC_Ch0_Mic_Type CODEC Ch0 Mic Type
 * \{
 * \ingroup     CODEC_Exported_Constants
 */
#define CODEC_CH0_AMIC                      (CODEC_AMIC_DMIC_CH0_SEL_MSK)
#define CODEC_CH0_DMIC                      (0)
/** \} */

#define IS_CODEC_CH0_MIC_TYPE(TYPE) (((TYPE) == CODEC_CH0_AMIC) || ((TYPE) == CODEC_CH0_DMIC))

/**
 * \defgroup    Ch0_Boost_Gain Ch0 Boost Gain
 * \{
 * \ingroup     CODEC_Exported_Constants
 */
#define Ch0_Boost_Gain_0dB                  ((uint32_t)(0x0))
#define Ch0_Boost_Gain_12dB                 ((uint32_t)(0x1 << CODEC_ADC_CH0_BOOST_GAIN_POS))
#define Ch0_Boost_Gain_24dB                 ((uint32_t)(0x2 << CODEC_ADC_CH0_BOOST_GAIN_POS))
#define Ch0_Boost_Gain_36dB                 ((uint32_t)(0x3 << CODEC_ADC_CH0_BOOST_GAIN_POS))
/** \} */

#define IS_CH0_BOOST_GAIN(GAIN) (((GAIN) == Ch0_Boost_Gain_0dB) || \
                                 ((GAIN) == Ch0_Boost_Gain_12dB) || \
                                 ((GAIN) == Ch0_Boost_Gain_24dB) || \
                                 ((GAIN) == Ch0_Boost_Gain_36dB))

/**
 * \defgroup    CODEC_Ch0_Mute CODEC Ch0 Mute
 * \{
 * \ingroup     CODEC_Exported_Constants
 */
#define CODEC_CH0_MUTE                      (CODEC_ADC_CH0_AD_MUTE_MSK)
#define CODEC_CH0_UNMUTE                    (0)
/** \} */

#define IS_CODEC_CH0_MIC_MUTE(MUTE) (((MUTE) == CODEC_CH0_MUTE) || ((MUTE) == CODEC_CH0_UNMUTE))

/**
 * \defgroup    Ch0_ADC_Zero_Detection_Timeout Ch0 ADC Zero Detection Timeout
 * \{
 * \ingroup     CODEC_Exported_Constants
 */
#define Ch0_ADC_Zero_DetTimeout_1024_16_Sample       ((uint32_t)(0x00))
#define Ch0_ADC_Zero_DetTimeout_1024_32_Sample       ((uint32_t)(0x01 << CODEC_ADC_CH0_ZDET_TOUT_POS))
#define Ch0_ADC_Zero_DetTimeout_1024_64_Sample       ((uint32_t)(0x02 << CODEC_ADC_CH0_ZDET_TOUT_POS))
#define Ch0_ADC_Zero_DetTimeout_64_Sample            ((uint32_t)(0x03 << CODEC_ADC_CH0_ZDET_TOUT_POS))
/** \} */

#define IS_CH0_ADC_ZERO_DET_TIMEOUT(TIMEOUT) (((TIMEOUT) == Ch0_ADC_Zero_DetTimeout_1024_16_Sample) || \
                                              ((TIMEOUT) == Ch0_ADC_Zero_DetTimeout_1024_32_Sample) || \
                                              ((TIMEOUT) == Ch0_ADC_Zero_DetTimeout_1024_64_Sample) || \
                                              ((TIMEOUT) == Ch0_ADC_Zero_DetTimeout_64_Sample))

/**
 * \defgroup    DMIC_Data_Latch_Edge DMIC Data Latch Edge
 * \{
 * \ingroup     CODEC_Exported_Constants
 */
#define DMIC_Ch0_Falling_Latch              ((uint32_t)(0x01 << CODEC_ADC0_DMIC_SRC_SEL_MSK))
#define DMIC_Ch0_Rising_Latch               ((uint32_t)(0x00))
/** \} */

#define IS_DMIC_CH0_LATCH_EDGE(EDGE) (((EDGE) == DMIC_Ch0_Rising_Latch) || ((EDGE) == DMIC_Ch0_Falling_Latch))

/**
 * \def CODEC_Ad_Gain Codec Ad Gain
 */

#define IS_AD_GAIN(GAIN) (((GAIN)<= 0x7F))

/**
 * \def CODEC_Da_Gain Codec Da Gain
 */
#define IS_DA_GAIN(GAIN) (((GAIN)<= 0xFF))

/*============================================================================*
 *                         Functions
 *============================================================================*/

/**
 * \defgroup    CODEC_Exported_Functions Peripheral APIs
 * \{
 * \ingroup     CODEC
 */

void CODEC_AnalogCircuitInit(void);

/**
 * \brief   Deinitializes the CODEC peripheral registers to their default reset values(turn off CODEC clock).
 * \param[in] CODECx: CODEC peripheral selected .
 * \return None.
 *
 * <b>Example usage</b>
 * \code{.c}
 *
 * void driver_codec_init(void)
 * {
 *     CODEC_DeInit(CODEC);
 * }
 * \endcode
 */
void CODEC_DeInit(CODEC_TypeDef *CODECx);

/**
 * \brief   Initializes the CODEC peripheral according to the specified
 *          parameters in the CODEC_InitStruct.
 * \param[in] CODECx: CODEC peripheral selected.
 * \param[in] CODEC_InitStruct: Pointer to a CODEC_InitTypeDef structure that
 *            contains the configuration information for the specified CODEC peripheral
 * \return None.
 *
 * <b>Example usage</b>
 * \code{.c}
 *
 * void driver_codec_init(void)
 * {
 *     RCC_PeriphClockCmd(APBPeriph_CODEC, APBPeriph_CODEC_CLOCK, ENABLE);
 *
 *     CODEC_InitTypeDef CODEC_InitStruct;

 *     CODEC_StructInit(&CODEC_InitStruct);
 *     CODEC_InitStruct.CODEC_Ch0MicType       = CODEC_CH0_AMIC;
 *     CODEC_InitStruct.CODEC_MicBstMode       = MICBST_Mode_Differential;
 *     CODEC_InitStruct.CODEC_SampleRate       = SAMPLE_RATE_16KHz;
 *     CODEC_InitStruct.CODEC_I2SFormat        = CODEC_I2S_DataFormat_I2S;
 *     CODEC_InitStruct.CODEC_I2SDataWidth     = CODEC_I2S_DataWidth_16Bits;
 *     CODEC_Init(CODEC, &CODEC_InitStruct);
 * }
 * \endcode
 */
void CODEC_Init(CODEC_TypeDef *CODECx, CODEC_InitTypeDef *CODEC_InitStruct);

/**
 * \brief   Fills each CODEC_InitStruct member with its default value.
 * \param[in] CODEC_InitStruct: Pointer to a CODEC_InitTypeDef structure which will be initialized.
 * \return None.
 *
 * <b>Example usage</b>
 * \code{.c}
 *
 * void driver_codec_init(void)
 * {
 *     RCC_PeriphClockCmd(APBPeriph_CODEC, APBPeriph_CODEC_CLOCK, ENABLE);
 *
 *     CODEC_InitTypeDef CODEC_InitStruct;

 *     CODEC_StructInit(&CODEC_InitStruct);
 *     CODEC_InitStruct.CODEC_Ch0MicType       = CODEC_CH0_AMIC;
 *     CODEC_InitStruct.CODEC_MicBstMode       = MICBST_Mode_Differential;
 *     CODEC_InitStruct.CODEC_SampleRate       = SAMPLE_RATE_16KHz;
 *     CODEC_InitStruct.CODEC_I2SFormat        = CODEC_I2S_DataFormat_I2S;
 *     CODEC_InitStruct.CODEC_I2SDataWidth     = CODEC_I2S_DataWidth_16Bits;
 *     CODEC_Init(CODEC, &CODEC_InitStruct);
 * }
 * \endcode
 */
void CODEC_StructInit(CODEC_InitTypeDef *CODEC_InitStruct);

/**
 * \brief  Enable or disable mic_bias output.
 * \param[in] CODECx: CODEC peripheral selected.
 * \param[in] NewState: New state of MICBIAS.
 *      This parameter can be: ENABLE or DISABLE.
 * \return none.
 *
 * <b>Example usage</b>
 * \code{.c}
 *
 * void codec_demo(void)
 * {
 *     CODEC_MICBIASCmd(CODEC, ENABLE);
 * }
 * \endcode
 */
void CODEC_MICBIASCmd(CODEC_TypeDef *CODECx, FunctionalState NewState);

/**
 * \brief  Reset CODEC.
 * \param[in] CODECx: CODEC peripheral selected.
 * \return None.
 *
 * <b>Example usage</b>
 * \code{.c}
 *
 * void codec_demo(void)
 * {
 *     CODEC_Reset(CODEC);
 * }
 * \endcode
 */
__STATIC_INLINE void CODEC_Reset(CODEC_TypeDef *CODECx)
{
    /* Check the parameters */
    assert_param(IS_CODEC_PERIPH(CODECx));

    /* CODEC IP reset */
    CODECx->CR0 &= CODEC_AUDIO_IP_EN_CLR;;
    CODECx->CR0 = CODEC_AUDIO_IP_EN_MSK;;
}

/**
 * \brief   Config MIC BIAS Vref voltage.
 * \param[in] CODECx: CODEC peripheral selected.
 * \param[in] data: New value of MIC BIAS.
 *   This parameter can be one of the following values:
 *     \arg MICBIAS_VOLTAGE_1_507: Vref voltage is 1.507V.
 *     \arg MICBIAS_VOLTAGE_1_62:  Vref voltage is 1.62V.
 *     \arg MICBIAS_VOLTAGE_1_705: Vref voltage is 1.705V.
 *     \arg MICBIAS_VOLTAGE_1_8: Vref voltage is 1.8V.
 *     \arg MICBIAS_VOLTAGE_1_906: Vref voltage is 1.906V.
 *     \arg MICBIAS_VOLTAGE_2_025:  Vref voltage is 2.025V.
 *     \arg MICBIAS_VOLTAGE_2_16: Vref voltage is 2.16V.
 *     \arg MICBIAS_VOLTAGE_2_314: Vref voltage is 2.314V.
 * \return None.
 *
 * <b>Example usage</b>
 * \code{.c}
 *
 * void codec_demo(void)
 * {
 *     CODEC_SetMICBIAS(CODEC, MICBIAS_VOLTAGE_1_507);
 * }
 * \endcode
 */
__STATIC_INLINE void CODEC_SetMICBIAS(CODEC_TypeDef *CODECx,  uint16_t data)

{
    /* Check the parameters */
    assert_param(IS_CODEC_PERIPH(CODECx));
    assert_param(IS_MICBIAS_CONFIG(data));

    CODEC_ANA->ANA_CR1 &= CODEC_MICBIAS_POW_CLR;
    CODEC_ANA->ANA_CR1 &= CODEC_MICBIAS_VSET_CLR;
    CODEC_ANA->ANA_CR1 |= data;
}

/** \} */ /* End of group CODEC_Exported_Functions */

#ifdef __cplusplus
}
#endif

#endif /* _RTL876X_CODEC_H_ */


/******************* (C) COPYRIGHT 2019 Realtek Semiconductor *****END OF FILE****/