1 #include "bflb_acomp.h"
2 #include "bflb_core.h"
3 #include "bflb_gpio.h"
4 #include "hardware/acomp_reg.h"
5
6 #if defined(BL702) || defined(BL602) || defined(BL702L)
7 #define ACOMP_BASE ((uint32_t)0x4000f000)
8 #elif defined(BL616) || defined(BL606P) || defined(BL808) || defined(BL628)
9 #define ACOMP_BASE ((uint32_t)0x2000f000)
10 #endif
11
bflb_acomp_init(uint8_t acomp_id,const struct bflb_acomp_config_s * config)12 void bflb_acomp_init(uint8_t acomp_id, const struct bflb_acomp_config_s *config)
13 {
14 uint32_t regval;
15 uint32_t reg_base;
16
17 if(AON_ACOMP0_ID == acomp_id){
18 reg_base = ACOMP_BASE + AON_ACOMP_REG_ACOMP0_CTRL_OFFSET;
19 } else {
20 reg_base = ACOMP_BASE + AON_ACOMP_REG_ACOMP1_CTRL_OFFSET;
21 }
22
23 /* disable ACOMPx */
24 regval = getreg32(reg_base);
25 regval &=~ AON_ACOMP_EN;
26 putreg32(regval, reg_base);
27
28 /* set ACOMPx config */
29 if(config->mux_en) {
30 regval |= AON_ACOMP_MUX_EN;
31 } else {
32 regval &=~ AON_ACOMP_MUX_EN;
33 }
34 regval &=~ AON_ACOMP_POS_SEL_MASK;
35 regval |= (config->pos_chan_sel << AON_ACOMP_POS_SEL_SHIFT);
36 regval &=~ AON_ACOMP_NEG_SEL_MASK;
37 regval |= (config->neg_chan_sel << AON_ACOMP_NEG_SEL_SHIFT);
38 regval &=~ AON_ACOMP_LEVEL_SEL_MASK;
39 regval |= (config->scaling_factor << AON_ACOMP_LEVEL_SEL_SHIFT);
40 regval &=~ AON_ACOMP_BIAS_PROG_MASK;
41 regval |= (config->bias_prog << AON_ACOMP_BIAS_PROG_SHIFT);
42 regval &=~ AON_ACOMP_HYST_SELP_MASK;
43 regval |= (config->hysteresis_pos_volt << AON_ACOMP_HYST_SELP_SHIFT);
44 regval &=~ AON_ACOMP_HYST_SELN_MASK;
45 regval |= (config->hysteresis_neg_volt << AON_ACOMP_HYST_SELN_SHIFT);
46 putreg32(regval, reg_base);
47
48 reg_base = ACOMP_BASE + AON_ACOMP_REG_ACOMP_CFG_OFFSET;
49 regval = getreg32(reg_base);
50 regval &=~ AON_ACOMP_VREF_SEL_MASK;
51 regval |= (config->vio_sel << AON_ACOMP_POS_SEL_SHIFT);
52 putreg32(regval, reg_base);
53 }
54
bflb_acomp_enable(uint8_t acomp_id)55 void bflb_acomp_enable(uint8_t acomp_id)
56 {
57 uint32_t regval;
58 uint32_t reg_base;
59
60 if(AON_ACOMP0_ID == acomp_id){
61 reg_base = ACOMP_BASE + AON_ACOMP_REG_ACOMP0_CTRL_OFFSET;
62 } else {
63 reg_base = ACOMP_BASE + AON_ACOMP_REG_ACOMP1_CTRL_OFFSET;
64 }
65
66 regval = getreg32(reg_base);
67 regval |= AON_ACOMP_EN;
68 putreg32(regval, reg_base);
69 }
70
bflb_acomp_disable(uint8_t acomp_id)71 void bflb_acomp_disable(uint8_t acomp_id)
72 {
73 uint32_t regval;
74 uint32_t reg_base;
75
76 if(AON_ACOMP0_ID == acomp_id){
77 reg_base = ACOMP_BASE + AON_ACOMP_REG_ACOMP0_CTRL_OFFSET;
78 } else {
79 reg_base = ACOMP_BASE + AON_ACOMP_REG_ACOMP1_CTRL_OFFSET;
80 }
81
82 /* disable ACOMPx */
83 regval = getreg32(reg_base);
84 regval &=~ AON_ACOMP_EN;
85 putreg32(regval, reg_base);
86 }
87
bflb_acomp_get_result(uint8_t acomp_id)88 uint32_t bflb_acomp_get_result(uint8_t acomp_id)
89 {
90 uint32_t regval;
91 uint32_t reg_base;
92
93 reg_base = ACOMP_BASE + AON_ACOMP_REG_ACOMP_CFG_OFFSET;
94 regval = getreg32(reg_base);
95
96 if(AON_ACOMP0_ID == acomp_id){
97 return (regval & AON_ACOMP0_OUT_RAW_DATA_MASK) >> AON_ACOMP0_OUT_RAW_DATA_SHIFT;
98 } else {
99 return (regval & AON_ACOMP1_OUT_RAW_DATA_MASK) >> AON_ACOMP1_OUT_RAW_DATA_SHIFT;
100 }
101 }
102
bflb_acomp_gpio_2_chanid(uint32_t pin,uint32_t * channel)103 uint32_t bflb_acomp_gpio_2_chanid(uint32_t pin, uint32_t* channel)
104 {
105 #if defined(BL602)
106 if ( pin == GPIO_PIN_12 ) {
107 *channel = AON_ACOMP_CHAN_ADC0;
108 } else if ( pin == GPIO_PIN_4 ) {
109 *channel = AON_ACOMP_CHAN_ADC1;
110 } else if ( pin == GPIO_PIN_14 ) {
111 *channel = AON_ACOMP_CHAN_ADC2;
112 } else if ( pin == GPIO_PIN_13 ) {
113 *channel = AON_ACOMP_CHAN_ADC3;
114 } else if ( pin == GPIO_PIN_5 ) {
115 *channel = AON_ACOMP_CHAN_ADC4;
116 } else if ( pin == GPIO_PIN_6 ) {
117 *channel = AON_ACOMP_CHAN_ADC5;
118 } else if ( pin == GPIO_PIN_9 ) {
119 *channel = AON_ACOMP_CHAN_ADC6;
120 // } else if ( pin == GPIO_PIN_9 ) {
121 // *channel = AON_ACOMP_CHAN_ADC7;
122 } else {
123 return -1;
124 }
125 #elif defined(BL702)
126 if ( pin == GPIO_PIN_8 ) {
127 *channel = AON_ACOMP_CHAN_ADC0;
128 } else if ( pin == GPIO_PIN_15 ) {
129 *channel = AON_ACOMP_CHAN_ADC1;
130 } else if ( pin == GPIO_PIN_17 ) {
131 *channel = AON_ACOMP_CHAN_ADC2;
132 } else if ( pin == GPIO_PIN_11 ) {
133 *channel = AON_ACOMP_CHAN_ADC3;
134 } else if ( pin == GPIO_PIN_12 ) {
135 *channel = AON_ACOMP_CHAN_ADC4;
136 } else if ( pin == GPIO_PIN_14 ) {
137 *channel = AON_ACOMP_CHAN_ADC5;
138 } else if ( pin == GPIO_PIN_7 ) {
139 *channel = AON_ACOMP_CHAN_ADC6;
140 } else if ( pin == GPIO_PIN_9 ) {
141 *channel = AON_ACOMP_CHAN_ADC7;
142 } else {
143 return -1;
144 }
145 #elif defined(BL702L)
146 if ( pin == GPIO_PIN_14 ) {
147 *channel = AON_ACOMP_CHAN_ADC0;
148 } else if ( pin == GPIO_PIN_15 ) {
149 *channel = AON_ACOMP_CHAN_ADC1;
150 } else if ( pin == GPIO_PIN_17 ) {
151 *channel = AON_ACOMP_CHAN_ADC2;
152 } else if ( pin == GPIO_PIN_18 ) {
153 *channel = AON_ACOMP_CHAN_ADC3;
154 } else if ( pin == GPIO_PIN_19 ) {
155 *channel = AON_ACOMP_CHAN_ADC4;
156 } else if ( pin == GPIO_PIN_20 ) {
157 *channel = AON_ACOMP_CHAN_ADC5;
158 } else if ( pin == GPIO_PIN_21 ) {
159 *channel = AON_ACOMP_CHAN_ADC6;
160 } else if ( pin == GPIO_PIN_7 ) {
161 *channel = AON_ACOMP_CHAN_ADC7;
162 } else {
163 return -1;
164 }
165 #elif defined(BL616)
166 if (pin == GPIO_PIN_20) {
167 *channel = AON_ACOMP_CHAN_ADC0;
168 } else if (pin == GPIO_PIN_19) {
169 *channel = AON_ACOMP_CHAN_ADC1;
170 } else if (pin == GPIO_PIN_2) {
171 *channel = AON_ACOMP_CHAN_ADC2;
172 } else if (pin == GPIO_PIN_3) {
173 *channel = AON_ACOMP_CHAN_ADC3;
174 } else if (pin == GPIO_PIN_14) {
175 *channel = AON_ACOMP_CHAN_ADC4;
176 } else if (pin == GPIO_PIN_13) {
177 *channel = AON_ACOMP_CHAN_ADC5;
178 } else if (pin == GPIO_PIN_12) {
179 *channel = AON_ACOMP_CHAN_ADC6;
180 } else if (pin == GPIO_PIN_10) {
181 *channel = AON_ACOMP_CHAN_ADC7;
182 } else {
183 return -1;
184 }
185 #elif defined(BL606P) || defined(BL808)
186 if (pin == GPIO_PIN_17) {
187 *channel = AON_ACOMP_CHAN_ADC0;
188 } else if (pin == GPIO_PIN_5) {
189 *channel = AON_ACOMP_CHAN_ADC1;
190 } else if (pin == GPIO_PIN_4) {
191 *channel = AON_ACOMP_CHAN_ADC2;
192 } else if (pin == GPIO_PIN_11) {
193 *channel = AON_ACOMP_CHAN_ADC3;
194 } else if (pin == GPIO_PIN_6) {
195 *channel = AON_ACOMP_CHAN_ADC4;
196 } else if (pin == GPIO_PIN_40) {
197 *channel = AON_ACOMP_CHAN_ADC5;
198 } else if (pin == GPIO_PIN_12) {
199 *channel = AON_ACOMP_CHAN_ADC6;
200 } else if (pin == GPIO_PIN_13) {
201 *channel = AON_ACOMP_CHAN_ADC7;
202 } else {
203 return -1;
204 }
205 #else
206 return -1;
207 #endif
208 return 0;
209 }
210
bflb_acomp_chanid_2_gpio(uint32_t channel,uint32_t * pin)211 uint32_t bflb_acomp_chanid_2_gpio(uint32_t channel, uint32_t* pin)
212 {
213 #if defined(BL602)
214 if ( channel == AON_ACOMP_CHAN_ADC0 ) {
215 *pin = GPIO_PIN_12;
216 } else if ( channel == AON_ACOMP_CHAN_ADC1 ) {
217 *pin = GPIO_PIN_4;
218 } else if ( channel == AON_ACOMP_CHAN_ADC2 ) {
219 *pin = GPIO_PIN_14;
220 } else if ( channel == AON_ACOMP_CHAN_ADC3 ) {
221 *pin = GPIO_PIN_13;
222 } else if ( channel == AON_ACOMP_CHAN_ADC4 ) {
223 *pin = GPIO_PIN_5;
224 } else if ( channel == AON_ACOMP_CHAN_ADC5 ) {
225 *pin = GPIO_PIN_6;
226 } else if ( channel == AON_ACOMP_CHAN_ADC6 ) {
227 *pin = GPIO_PIN_9;
228 } else if ( channel == AON_ACOMP_CHAN_ADC7 ) {
229 *pin = GPIO_PIN_9;
230 } else {
231 return -1;
232 }
233 #elif defined(BL702)
234 if ( channel == AON_ACOMP_CHAN_ADC0 ) {
235 *pin = GPIO_PIN_8;
236 } else if ( channel == AON_ACOMP_CHAN_ADC1 ) {
237 *pin = GPIO_PIN_15;
238 } else if ( channel == AON_ACOMP_CHAN_ADC2 ) {
239 *pin = GPIO_PIN_17;
240 } else if ( channel == AON_ACOMP_CHAN_ADC3 ) {
241 *pin = GPIO_PIN_11;
242 } else if ( channel == AON_ACOMP_CHAN_ADC4 ) {
243 *pin = GPIO_PIN_12;
244 } else if ( channel == AON_ACOMP_CHAN_ADC5 ) {
245 *pin = GPIO_PIN_14;
246 } else if ( channel == AON_ACOMP_CHAN_ADC6 ) {
247 *pin = GPIO_PIN_7;
248 } else if ( channel == AON_ACOMP_CHAN_ADC7 ) {
249 *pin = GPIO_PIN_9;
250 } else {
251 return -1;
252 }
253 #elif defined(BL702L)
254 if ( channel == AON_ACOMP_CHAN_ADC0 ) {
255 *pin = GPIO_PIN_14;
256 } else if ( channel == AON_ACOMP_CHAN_ADC1 ) {
257 *pin = GPIO_PIN_15;
258 } else if ( channel == AON_ACOMP_CHAN_ADC2 ) {
259 *pin = GPIO_PIN_17;
260 } else if ( channel == AON_ACOMP_CHAN_ADC3 ) {
261 *pin = GPIO_PIN_18;
262 } else if ( channel == AON_ACOMP_CHAN_ADC4 ) {
263 *pin = GPIO_PIN_19;
264 } else if ( channel == AON_ACOMP_CHAN_ADC5 ) {
265 *pin = GPIO_PIN_20;
266 } else if ( channel == AON_ACOMP_CHAN_ADC6 ) {
267 *pin = GPIO_PIN_21;
268 } else if ( channel == AON_ACOMP_CHAN_ADC7 ) {
269 *pin = GPIO_PIN_7;
270 } else {
271 return -1;
272 }
273 #elif defined(BL616)
274 if (channel == AON_ACOMP_CHAN_ADC0) {
275 *pin = GPIO_PIN_20;
276 } else if (channel == AON_ACOMP_CHAN_ADC1) {
277 *pin = GPIO_PIN_19;
278 } else if (channel == AON_ACOMP_CHAN_ADC2) {
279 *pin = GPIO_PIN_2;
280 } else if (channel == AON_ACOMP_CHAN_ADC3) {
281 *pin = GPIO_PIN_3;
282 } else if (channel == AON_ACOMP_CHAN_ADC4) {
283 *pin = GPIO_PIN_14;
284 } else if (channel == AON_ACOMP_CHAN_ADC5) {
285 *pin = GPIO_PIN_13;
286 } else if (channel == AON_ACOMP_CHAN_ADC6) {
287 *pin = GPIO_PIN_12;
288 } else if (channel == AON_ACOMP_CHAN_ADC7) {
289 *pin = GPIO_PIN_10;
290 } else {
291 return -1;
292 }
293 #elif defined(BL606P) || defined(BL808)
294 if (channel == AON_ACOMP_CHAN_ADC0) {
295 *pin = GPIO_PIN_17;
296 } else if (channel == AON_ACOMP_CHAN_ADC1) {
297 *pin = GPIO_PIN_5;
298 } else if (channel == AON_ACOMP_CHAN_ADC2) {
299 *pin = GPIO_PIN_4;
300 } else if (channel == AON_ACOMP_CHAN_ADC3) {
301 *pin = GPIO_PIN_11;
302 } else if (channel == AON_ACOMP_CHAN_ADC4) {
303 *pin = GPIO_PIN_6;
304 } else if (channel == AON_ACOMP_CHAN_ADC5) {
305 *pin = GPIO_PIN_40;
306 } else if (channel == AON_ACOMP_CHAN_ADC6) {
307 *pin = GPIO_PIN_12;
308 } else if (channel == AON_ACOMP_CHAN_ADC7) {
309 *pin = GPIO_PIN_13;
310 } else {
311 return -1;
312 }
313 #else
314 return -1;
315 #endif
316 return 0;
317 }
318
319