1 // Copyright (C) 2022 Beken Corporation
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include <common/bk_include.h>
16 #include <common/bk_compiler.h>
17 #include <os/mem.h>
18 #include <driver/gpio.h>
19 #include "gpio_driver.h"
20 #include <os/os.h>
21 #include "adc_hal.h"
22 #include "adc_statis.h"
23 #include "adc_driver.h"
24 #include <driver/int.h>
25 #include "icu_driver.h"
26 #include "power_driver.h"
27 #include "clock_driver.h"
28 #include <driver/adc.h>
29 #include "bk_drv_model.h"
30 #include "bk_sys_ctrl.h"
31 #include "sys_driver.h"
32 #include "iot_adc.h"
33 #include "bk_saradc.h"
34 #include "common/bk_err.h"
35
36 static void adc_isr(void) __BK_SECTION(".itcm");
37 static bk_err_t adc_read_fifo(void) __BK_SECTION(".itcm");
38 bk_err_t bk_adc_stop(void) __BK_SECTION(".itcm");
39
40 typedef struct
41 {
42 adc_isr_t callback;
43 uint32_t param;
44 IotAdcCallback_t iot_callback;
45 void * p_iot_context;
46 } adc_callback_t;
47
48 typedef struct {
49 adc_hal_t hal;
50 uint16_t chan_init_bits;
51 } adc_driver_t;
52
53 typedef struct {
54 beken_semaphore_t adc_read_sema;
55 beken_mutex_t adc_mutex;
56 } adc_dev_t;
57
58 typedef struct {
59 uint16_t *buf;
60 /* The size is in unit of uint16_t */
61 uint16_t size;
62 uint16_t sample_cnt;
63 } adc_buf_t;
64
65 static adc_driver_t s_adc = {0};
66 static bool s_adc_driver_is_init = false;
67 static adc_dev_t s_adc_dev = {NULL};
68 static adc_buf_t s_adc_buf = {0};
69 static adc_callback_t s_adc_read_isr = {NULL};
70 static adc_statis_t* s_adc_statis = NULL;
71
72 saradc_calibrate_val saradc_val = {
73 #if (CONFIG_SOC_BK7256XX)
74 0xD40, 0x1A72 /* 1Volt, 2Volt*/
75 #else
76 0x55, 0x354
77 #endif
78 };
79
80 adc_config_t g_adc_cfg[10] = {0};
81
82
83 //TODO - by Frank
84 //1. ADC id range confirm
85 //2. Add API for ADC saturate mode, hide it for application
86 //3. Considering how/when to use cli_done/calib_trig bits?
87 //4. adc_hal_init to reset the ADC to default value
88 //5. Currently ADC ISR is always enabled once ADC is started, can we provide ADC
89 // API that don't need to enable ADC ISR?
90 //6. Make adc_buf_t.buf configurable in bk_adc_init() since different application may
91 // use different buffer size.
92 //7. If necessary, provide ADC API specific for calibration that don't need ADC ISR.
93 //8. Hide the difference of ADC RAW data
94 //9. Update doc accordingly
95 //10. adc_chan_t to adc_chan_t
96
97 #define ADC_SAMPLE_CNT_DEFAULT 32
98
99 #define ADC_RETURN_ON_NOT_INIT() do {\
100 if (!s_adc_driver_is_init) {\
101 ADC_LOGE("adc driver not init\r\n");\
102 return BK_ERR_ADC_NOT_INIT;\
103 }\
104 } while(0)
105
106 #define ADC_RETURN_ON_INVALID_CHAN(id) do {\
107 if (!adc_hal_is_valid_channel(&s_adc.hal, (id))) {\
108 ADC_LOGE("ADC id number(%d) is invalid\r\n", (id));\
109 return BK_ERR_ADC_INVALID_CHAN;\
110 }\
111 } while(0)
112
113 #define ADC_RETURN_ON_INVALID_MODE(mode) do {\
114 if ((mode) >= ADC_NONE_MODE) {\
115 return BK_ERR_ADC_INVALID_MODE;\
116 }\
117 } while(0)
118
119 #define ADC_RETURN_ON_INVALID_SRC_CLK(src_clk) do {\
120 if ((src_clk) >= ADC_SCLK_NONE) {\
121 return BK_ERR_ADC_INVALID_SCLK_MODE;\
122 }\
123 } while(0)
124
125
126 static void adc_isr(void);
127 static void adc_flush(void);
128
adc_init_gpio(adc_chan_t chan)129 static void adc_init_gpio(adc_chan_t chan)
130 {
131 if (adc_hal_is_analog_channel(&s_adc.hal, chan))
132 return;
133
134 adc_gpio_map_t adc_map_table[] = ADC_DEV_MAP;
135 adc_gpio_map_t *adc_map = &adc_map_table[chan];
136
137 //TODO optimize it
138 if(chan == 0) {
139 uint32_t param = PARAM_SARADC_BT_TXSEL_BIT;
140
141 #if CONFIG_SYSTEM_CTRL
142 sys_drv_analog_reg4_bits_or(param);// to do,need remove old interface after all adaption is finished
143 #else
144 sddev_control(DD_DEV_TYPE_SCTRL, CMD_SCTRL_ANALOG_CTRL4_SET, ¶m);
145 #endif
146 }
147
148 gpio_dev_map(adc_map->gpio_id, adc_map->gpio_dev);
149 bk_gpio_disable_pull(adc_map->gpio_id);
150 bk_gpio_disable_input(adc_map->gpio_id);
151 bk_gpio_disable_output(adc_map->gpio_id);
152 }
153
adc_deinit_gpio(adc_chan_t chan)154 static void adc_deinit_gpio(adc_chan_t chan)
155 {
156 if (adc_hal_is_analog_channel(&s_adc.hal, chan))
157 return;
158
159 adc_gpio_map_t adc_map_table[] = ADC_DEV_MAP;
160 adc_gpio_map_t *adc_map = &adc_map_table[chan];
161
162 gpio_dev_unmap(adc_map->gpio_id);
163 }
164
adc_enable_block(void)165 static void adc_enable_block(void)
166 {
167 #if (!CONFIG_SOC_BK7231N) && (!CONFIG_SOC_BK7256XX)
168 //TODO - optimize it after sysctrl driver optimized!
169 uint32_t param = BLK_BIT_SARADC;
170 sddev_control(DD_DEV_TYPE_SCTRL, CMD_SCTRL_BLK_ENABLE, ¶m);
171 #endif
172 }
173
adc_chan_init_common(adc_chan_t chan)174 static bk_err_t adc_chan_init_common(adc_chan_t chan)
175 {
176 bk_err_t ret = 0;
177
178 sys_drv_sadc_pwr_up();
179 adc_enable_block();
180 adc_hal_init(&s_adc.hal);
181 adc_init_gpio(chan);
182 adc_hal_sel_channel(&s_adc.hal, chan);
183
184 s_adc.chan_init_bits |= BIT(chan);
185
186 return ret;
187 }
188
adc_chan_deinit_common(adc_chan_t chan)189 static bk_err_t adc_chan_deinit_common(adc_chan_t chan)
190 {
191 s_adc.chan_init_bits &= ~(BIT(chan));
192
193 adc_hal_stop_commom(&s_adc.hal);
194 sys_drv_sadc_int_disable();
195
196 adc_flush();
197
198 sys_drv_sadc_pwr_down();
199 adc_deinit_gpio(chan);
200 return BK_OK;
201 }
202
adc_read_fifo(void)203 static bk_err_t adc_read_fifo(void)
204 {
205
206 while(!adc_hal_is_fifo_empty(&s_adc.hal)) {
207 ADC_STATIS_INC(s_adc_statis->adc_rx_total_cnt);
208
209 if(s_adc_buf.sample_cnt < s_adc_buf.size) {
210 s_adc_buf.buf[s_adc_buf.sample_cnt++] = adc_hal_get_adc_data(&s_adc.hal);
211
212 ADC_STATIS_INC(s_adc_statis->adc_rx_succ_cnt);
213 } else {
214 if((adc_hal_get_mode(&s_adc.hal) == ADC_CONTINUOUS_MODE)) {
215 adc_hal_get_adc_data(&s_adc.hal);
216
217 ADC_STATIS_INC(s_adc_statis->adc_rx_drop_cnt);
218 } else {
219 //software mode is NOT used!
220 }
221 }
222 }
223
224
225 return BK_OK;
226 }
227
adc_flush(void)228 static void adc_flush(void)
229 {
230 adc_hal_clear_int_status(&s_adc.hal);
231
232 while(!adc_hal_is_fifo_empty(&s_adc.hal)) {
233 adc_hal_get_adc_data(&s_adc.hal);
234 }
235 }
236
bk_adc_driver_init(void)237 bk_err_t bk_adc_driver_init(void)
238 {
239 int ret;
240 uint32_t i;
241
242 if (s_adc_driver_is_init) {
243 return BK_OK;
244 }
245
246 os_memset(&s_adc, 0, sizeof(s_adc));
247 os_memset(&g_adc_cfg, 0, sizeof(g_adc_cfg));
248
249 if (s_adc_buf.buf) {
250 os_free(s_adc_buf.buf);
251 }
252
253 s_adc_buf.size = CONFIG_ADC_BUF_SIZE;
254 s_adc_buf.buf = (uint16_t*)os_zalloc(CONFIG_ADC_BUF_SIZE<<1);
255 if (!s_adc_buf.buf) {
256 return BK_ERR_NO_MEM;
257 }
258
259 if (!s_adc_dev.adc_mutex) {
260 ret = rtos_init_mutex(&s_adc_dev.adc_mutex);
261 if (kNoErr != ret) {
262 os_free(s_adc_buf.buf);
263 return BK_ERR_ADC_INIT_MUTEX;
264 }
265 }
266
267 if (!s_adc_dev.adc_read_sema) {
268 ret = rtos_init_semaphore(&(s_adc_dev.adc_read_sema), 1);
269 if (BK_OK != ret) {
270 os_free(s_adc_buf.buf);
271 rtos_deinit_mutex(&s_adc_dev.adc_mutex);
272 return BK_ERR_ADC_INIT_READ_SEMA;
273 }
274 }
275
276 bk_int_isr_register(INT_SRC_SARADC, adc_isr, NULL);
277
278 adc_statis_init();
279 s_adc_statis = adc_statis_get_statis();
280
281 for(i = 0; i < (sizeof(g_adc_cfg)/sizeof(g_adc_cfg[0])); i++)
282 {
283 g_adc_cfg[i].clk = DEFAULT_ADC_CLK;
284 g_adc_cfg[i].sample_rate = DEFAULT_ADC_SAMPLE_RATE;
285 g_adc_cfg[i].adc_filter = 0;
286 g_adc_cfg[i].steady_ctrl = DEFAULT_ADC_STEADY_TIME;
287 g_adc_cfg[i].adc_mode = DEFAULT_ADC_MODE;
288 g_adc_cfg[i].chan = i;
289 g_adc_cfg[i].src_clk = DEFAULT_ADC_SCLK;
290 g_adc_cfg[i].saturate_mode = DEFAULT_SATURATE_MODE;
291 g_adc_cfg[i].output_buf = NULL;
292 g_adc_cfg[i].output_buf_len = 0;
293 g_adc_cfg[i].is_open = 0;
294 }
295
296 s_adc_driver_is_init = true;
297
298 return BK_OK;
299 }
300
bk_adc_acquire(void)301 bk_err_t bk_adc_acquire(void)
302 {
303 ADC_LOGD("acquire\n");
304 return rtos_lock_mutex(&s_adc_dev.adc_mutex);
305 }
306
bk_adc_release(void)307 bk_err_t bk_adc_release(void)
308 {
309 ADC_LOGD("release\n");
310 return rtos_unlock_mutex(&s_adc_dev.adc_mutex);
311 }
312
bk_adc_driver_deinit(void)313 bk_err_t bk_adc_driver_deinit(void)
314 {
315 if (!s_adc_driver_is_init)
316 return BK_OK;
317
318 bk_adc_deinit(ADC_1); // Deinit ADC_1 to deinit ADC
319 adc_hal_deinit(&s_adc.hal);
320 bk_int_isr_unregister(INT_SRC_SARADC);
321
322 if (s_adc_dev.adc_mutex)
323 rtos_deinit_mutex(&s_adc_dev.adc_mutex);
324
325 if (s_adc_dev.adc_read_sema)
326 rtos_deinit_semaphore(&(s_adc_dev.adc_read_sema));
327
328 os_free(s_adc_buf.buf);
329 s_adc_buf.buf = NULL;
330 s_adc_buf.size = 0;
331
332 os_memset(&g_adc_cfg, 0, sizeof(g_adc_cfg));
333
334 s_adc_driver_is_init = false;
335
336 return BK_OK;
337 }
338
bk_adc_init(adc_chan_t adc_chan)339 bk_err_t bk_adc_init(adc_chan_t adc_chan)
340 {
341 ADC_RETURN_ON_NOT_INIT();
342 ADC_RETURN_ON_INVALID_CHAN(adc_chan);
343
344 #if (CONFIG_SARADC_NEED_FLUSH)
345 adc_flush();
346 #endif
347 adc_chan_init_common(adc_chan);
348 bk_adc_set_sample_cnt(ADC_SAMPLE_CNT_DEFAULT);
349
350 return BK_OK;
351 }
352
bk_adc_deinit(adc_chan_t chan)353 bk_err_t bk_adc_deinit(adc_chan_t chan)
354 {
355 ADC_RETURN_ON_NOT_INIT();
356 ADC_RETURN_ON_INVALID_CHAN(chan);
357
358 adc_chan_deinit_common(chan);
359
360 return BK_OK;
361 }
362
bk_adc_start(void)363 bk_err_t bk_adc_start(void)
364 {
365 if(adc_hal_check_adc_busy(&s_adc.hal))
366 return BK_ERR_ADC_BUSY;
367
368 if (adc_hal_check_adc_enable(&s_adc.hal))
369 return BK_OK;
370
371 sys_drv_sadc_int_enable();
372
373 return BK_OK;
374 }
375
bk_adc_stop(void)376 bk_err_t bk_adc_stop(void)
377 {
378 uint32_t ret = 0;
379
380 if (!adc_hal_check_adc_enable(&s_adc.hal))
381 return BK_OK;
382
383 s_adc_buf.sample_cnt = 0;
384
385 adc_hal_stop_commom(&s_adc.hal);
386 adc_flush();
387
388 return ret;
389 }
390
adc_block_read(uint32_t timeout)391 static bk_err_t adc_block_read(uint32_t timeout)
392 {
393 if(adc_hal_check_adc_busy(&s_adc.hal))
394 return BK_ERR_ADC_BUSY;
395
396 if(adc_hal_get_mode(&s_adc.hal) == ADC_SINGLE_STEP_MODE) {
397 adc_hal_start_commom(&s_adc.hal);
398
399 return adc_hal_get_single_step_adc_data(&s_adc.hal);
400 }
401
402 adc_hal_start_commom(&s_adc.hal);
403
404 int ret = rtos_get_semaphore(&(s_adc_dev.adc_read_sema), timeout);
405 if(ret != kNoErr)
406 return BK_ERR_ADC_GET_READ_SEMA;
407
408 return BK_OK;
409 }
410
bk_adc_read_raw(uint16_t * buf,uint32_t size,uint32_t timeout)411 bk_err_t bk_adc_read_raw(uint16_t* buf, uint32_t size, uint32_t timeout)
412 {
413 uint32_t ret = 0;
414
415 //TODO init check
416
417 if (size > s_adc_buf.size) {
418 ADC_LOGE("adc size %d too big\n", size);
419 return BK_ERR_ADC_SIZE_TOO_BIG;
420 }
421
422 ret = adc_block_read(timeout);
423 if (BK_OK != ret)
424 return ret;
425
426 os_memcpy(buf, s_adc_buf.buf, (size<<1));
427
428 return s_adc_buf.size;
429 }
430
bk_adc_register_isr(adc_isr_t isr,uint32_t param)431 bk_err_t bk_adc_register_isr(adc_isr_t isr, uint32_t param)
432 {
433 ADC_RETURN_ON_NOT_INIT();
434
435 GLOBAL_INT_DECLARATION();
436 GLOBAL_INT_DISABLE();
437 s_adc_read_isr.callback = isr;
438 s_adc_read_isr.param = param;
439 GLOBAL_INT_RESTORE();
440
441 return BK_OK;
442 }
443
bk_adc_set_clk(adc_src_clk_t src_clk,uint32_t clk)444 bk_err_t bk_adc_set_clk(adc_src_clk_t src_clk, uint32_t clk)
445 {
446 ADC_RETURN_ON_INVALID_SRC_CLK(src_clk);
447
448 adc_hal_set_clk(&s_adc.hal, src_clk, clk);
449
450 return BK_OK;
451 }
452
bk_adc_set_channel(adc_chan_t adc_chan)453 bk_err_t bk_adc_set_channel(adc_chan_t adc_chan)
454 {
455 ADC_RETURN_ON_INVALID_CHAN(adc_chan);
456
457 adc_hal_sel_channel(&s_adc.hal, adc_chan);
458
459 adc_deinit_gpio(adc_chan);
460
461 return BK_OK;
462 }
463
bk_adc_set_sample_rate(uint32_t sample_rate)464 bk_err_t bk_adc_set_sample_rate(uint32_t sample_rate)
465 {
466 adc_hal_set_sample_rate(&s_adc.hal, sample_rate);
467
468 return BK_OK;
469 }
470
bk_adc_set_filter(uint32_t filter)471 bk_err_t bk_adc_set_filter(uint32_t filter)
472 {
473 adc_hal_set_adc_filter(&s_adc.hal, filter);
474
475 return BK_OK;
476 }
477
bk_adc_set_steady_time(uint32_t steady_ctrl)478 bk_err_t bk_adc_set_steady_time(uint32_t steady_ctrl)
479 {
480 adc_hal_set_steady_ctrl(&s_adc.hal, steady_ctrl);
481
482 return BK_OK;
483 }
484
bk_adc_set_sample_cnt(uint32_t cnt)485 bk_err_t bk_adc_set_sample_cnt(uint32_t cnt)
486 {
487 if (cnt == 0) {
488 cnt = SOC_ADC_SAMPLE_CNT_MAX;
489 }
490
491 if (cnt > SOC_ADC_SAMPLE_CNT_MAX) {
492 ADC_LOGW("sample cnt %d too big, default to %d\n", cnt, SOC_ADC_SAMPLE_CNT_MAX);
493 cnt = SOC_ADC_SAMPLE_CNT_MAX;
494 }
495
496 adc_hal_set_fifo_threshold(&s_adc.hal, cnt);
497 return BK_OK;
498 }
499
bk_adc_set_saturate_mode(adc_saturate_mode_t mode)500 bk_err_t bk_adc_set_saturate_mode(adc_saturate_mode_t mode)
501 {
502 return adc_hal_set_saturate_mode(&s_adc.hal, mode);
503 }
504
bk_adc_enable_bypass_clalibration(void)505 bk_err_t bk_adc_enable_bypass_clalibration(void)
506 {
507 adc_hal_enable_bypass_calib(&s_adc.hal);
508 return BK_OK;
509 }
510
bk_adc_disable_bypass_clalibration(void)511 bk_err_t bk_adc_disable_bypass_clalibration(void)
512 {
513 adc_hal_disable_bypass_calib(&s_adc.hal);
514 return BK_OK;
515 }
516
bk_adc_get_saturate_mode(adc_saturate_mode_t * mode)517 bk_err_t bk_adc_get_saturate_mode(adc_saturate_mode_t *mode)
518 {
519 return BK_OK;
520 //return adc_hal_get_sat_ctrl(&s_adc.hal);
521 }
522
bk_adc_set_mode(adc_mode_t adc_mode)523 bk_err_t bk_adc_set_mode(adc_mode_t adc_mode)
524 {
525 ADC_RETURN_ON_INVALID_MODE(adc_mode);
526
527 return adc_hal_set_mode(&s_adc.hal, adc_mode);
528 }
529
bk_adc_get_mode(void)530 adc_mode_t bk_adc_get_mode(void)
531 {
532 return adc_hal_get_mode(&s_adc.hal);
533 }
534
bk_adc_set_config(adc_config_t * config)535 bk_err_t bk_adc_set_config(adc_config_t *config)
536 {
537 BK_RETURN_ON_NULL(config);
538 ADC_RETURN_ON_INVALID_MODE(config->adc_mode);
539 ADC_RETURN_ON_INVALID_SRC_CLK(config->src_clk);
540 ADC_RETURN_ON_INVALID_CHAN(config->chan);
541
542 adc_hal_set_clk(&s_adc.hal, config->src_clk, config->clk);
543 adc_hal_set_mode(&s_adc.hal, config->adc_mode);
544
545 adc_hal_set_steady_ctrl(&s_adc.hal, config->steady_ctrl);
546 adc_hal_set_saturate_mode(&s_adc.hal, config->saturate_mode);
547
548 bk_adc_set_channel(config->chan);
549
550 if(config->adc_mode == ADC_CONTINUOUS_MODE) {
551 adc_hal_set_sample_rate(&s_adc.hal, config->sample_rate);
552 adc_hal_set_adc_filter(&s_adc.hal, config->adc_filter);
553 }
554 return BK_OK;
555 }
556
bk_adc_get_config(uint32 adc_ch,adc_config_t ** config)557 bk_err_t bk_adc_get_config(uint32 adc_ch, adc_config_t **config)
558 {
559 *config = &g_adc_cfg[adc_ch];
560 return BK_OK;
561 }
562
saradc_hal_is_fifo_empty(void)563 int saradc_hal_is_fifo_empty(void)
564 {
565 return (!adc_hal_is_fifo_empty(&s_adc.hal));
566 }
567
bk_saradc_start_int_disable(void)568 bk_err_t bk_saradc_start_int_disable(void)
569 {
570 if(adc_hal_check_adc_busy(&s_adc.hal))
571 return BK_ERR_ADC_BUSY;
572 if (adc_hal_check_adc_enable(&s_adc.hal))
573 return BK_OK;
574 sys_drv_sadc_int_disable();
575 return BK_OK;
576 }
577
saradc_hal_start_enable(void)578 void saradc_hal_start_enable(void)
579 {
580 adc_hal_start_commom(&s_adc.hal);
581 }
582
bk_saradc_read_raw_data(uint32_t timeout)583 uint32_t bk_saradc_read_raw_data(uint32_t timeout)
584 {
585 uint32_t raw_data = 0;
586 raw_data = adc_hal_get_adc_data(&s_adc.hal);
587 return raw_data;
588 }
589
590 #if SARADC_AUTOTEST
bk_saradc_set_config(adc_config_t * config,uint32_t div)591 bk_err_t bk_saradc_set_config(adc_config_t *config, uint32_t div)
592 {
593 BK_RETURN_ON_NULL(config);
594 ADC_RETURN_ON_INVALID_MODE(config->adc_mode);
595 ADC_RETURN_ON_INVALID_SRC_CLK(config->src_clk);
596 ADC_RETURN_ON_INVALID_CHAN(config->chan);
597 adc_hal_set_div(&s_adc.hal, div);
598 adc_hal_set_mode(&s_adc.hal, config->adc_mode);
599 adc_hal_set_steady_ctrl(&s_adc.hal, config->steady_ctrl);
600 adc_hal_set_saturate_mode(&s_adc.hal, config->saturate_mode);
601 if(config->adc_mode == ADC_CONTINUOUS_MODE)
602 {
603 os_printf("config->sample_rate = %d\r\n",config->sample_rate);
604 adc_hal_set_sample_rate(&s_adc.hal, config->sample_rate);
605 adc_hal_set_adc_filter(&s_adc.hal, config->adc_filter);
606 }
607 return BK_OK;
608 }
609 #endif
610
bk_adc_read(uint16_t * data,uint32_t timeout)611 bk_err_t bk_adc_read(uint16_t* data, uint32_t timeout)
612 {
613 uint32_t sum = 0;
614 int ret = BK_OK;
615
616 //TODO init check
617
618 if (s_adc_buf.size == 0)
619 return BK_ERR_ADC_NOT_INIT;
620
621 ret = adc_block_read(timeout);
622 if (BK_OK != ret)
623 return ret;
624
625 for (uint16_t i = 0; i < s_adc_buf.size; i++) {
626 sum += s_adc_buf.buf[i];
627 }
628
629 sum = sum / s_adc_buf.size;
630
631 #if CONFIG_SARADC_RANGE_DIVIDE
632 sum = sum >> 1;
633 #endif
634
635 *data = sum;
636
637 return ret;
638 }
639
640
adc_isr(void)641 static void adc_isr(void)
642 {
643 adc_hal_clear_int_status(&s_adc.hal);
644
645 ADC_STATIS_INC(s_adc_statis->adc_isr_cnt);
646
647 adc_read_fifo();
648
649 if (s_adc_buf.sample_cnt >= s_adc_buf.size) {
650 rtos_set_semaphore(&(s_adc_dev.adc_read_sema));
651 bk_adc_stop();
652 }
653
654 if (s_adc_read_isr.callback) {
655 s_adc_read_isr.callback(s_adc_read_isr.param);
656 }
657
658 if (s_adc_read_isr.iot_callback) {
659 s_adc_read_isr.iot_callback(s_adc_buf.buf, s_adc_read_isr.p_iot_context);
660 }
661 }
662
bk_adc_is_valid_ch(uint32_t ch)663 bk_err_t bk_adc_is_valid_ch(uint32_t ch)
664 {
665 if (!adc_hal_is_valid_channel(&s_adc.hal, ch))
666 {
667 ADC_LOGE("ADC id number(%d) is invalid\r\n", (ch));
668 return BK_ERR_ADC_INVALID_CHAN;
669 }
670
671 return BK_OK;
672 }
673
bk_adc_register_isr_iot_callback(void * iot_callback,void * p_iot_context)674 bk_err_t bk_adc_register_isr_iot_callback( void* iot_callback, void * p_iot_context)
675 {
676 ADC_RETURN_ON_NOT_INIT();
677
678 GLOBAL_INT_DECLARATION();
679 GLOBAL_INT_DISABLE();
680 s_adc_read_isr.iot_callback = (IotAdcCallback_t)iot_callback;
681 s_adc_read_isr.p_iot_context = p_iot_context;
682 GLOBAL_INT_RESTORE();
683
684 return BK_OK;
685 }
686
bk_adc_unregister_isr_iot_callback(void)687 bk_err_t bk_adc_unregister_isr_iot_callback(void)
688 {
689 ADC_RETURN_ON_NOT_INIT();
690
691 GLOBAL_INT_DECLARATION();
692 GLOBAL_INT_DISABLE();
693 s_adc_read_isr.iot_callback = NULL;
694 s_adc_read_isr.p_iot_context = NULL;
695 GLOBAL_INT_RESTORE();
696
697 return BK_OK;
698 }
699
bk_adc_en(void)700 bk_err_t bk_adc_en(void)
701 {
702 if(adc_hal_check_adc_busy(&s_adc.hal))
703 {
704 os_printf("adc_start:adc busy\n");
705 return BK_ERR_ADC_BUSY;
706 }
707
708 adc_hal_start_commom(&s_adc.hal);
709
710 int ret = rtos_get_semaphore(&(s_adc_dev.adc_read_sema), 1000);
711 if(ret != kNoErr)
712 {
713 os_printf("adc_start:rtos_get_semaphore fail\n");
714 return BK_ERR_ADC_GET_READ_SEMA;
715 }
716
717 return BK_OK;
718 }
719
saradc_config_param_init_for_temp(saradc_desc_t * adc_config)720 void saradc_config_param_init_for_temp(saradc_desc_t* adc_config)
721 {
722 os_memset(adc_config, 0x00, sizeof(saradc_desc_t));
723 adc_config->channel = 1;
724 adc_config->current_read_data_cnt = 0;
725 adc_config->current_sample_data_cnt = 0;
726 adc_config->filter = 0;
727 adc_config->has_data = 0;
728 adc_config->all_done = 0;
729 adc_config->mode = (ADC_CONFIG_MODE_CONTINUE << 0)
730 |(ADC_CONFIG_MODE_4CLK_DELAY << 2)
731 |(ADC_CONFIG_MODE_SHOULD_OFF);
732 adc_config->pre_div = 0x10;
733 adc_config->samp_rate = 0x20;
734 }
735
saradc_calculate(UINT16 adc_val)736 float saradc_calculate(UINT16 adc_val)
737 {
738 float practic_voltage;
739 #if (CFG_SOC_NAME == SOC_BK7256)
740 /* (adc_val - low) / (practic_voltage - 1Volt) = (high - low) / 1Volt */
741 /* practic_voltage = (adc_val - low) / (high - low) + 1Volt */
742 practic_voltage = (float)(adc_val - saradc_val.low);
743 practic_voltage = (practic_voltage / (float)(saradc_val.high - saradc_val.low)) + 1;
744 #elif ( (CFG_SOC_NAME != SOC_BK7271) && (CFG_SOC_NAME != SOC_BK7221U))
745 practic_voltage = ((adc_val - saradc_val.low) * 1.8);
746 practic_voltage = (practic_voltage / (saradc_val.high - saradc_val.low)) + 0.2;
747 #else
748 practic_voltage = (adc_val -(saradc_val.low-4096));
749 practic_voltage = practic_voltage/(saradc_val.high - (saradc_val.low-4096));
750 practic_voltage = 2*practic_voltage;
751 #endif
752 return practic_voltage;
753 }
754
saradc_set_calibrate_val(uint16_t * value,SARADC_MODE mode)755 UINT32 saradc_set_calibrate_val(uint16_t *value, SARADC_MODE mode)
756 {
757 uint32_t irq_level;
758 irq_level = rtos_disable_int();
759 if(SARADC_CALIBRATE_LOW == mode)
760 {
761 saradc_val.low = *value;
762 }
763 else if(SARADC_CALIBRATE_HIGH == mode)
764 {
765 saradc_val.high = *value;
766 }
767 else
768 {
769 rtos_enable_int(irq_level);
770 return SARADC_FAILURE;
771 }
772
773 rtos_enable_int(irq_level);
774 return SARADC_SUCCESS;
775 }
776
bk_adc_read_for_ate(uint32_t saradc_num,uint16_t * saradc_buf)777 void bk_adc_read_for_ate(uint32_t saradc_num, uint16_t *saradc_buf)
778 {
779 uint32_t i = 0;
780 int irq_level=0;
781
782 BK_LOG_ON_ERR(bk_saradc_start_int_disable());
783 //saradc enable
784 saradc_hal_start_enable();
785 //need check saradc fifo empty
786 //os_printf("saradc_hal_is_fifo_empty=%x\r\n",saradc_hal_is_fifo_empty());
787 //os_printf("sardata_start\r\n");
788 irq_level = rtos_disable_int();
789
790 for(i = 0; i < saradc_num; i++)
791 {
792 if(saradc_hal_is_fifo_empty())
793 {
794 saradc_buf[i] = bk_saradc_read_raw_data(1000);
795 //saradc_buf[i] = *((volatile unsigned long *) (BASEADDR_SADC+0x4*4));
796 }
797 else
798 {
799 i--;
800 continue;
801 }
802
803 }
804 rtos_enable_int(irq_level);
805 }
806
test_adc_for_ate(adc_chan_t channel,adc_mode_t mode,uint32_t pre_div,uint32_t samp_rate,uint32_t filter,uint32_t sta_ctrl,uint32_t usCount,uint16_t * pDataBuffer)807 void test_adc_for_ate(adc_chan_t channel, adc_mode_t mode,
808 uint32_t pre_div, uint32_t samp_rate,
809 uint32_t filter, uint32_t sta_ctrl,
810 uint32_t usCount, uint16_t *pDataBuffer)
811 {
812 adc_config_t config = {0};
813 uint32_t adc_clk;
814
815 adc_clk = 26000000/2/(pre_div + 1);
816 BK_LOG_ON_ERR(bk_adc_acquire());
817 BK_LOG_ON_ERR(bk_adc_init(channel));
818
819 config.chan = channel;
820 config.adc_mode = mode;
821 config.clk = adc_clk;
822 config.src_clk = 1;
823 config.saturate_mode = 4;
824 config.sample_rate = samp_rate;
825 config.steady_ctrl= sta_ctrl;
826 config.adc_filter = filter;
827
828 BK_LOG_ON_ERR(bk_adc_set_config(&config));
829 BK_LOG_ON_ERR(bk_adc_enable_bypass_clalibration());
830 BK_LOG_ON_ERR(bk_adc_start());
831
832 bk_adc_read_for_ate(usCount, pDataBuffer);
833 BK_LOG_ON_ERR(bk_adc_stop());
834 BK_LOG_ON_ERR(bk_adc_deinit(channel));
835 BK_LOG_ON_ERR(bk_adc_release());
836 }
837