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