1 #ifndef _BFLB_AUADC_H
2 #define _BFLB_AUADC_H
3 
4 #include "bflb_core.h"
5 
6 /**
7  *  @defgroup AUADC_SAMPLING_RATE auadc sampling rate
8  */
9 #define AUADC_SAMPLING_RATE_8K           0  /* audio mode */
10 #define AUADC_SAMPLING_RATE_16K          1  /* audio mode */
11 #define AUADC_SAMPLING_RATE_24K          2  /* audio mode, same as 22.02K, adjust the AUPLL clock */
12 #define AUADC_SAMPLING_RATE_32K          3  /* audio mode */
13 #define AUADC_SAMPLING_RATE_48K          4  /* audio mode, same as 44.1K, adjust the AUPLL clock */
14 #define AUADC_SAMPLING_RATE_MEASURE_128K 8  /* only used in ADC measurement mode */
15 #define AUADC_SAMPLING_RATE_MEASURE_256K 9  /* only used in ADC measurement mode */
16 #define AUADC_SAMPLING_RATE_MEASURE_512K 10 /* only used in ADC measurement mode */
17 /**
18   * @}
19   */
20 
21 /**
22  *  @defgroup AUADC_INPUT_MODE auadc input mode
23  */
24 #define AUADC_INPUT_MODE_ADC             0 /* Analog ADC */
25 #define AUADC_INPUT_MODE_PDM_L           1 /* PDM left channel */
26 #define AUADC_INPUT_MODE_PDM_R           2 /* PDM right channel */
27 /**
28   * @}
29   */
30 
31 /**
32  *  @defgroup AUADC_DATA_FORMAT auadc data format
33  */
34 #define AUADC_DATA_FORMAT_16BIT          3
35 #define AUADC_DATA_FORMAT_20BIT          2
36 #define AUADC_DATA_FORMAT_24BIT          1
37 #define AUADC_DATA_FORMAT_32BIT          0
38 /**
39   * @}
40   */
41 
42 /**
43  *  @brief AUADC_ADC_ANALOG_CH auadc adc input ch
44  */
45 #define AUADC_ADC_ANALOG_CH_0            0
46 #define AUADC_ADC_ANALOG_CH_1            1
47 #define AUADC_ADC_ANALOG_CH_2            2
48 #define AUADC_ADC_ANALOG_CH_3            3
49 #define AUADC_ADC_ANALOG_CH_4            4
50 #define AUADC_ADC_ANALOG_CH_5            5
51 #define AUADC_ADC_ANALOG_CH_6            6
52 #define AUADC_ADC_ANALOG_CH_7            7
53 /**
54   * @}
55   */
56 
57 /**
58  *  @brief AUADC_ADC_MEASURE_RATE auadc adc Sampling rate in measurement mode, @ AUADC_SAMPLING_RATE_MEASURE_256K
59  */
60 
61 #define AUADC_ADC_MEASURE_RATE_SPS_2_5   0
62 #define AUADC_ADC_MEASURE_RATE_SPS_5     1
63 #define AUADC_ADC_MEASURE_RATE_SPS_10    2
64 #define AUADC_ADC_MEASURE_RATE_SPS_20    3
65 #define AUADC_ADC_MEASURE_RATE_SPS_25    4
66 #define AUADC_ADC_MEASURE_RATE_SPS_50    5
67 #define AUADC_ADC_MEASURE_RATE_SPS_100   6
68 #define AUADC_ADC_MEASURE_RATE_SPS_200   7
69 #define AUADC_ADC_MEASURE_RATE_SPS_400   8
70 #define AUADC_ADC_MEASURE_RATE_SPS_800   9
71 #define AUADC_ADC_MEASURE_RATE_SPS_1000  10
72 #define AUADC_ADC_MEASURE_RATE_SPS_2000  11
73 #define AUADC_ADC_MEASURE_RATE_SPS_4000  12
74 
75 /**
76   * @}
77   */
78 
79 /**
80  *  @brief AUADC_ADC_MODE auadc adc mode
81  */
82 #define AUADC_ADC_MODE_AUDIO             0
83 #define AUADC_ADC_MODE_MEASURE           1
84 /**
85   * @}
86   */
87 
88 /**
89  *  @brief AUADC_ADC_PGA_MODE auadc adc mode, Ac or DC, differential or single
90  */
91 #define AUADC_ADC_PGA_MODE_AC_DIFFER     0
92 #define AUADC_ADC_PGA_MODE_AC_SINGLE     1
93 #define AUADC_ADC_PGA_MODE_DC_DIFFER     2
94 #define AUADC_ADC_PGA_MODE_DC_SINGLE     3
95 /**
96   * @}
97   */
98 
99 /** @defgroup AUADC_INTMASK auadc interrupt status definition
100   * @{
101   */
102 #define AUADC_INTMASK_FIFO_OVER          (1 << 1)
103 #define AUADC_INTMASK_FIFO_UNDER         (1 << 2)
104 #define AUADC_INTMASK_FIFO_AVAILABLE     (1 << 3)
105 /**
106   * @}
107   */
108 
109 /** @defgroup AUADC_INTSTS auadc interrupt status definition
110   * @{
111   */
112 #define AUADC_INTSTS_FIFO_OVER           (1 << 1)
113 #define AUADC_INTSTS_FIFO_UNDER          (1 << 2)
114 #define AUADC_INTSTS_FIFO_AVAILABLE      (1 << 4)
115 /**
116   * @}
117   */
118 
119 /** @defgroup AUADC_CMD auadc feature control cmd definition
120   * @{
121   */
122 #define AUADC_CMD_RECORD_START           (0x01)
123 #define AUADC_CMD_RECORD_STOP            (0x02)
124 #define AUADC_CMD_SET_VOLUME_VAL         (0x03)
125 #define AUADC_CMD_SET_PGA_GAIN_VAL       (0x04)
126 #define AUADC_CMD_CLEAR_RX_FIFO          (0x05)
127 #define AUADC_CMD_GET_RX_FIFO_CNT        (0x06)
128 /**
129   * @}
130   */
131 
132 /**
133  * @brief auadc initialization configuration structure
134  *
135  * @param sampling_rate         auadc sampling rate, use @ref AUADC_SAMPLING_RATE
136  * @param input_mode            auadc mode, use @ref AUADC_INPUT_MODE
137  * @param data_format           auadc fifo data format, use @ref AUADC_DATA_FORMAT
138  * @param fifo_threshold        auadc tx fifo threshold, 0 ~ 7
139  */
140 struct bflb_auadc_init_config_s {
141     uint8_t sampling_rate;
142     uint8_t input_mode;
143     uint8_t data_format;
144     uint8_t fifo_threshold;
145 };
146 
147 /**
148  * @brief auadc adc analog initialization configuration structure
149  *
150  * @param analog_adc_en         auadc sampling rate, use true or false
151  * @param adc_mode              auadc adc work pattern, use @ref AUADC_ADC_MODE
152  * @param adc_pga_mode          auadc adc PGA mode, use @ref AUADC_ADC_PGA_MODE
153  * @param adc_pga_posi_ch       auadc adc positive channel selection, use @ref AUADC_ADC_ANALOG_CH
154  * @param adc_pga_nega_ch       auadc adc negative channel selection, This channel is valid only when adc_pga_mode is differential, use @ref AUADC_ADC_ANALOG_CH
155  * @param adc_pga_gain          auadc adc PGA Gain control, 6dB ~ 42dB, step by 3db
156  * @param adc_measure_rate      auadc adc sampling rate in measurement mode @ AUADC_SAMPLING_RATE_MEASURE_256K, use @ref AUADC_ADC_MEASURE_RATE
157  */
158 struct bflb_auadc_adc_init_config_s {
159     uint8_t auadc_analog_en;
160     uint8_t adc_mode;
161     uint8_t adc_pga_mode;
162     uint8_t adc_pga_posi_ch;
163     uint8_t adc_pga_nega_ch;
164     uint8_t adc_pga_gain;
165     uint8_t adc_measure_rate;
166 };
167 
168 int bflb_auadc_init(struct bflb_device_s *dev, const struct bflb_auadc_init_config_s *config);
169 
170 int bflb_auadc_adc_init(struct bflb_device_s *dev, const struct bflb_auadc_adc_init_config_s *config);
171 
172 int bflb_auadc_link_rxdma(struct bflb_device_s *dev, bool enable);
173 
174 int bflb_auadc_int_mask(struct bflb_device_s *dev, uint32_t int_sts);
175 
176 int bflb_auadc_int_unmask(struct bflb_device_s *dev, uint32_t int_sts);
177 
178 int bflb_auadc_get_intstatus(struct bflb_device_s *dev);
179 
180 int bflb_auadc_feature_control(struct bflb_device_s *dev, int cmd, size_t arg);
181 
182 #endif