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