• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &param);
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, &param);
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