122 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			122 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /* os shim includes */ | ||
|  | #include "os_utils.h"
 | ||
|  | #include "os_mem.h"
 | ||
|  | 
 | ||
|  | #include "chip_reg_base.h"
 | ||
|  | #include "hw_reg_api.h"
 | ||
|  | #include "mac_sys_reg.h"
 | ||
|  | #include "iot_io.h"
 | ||
|  | #include "iot_config.h"
 | ||
|  | #include "iot_errno_api.h"
 | ||
|  | #include "iot_config_api.h"
 | ||
|  | #include "iot_gpio_api.h"
 | ||
|  | #include "iot_board_api.h"
 | ||
|  | #include "iot_pt_func.h"
 | ||
|  | 
 | ||
|  | int iot_zc_buf_full(void *zc_buf_len) | ||
|  | { | ||
|  |     uint8_t *len = (uint8_t *)zc_buf_len; | ||
|  | 
 | ||
|  |     return *len >= IOT_ZC_BUF; | ||
|  | } | ||
|  | 
 | ||
|  | uint8_t iot_zc_circuit_check_status_get(uint8_t phase_zc, \ | ||
|  |     zc_circuit_check_status_t *zc_inform) | ||
|  | { | ||
|  |     uint32_t tmp = 0; | ||
|  |     uint8_t gpio_num; | ||
|  |     uint8_t status = true; | ||
|  |     uint8_t success=0,fail=0; | ||
|  |     uint8_t timeout = 0; | ||
|  | 
 | ||
|  |     zc_circuit_check_status_t *zc_inform_t = zc_inform; | ||
|  | 
 | ||
|  |     gpio_num = iot_board_get_gpio(phase_zc); | ||
|  |     if (GPIO_NO_VALID == gpio_num) { | ||
|  |         iot_printf("error: invalid gpio to get.\n"); | ||
|  |         return ERR_FAIL; | ||
|  |     } | ||
|  | 
 | ||
|  |     /* wait 11 zc cycles */ | ||
|  |     timeout = iot_wait_timeout_fun2(iot_zc_buf_full, \ | ||
|  |         &zc_inform_t->zc_buf_len, true, 220); | ||
|  | 
 | ||
|  |     /* disabel interrupt */ | ||
|  |     iot_gpio_interrupt_enable(gpio_num, 0); | ||
|  |     iot_gpio_close(gpio_num); | ||
|  | 
 | ||
|  |     /* get zc buf false */ | ||
|  |     if (timeout == ERR_TIMEOVER) { | ||
|  |         return false; | ||
|  |     } | ||
|  | 
 | ||
|  |     for (int i = 1; i < IOT_ZC_BUF; i++) { | ||
|  |         tmp = zc_inform_t->zc_buf[i] - zc_inform_t->zc_buf[i-1]; | ||
|  |         if ((tmp > IOT_ZC_FULL_PERIOD - IOT_ZC_FULL_OFFSET) \ | ||
|  |             && (IOT_ZC_FULL_PERIOD + IOT_ZC_FULL_OFFSET > tmp)) { | ||
|  |             success++; | ||
|  |         } else { | ||
|  |             fail++; | ||
|  |         } | ||
|  |     } | ||
|  |     if (success < fail) { | ||
|  |         status = false; | ||
|  |     } else { | ||
|  |         status = true; | ||
|  |     } | ||
|  | 
 | ||
|  |     zc_inform_t->status = status; | ||
|  | 
 | ||
|  |     return status; | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | void iot_zc_int_process(int gpio_num) | ||
|  | { | ||
|  |     zc_circuit_check_status_t *zc_inform = \ | ||
|  |         (zc_circuit_check_status_t *)(&iot_pt_ctxt.zc_circuit_check_status); | ||
|  |     uint8_t count = zc_inform->zc_buf_len; | ||
|  | 
 | ||
|  |     if(count < IOT_ZC_BUF) { | ||
|  |         zc_inform->zc_buf[count] = \ | ||
|  |             RGF_MAC_READ_REG(CFG_RD_NTB_ADDR); | ||
|  |         zc_inform->zc_buf_len++; | ||
|  |     } | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t iot_zc_circuit_interrupt_init(uint8_t phase_zc) | ||
|  | { | ||
|  |     int r=0; | ||
|  |     uint8_t gpio_num; | ||
|  |     uint32_t ret = ERR_OK; | ||
|  | 
 | ||
|  |     gpio_num = iot_board_get_gpio(phase_zc); | ||
|  |     iot_printf("pt zc gpio num: %d.\n", gpio_num); | ||
|  |     if (GPIO_NO_VALID == gpio_num) { | ||
|  |         iot_printf("error: invalid gpio to get.\n"); | ||
|  |         return ERR_FAIL; | ||
|  |     } | ||
|  | 
 | ||
|  |     r |= iot_gpio_open_as_interrupt(gpio_num); | ||
|  |     iot_gpio_set_pull_mode(gpio_num, GPIO_PULL_UP); | ||
|  | 
 | ||
|  |     r |= iot_gpio_interrupt_config | ||
|  |         (gpio_num, GPIO_INT_EDGE_RAISING, (iot_gpio_isr_func)iot_zc_int_process, | ||
|  |         gpio_num, GPIO_INT_FUNC_DISABLE_AUTOSTOP); | ||
|  | 
 | ||
|  |     r |= iot_gpio_interrupt_enable(gpio_num, 1); | ||
|  | 
 | ||
|  |     if (r != 0) { | ||
|  |         ret = ERR_FAIL; | ||
|  |         /* disabel interrupt */ | ||
|  |         iot_gpio_interrupt_enable(gpio_num, 0); | ||
|  |         iot_gpio_close(gpio_num); | ||
|  |         iot_printf("zc initial configure failed!\n"); | ||
|  |     } else { | ||
|  |         iot_printf("zc initial configure successfully!\n"); | ||
|  |     } | ||
|  | 
 | ||
|  |     return ret; | ||
|  | } |