/* 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; }