274 lines
8.2 KiB
C
274 lines
8.2 KiB
C
|
|
/*
|
||
|
|
* Copyright (c) CompanyNameMagicTag 2019-2020. All rights reserved.
|
||
|
|
* Description: MRS STA I/O.
|
||
|
|
*/
|
||
|
|
|
||
|
|
#include "mrs_sta_io.h"
|
||
|
|
#include <soc_mdm_power_failure.h>
|
||
|
|
#include "mrs_config.h"
|
||
|
|
#include "mrs_common_tools.h"
|
||
|
|
#include "mrs_sta_simu_meter.h"
|
||
|
|
|
||
|
|
#if defined(PRODUCT_CFG_PRODUCT_TYPE_STA)
|
||
|
|
#define MRS_PLC_LED_RX EXT_LED_IDX_0
|
||
|
|
#define MRS_PLC_LED_TX EXT_LED_IDX_1
|
||
|
|
|
||
|
|
td_u8 g_sta_evtout_check_num = 0;
|
||
|
|
td_u8 g_sta_evtout_param = 0;
|
||
|
|
mrs_io_evtout_callback g_sta_evtout_callback = TD_NULL;
|
||
|
|
|
||
|
|
/* RST INT */
|
||
|
|
td_void mrs_sta_reset_isr_callback(td_void);
|
||
|
|
|
||
|
|
/* EVENT_OUT INT */
|
||
|
|
td_void mrs_sta_event_out_isr_callback(td_void);
|
||
|
|
|
||
|
|
/* Callback of PLC Tx, turn on the tx led */
|
||
|
|
td_void mrs_sta_plc_tx_callback(td_u8 dt, td_u16 source_type, td_u8 phase);
|
||
|
|
|
||
|
|
/* callback of PLC Rx, turn on the rx led */
|
||
|
|
td_void mrs_sta_plc_rx_callback(td_u8 dt, td_u16 source_type, td_u8 phase);
|
||
|
|
|
||
|
|
/* forbid to call dynamic domain content */
|
||
|
|
__hot td_void app_io_init(td_void)
|
||
|
|
{
|
||
|
|
td_u32 io_dir = 0x003FEE3F;
|
||
|
|
td_u32 io_val = 0x00006600;
|
||
|
|
#if defined(PRODUCT_CFG_DEBUG_JTAG_LED_MRS)
|
||
|
|
uapi_io_set_func(EXT_GPIO_IDX_6, 0); /* GPIO6 replace GPIO2_LED0 */
|
||
|
|
uapi_io_set_dir(EXT_GPIO_IDX_6, EXT_GPIO_DIRECTION_OUT);
|
||
|
|
uapi_io_set_func(EXT_GPIO_IDX_1, 1); /* GPIO1_LED4 replace GPIO3_LED1 */
|
||
|
|
#endif
|
||
|
|
/* LED */
|
||
|
|
uapi_io_set_func(EXT_GPIO_IDX_2, 1); /* LED_RX */
|
||
|
|
uapi_io_set_func(EXT_GPIO_IDX_3, 1); /* LED_TX */
|
||
|
|
uapi_led_init(EXT_LED_MODE_HIGH);
|
||
|
|
|
||
|
|
/* UART0 */
|
||
|
|
uapi_io_set_func(EXT_GPIO_IDX_9, 1); /* GPIO_9_SEL: UART0_RXD */
|
||
|
|
uapi_io_set_func(EXT_GPIO_IDX_10, 3); /* GPIO_10_SEL: UART0_N_TXD , value: 3 */
|
||
|
|
|
||
|
|
/* EVENT_OUT */
|
||
|
|
uapi_io_set_func(EXT_GPIO_IDX_7, 0); /* GPIO_7_SEL: GPIO_7, EVENT_OUT */
|
||
|
|
|
||
|
|
/* RST */
|
||
|
|
uapi_io_set_func(EXT_GPIO_IDX_8, 0); /* GPIO_8_SEL: GPIO_8, RST */
|
||
|
|
|
||
|
|
/* LDRVR_PD */
|
||
|
|
uapi_io_set_func(EXT_GPIO_IDX_5, 0);
|
||
|
|
|
||
|
|
if (uapi_get_hw_chip_type() == EXT_FTM_CHIP_TYPE_21EV) {
|
||
|
|
/* set drive capability of pins */
|
||
|
|
uapi_io_set_driver_strength(EXT_IO_CTL_SFC_CLK, EXT_IO_DRIVER_STRENGTH_2);
|
||
|
|
uapi_io_set_driver_strength(EXT_IO_CTL_SFC_WPN, EXT_IO_DRIVER_STRENGTH_2);
|
||
|
|
uapi_io_set_driver_strength(EXT_IO_CTL_SFC_HOLDN, EXT_IO_DRIVER_STRENGTH_2);
|
||
|
|
uapi_io_set_driver_strength(EXT_IO_CTL_SFC_DI, EXT_IO_DRIVER_STRENGTH_2);
|
||
|
|
uapi_io_set_driver_strength(EXT_IO_CTL_SFC_DO, EXT_IO_DRIVER_STRENGTH_2);
|
||
|
|
|
||
|
|
io_dir = 0x00587FFE;
|
||
|
|
}
|
||
|
|
|
||
|
|
uapi_io_init(&io_val, &io_dir);
|
||
|
|
}
|
||
|
|
|
||
|
|
td_u32 mrs_sta_io_init(td_void)
|
||
|
|
{
|
||
|
|
ext_gpio_value_e value = EXT_GPIO_VALUE0;
|
||
|
|
#if defined(PRODUCT_CFG_DEBUG_JTAG_LED_MRS)
|
||
|
|
uapi_led_flash(EXT_LED_IDX_4, 1000, 1000); /* time of led on/off: 1000/1000 */
|
||
|
|
#endif
|
||
|
|
uapi_led_flash(MRS_PLC_LED_RX, 1000, 1000); /* time of led on/off: 1000/1000 */
|
||
|
|
uapi_led_flash(MRS_PLC_LED_TX, 1000, 1000); /* time of led on/off: 1000/1000 */
|
||
|
|
|
||
|
|
/* GPIO8: RESET */
|
||
|
|
uapi_io_set_func(MRS_CFG_IO_RST, 0);
|
||
|
|
uapi_io_set_dir(MRS_CFG_IO_RST, EXT_GPIO_DIRECTION_IN);
|
||
|
|
uapi_io_int_connect(MRS_CFG_IO_RST, EXT_INT_EDGE, EXT_EDGE_FALL_LEVEL_LOW, mrs_sta_reset_isr_callback);
|
||
|
|
|
||
|
|
/* GPIO7: EVENT_OUT */
|
||
|
|
if (mrs_simu_meter_flag() == TD_FALSE) {
|
||
|
|
uapi_io_set_func(MRS_CFG_STA_IO_EVT_OUT, 0);
|
||
|
|
uapi_io_set_dir(MRS_CFG_STA_IO_EVT_OUT, EXT_GPIO_DIRECTION_IN);
|
||
|
|
uapi_io_int_connect(MRS_CFG_STA_IO_EVT_OUT, EXT_INT_EDGE, EXT_EDGE_RISE_LEVEL_HIGH,
|
||
|
|
mrs_sta_event_out_isr_callback);
|
||
|
|
|
||
|
|
uapi_io_get_input_val(MRS_CFG_STA_IO_EVT_OUT, &value);
|
||
|
|
if (value == EXT_GPIO_VALUE1) {
|
||
|
|
mrs_sta_event_out_isr_callback();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
uapi_register_led_handle_frame_send_end_func(mrs_sta_plc_tx_callback);
|
||
|
|
uapi_register_led_handle_frame_rcv_end_func(mrs_sta_plc_rx_callback);
|
||
|
|
|
||
|
|
return EXT_ERR_SUCCESS;
|
||
|
|
}
|
||
|
|
|
||
|
|
__isr td_void mrs_sta_reset_isr_callback(td_void)
|
||
|
|
{
|
||
|
|
ext_gpio_value_e value = EXT_GPIO_VALUE0;
|
||
|
|
|
||
|
|
uapi_io_get_input_val(MRS_CFG_IO_RST, &value);
|
||
|
|
|
||
|
|
mrs_timer_stop(MRS_TIMER_ID_RST_IO);
|
||
|
|
|
||
|
|
uapi_io_int_disconnect(MRS_CFG_IO_RST);
|
||
|
|
if (value == EXT_GPIO_VALUE0) {
|
||
|
|
mrs_timer_start(MRS_TIMER_ID_RST_IO, MRS_RST_IO_PERIOD, EXT_TIMER_TYPE_ONCE);
|
||
|
|
uapi_io_int_connect(MRS_CFG_IO_RST, EXT_INT_EDGE, EXT_EDGE_RISE_LEVEL_HIGH, mrs_sta_reset_isr_callback);
|
||
|
|
} else {
|
||
|
|
uapi_io_int_connect(MRS_CFG_IO_RST, EXT_INT_EDGE, EXT_EDGE_FALL_LEVEL_LOW, mrs_sta_reset_isr_callback);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
__isr td_void mrs_sta_event_out_isr_callback(td_void)
|
||
|
|
{
|
||
|
|
ext_gpio_value_e value = EXT_GPIO_VALUE0;
|
||
|
|
|
||
|
|
uapi_io_get_input_val(MRS_CFG_STA_IO_EVT_OUT, &value);
|
||
|
|
if (value != EXT_GPIO_VALUE1) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (g_sta_evtout_check_num == 0) {
|
||
|
|
mrs_timer_start(MRS_TIMER_ID_STA_IO_EVTOUT, MRS_STA_IO_EVTOUT_TIMEOUT, EXT_TIMER_TYPE_ONCE);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
td_void mrs_sta_io_evtout_timeout_handle(td_void)
|
||
|
|
{
|
||
|
|
ext_gpio_value_e value = EXT_GPIO_VALUE0;
|
||
|
|
|
||
|
|
uapi_io_get_input_val(MRS_CFG_STA_IO_EVT_OUT, &value);
|
||
|
|
if ((td_u8)value != EXT_EDGE_RISE_LEVEL_HIGH) {
|
||
|
|
g_sta_evtout_check_num = 0;
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
g_sta_evtout_check_num++;
|
||
|
|
if (g_sta_evtout_check_num < MRS_CFG_STA_EVT_CHECK_MAX) {
|
||
|
|
mrs_timer_start(MRS_TIMER_ID_STA_IO_EVTOUT, MRS_STA_IO_EVTOUT_TIMEOUT, EXT_TIMER_TYPE_ONCE);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
g_sta_evtout_check_num = 0;
|
||
|
|
if (g_sta_evtout_callback != TD_NULL) {
|
||
|
|
g_sta_evtout_callback(g_sta_evtout_param, EXT_EDGE_RISE_LEVEL_HIGH);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
td_void mrs_sta_io_register_evtout_callback(mrs_io_evtout_callback callback, td_u8 param)
|
||
|
|
{
|
||
|
|
g_sta_evtout_callback = callback;
|
||
|
|
g_sta_evtout_param = param;
|
||
|
|
}
|
||
|
|
|
||
|
|
td_void mrs_sta_led_join_network(td_void)
|
||
|
|
{
|
||
|
|
#if defined(PRODUCT_CFG_DEBUG_JTAG_LED_MRS)
|
||
|
|
uapi_io_set_ouput_val(EXT_GPIO_IDX_6, EXT_GPIO_VALUE0);
|
||
|
|
uapi_led_off(EXT_LED_IDX_4);
|
||
|
|
#endif
|
||
|
|
uapi_led_off(MRS_PLC_LED_RX);
|
||
|
|
uapi_led_off(MRS_PLC_LED_TX);
|
||
|
|
}
|
||
|
|
|
||
|
|
td_void mrs_sta_led_offline(td_void)
|
||
|
|
{
|
||
|
|
#if defined(PRODUCT_CFG_DEBUG_JTAG_LED_MRS)
|
||
|
|
uapi_io_set_ouput_val(EXT_GPIO_IDX_6, EXT_GPIO_VALUE1);
|
||
|
|
uapi_led_on(EXT_LED_IDX_4);
|
||
|
|
#endif
|
||
|
|
uapi_led_on(MRS_PLC_LED_RX);
|
||
|
|
uapi_led_on(MRS_PLC_LED_TX);
|
||
|
|
}
|
||
|
|
|
||
|
|
td_void mrs_sta_plc_tx_callback(td_u8 dt, td_u16 source_type, td_u8 phase)
|
||
|
|
{
|
||
|
|
ext_unref_param(phase);
|
||
|
|
|
||
|
|
if ((dt != SOF_DT) || (source_type != APP_TYPE)) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
#if defined(PRODUCT_CFG_DEBUG_JTAG_LED_MRS)
|
||
|
|
uapi_led_on(EXT_LED_IDX_4);
|
||
|
|
#endif
|
||
|
|
|
||
|
|
if (uapi_get_join_net_state() == TD_FALSE) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
uapi_led_on(MRS_PLC_LED_TX);
|
||
|
|
|
||
|
|
mrs_timer_start(MRS_TIMER_ID_PLC_LED_TX, MRS_PLC_LED_TIME, EXT_TIMER_TYPE_ONCE);
|
||
|
|
}
|
||
|
|
|
||
|
|
td_void mrs_sta_plc_rx_callback(td_u8 dt, td_u16 source_type, td_u8 phase)
|
||
|
|
{
|
||
|
|
ext_unref_param(phase);
|
||
|
|
|
||
|
|
if ((dt != SOF_DT) || (source_type != APP_TYPE)) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
#if defined(PRODUCT_CFG_DEBUG_JTAG_LED_MRS)
|
||
|
|
uapi_io_set_ouput_val(EXT_GPIO_IDX_6, EXT_GPIO_VALUE1);
|
||
|
|
#endif
|
||
|
|
|
||
|
|
if (uapi_get_join_net_state() == TD_FALSE) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
uapi_led_on(MRS_PLC_LED_RX);
|
||
|
|
|
||
|
|
mrs_timer_start(MRS_TIMER_ID_PLC_LED_RX, MRS_PLC_LED_TIME, EXT_TIMER_TYPE_ONCE);
|
||
|
|
}
|
||
|
|
|
||
|
|
td_void mrs_sta_plc_rx_led_off(td_void)
|
||
|
|
{
|
||
|
|
#if defined(PRODUCT_CFG_DEBUG_JTAG_LED_MRS)
|
||
|
|
uapi_io_set_ouput_val(EXT_GPIO_IDX_6, EXT_GPIO_VALUE0);
|
||
|
|
#endif
|
||
|
|
uapi_led_off(MRS_PLC_LED_RX);
|
||
|
|
}
|
||
|
|
|
||
|
|
td_void mrs_sta_plc_tx_led_off(td_void)
|
||
|
|
{
|
||
|
|
#if defined(PRODUCT_CFG_DEBUG_JTAG_LED_MRS)
|
||
|
|
uapi_led_off(EXT_LED_IDX_4);
|
||
|
|
#endif
|
||
|
|
uapi_led_off(MRS_PLC_LED_TX);
|
||
|
|
}
|
||
|
|
|
||
|
|
td_void uapi_set_power_failure_module_gpio_init(ext_gpio_idx_e id, td_u8 io_val, ext_gpio_direction_e dir)
|
||
|
|
{
|
||
|
|
uapi_io_set_func(id, io_val);
|
||
|
|
uapi_io_set_dir(id, dir);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* is plug module */
|
||
|
|
td_u32 uapi_get_power_failure_is_plug_module(td_void)
|
||
|
|
{
|
||
|
|
td_u32 ret;
|
||
|
|
ext_gpio_value_e gpio0_value = EXT_GPIO_VALUE0;
|
||
|
|
|
||
|
|
/* STA module judge current level. 1 means high-level. high-level means module is plug module */
|
||
|
|
ret = uapi_io_get_input_val(EXT_GPIO_IDX_0, &gpio0_value);
|
||
|
|
if (ret != EXT_ERR_SUCCESS) {
|
||
|
|
return EXT_ERR_FAILURE;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (gpio0_value == EXT_GPIO_VALUE1) {
|
||
|
|
ret = EXT_ERR_FAILURE;
|
||
|
|
} else {
|
||
|
|
/* not plug module */
|
||
|
|
ret = EXT_ERR_SUCCESS;
|
||
|
|
}
|
||
|
|
|
||
|
|
return ret;
|
||
|
|
}
|
||
|
|
|
||
|
|
#endif /* defined(PRODUCT_CFG_PRODUCT_TYPE_STA) */
|
||
|
|
|