370 lines
11 KiB
C
370 lines
11 KiB
C
/*
|
|
* Copyright (c) CompanyNameMagicTag 2019-2020. All rights reserved.
|
|
* Description: MRS STA I/O.
|
|
*/
|
|
|
|
#include "mrs_cco_io.h"
|
|
|
|
#if defined(PRODUCT_CFG_PRODUCT_TYPE_CCO)
|
|
/* set pahse */
|
|
td_void mrs_plc_set_tx_single_phase(td_u32 phase_name, td_u8 phase_mode);
|
|
td_void mrs_plc_set_rx_single_phase(td_u32 phase_name, td_u8 phase_mode);
|
|
/* trigger callback function */
|
|
td_void mrs_cco_plc_tx_callback(td_u8 dt, td_u16 source_type, td_u8 phase);
|
|
td_void mrs_cco_plc_rx_callback(td_u8 dt, td_u16 source_type, td_u8 phase);
|
|
|
|
td_void mrs_cco_reset_isr_callback(td_void);
|
|
|
|
td_void mrs_plc_tx_phase_a_on_ev(td_void);
|
|
td_void mrs_plc_tx_phase_b_on_ev(td_void);
|
|
td_void mrs_plc_tx_phase_c_on_ev(td_void);
|
|
td_void mrs_plc_tx_phase_a_off_ev(td_void);
|
|
td_void mrs_plc_tx_phase_b_off_ev(td_void);
|
|
td_void mrs_plc_tx_phase_c_off_ev(td_void);
|
|
|
|
td_void mrs_plc_tx_phase_a_on_sv(td_void);
|
|
td_void mrs_plc_tx_phase_b_on_sv(td_void);
|
|
td_void mrs_plc_tx_phase_c_on_sv(td_void);
|
|
td_void mrs_plc_tx_phase_a_off_sv(td_void);
|
|
td_void mrs_plc_tx_phase_b_off_sv(td_void);
|
|
td_void mrs_plc_tx_phase_c_off_sv(td_void);
|
|
|
|
td_void mrs_plc_tx_phase_a_on(td_void);
|
|
td_void mrs_plc_tx_phase_b_on(td_void);
|
|
td_void mrs_plc_tx_phase_c_on(td_void);
|
|
|
|
typedef td_void (*mrs_plc_led_callback)(td_void);
|
|
|
|
td_u8 g_cco_io_rst = (td_u8)EXT_GPIO_IDX_19;
|
|
td_u8 g_cco_phase_a_tx = (td_u8)EXT_GPIO_IDX_15;
|
|
td_u8 g_cco_phase_a_rx = (td_u8)EXT_GPIO_IDX_16;
|
|
td_u8 g_cco_phase_b_tx = (td_u8)EXT_GPIO_IDX_6;
|
|
td_u8 g_cco_phase_b_rx = (td_u8)EXT_GPIO_IDX_21;
|
|
td_u8 g_cco_phase_c_tx = (td_u8)EXT_GPIO_IDX_20;
|
|
td_u8 g_cco_phase_c_rx = (td_u8)EXT_GPIO_IDX_0;
|
|
|
|
mrs_plc_led_callback g_cco_phase_a_led_on = mrs_plc_tx_phase_a_on_ev;
|
|
mrs_plc_led_callback g_cco_phase_b_led_on = mrs_plc_tx_phase_b_on_ev;
|
|
mrs_plc_led_callback g_cco_phase_c_led_on = mrs_plc_tx_phase_c_on_ev;
|
|
mrs_plc_led_callback g_cco_phase_a_led_off = mrs_plc_tx_phase_a_off_ev;
|
|
mrs_plc_led_callback g_cco_phase_b_led_off = mrs_plc_tx_phase_b_off_ev;
|
|
mrs_plc_led_callback g_cco_phase_c_led_off = mrs_plc_tx_phase_c_off_ev;
|
|
|
|
__isr td_void app_io_init_chip_ev(td_u32 *io_dir)
|
|
{
|
|
uapi_io_set_func(EXT_GPIO_IDX_1, 1); /* A_LED */
|
|
uapi_io_set_func(EXT_GPIO_IDX_6, 0); /* SWITCH_A_TX */
|
|
uapi_io_set_func(EXT_GPIO_IDX_4, 0); /* SWITCH_A_RX */
|
|
|
|
uapi_io_set_func(EXT_GPIO_IDX_22, 0); /* B_LED */
|
|
uapi_io_set_func(EXT_GPIO_IDX_7, 0); /* SWITCH_B_TX */
|
|
uapi_io_set_func(EXT_GPIO_IDX_8, 0); /* SWITCH_B_RX */
|
|
|
|
uapi_io_set_func(EXT_GPIO_IDX_20, 0); /* C_LED */
|
|
uapi_io_set_func(EXT_GPIO_IDX_11, 0); /* SWITCH_C_TX */
|
|
uapi_io_set_func(EXT_GPIO_IDX_12, 0); /* SWITCH_C_RX */
|
|
|
|
g_cco_phase_a_tx = (td_u8)EXT_GPIO_IDX_6;
|
|
g_cco_phase_a_rx = (td_u8)EXT_GPIO_IDX_4;
|
|
g_cco_phase_b_tx = (td_u8)EXT_GPIO_IDX_7;
|
|
g_cco_phase_b_rx = (td_u8)EXT_GPIO_IDX_8;
|
|
g_cco_phase_c_tx = (td_u8)EXT_GPIO_IDX_11;
|
|
g_cco_phase_c_rx = (td_u8)EXT_GPIO_IDX_12;
|
|
|
|
uapi_io_set_func(EXT_GPIO_IDX_19, 0); /* GPIO_19_SEL: GPIO_19, RST */
|
|
g_cco_io_rst = (td_u8)EXT_GPIO_IDX_19;
|
|
|
|
/* 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);
|
|
|
|
g_cco_phase_a_led_on = mrs_plc_tx_phase_a_on_ev;
|
|
g_cco_phase_b_led_on = mrs_plc_tx_phase_b_on_ev;
|
|
g_cco_phase_c_led_on = mrs_plc_tx_phase_c_on_ev;
|
|
g_cco_phase_a_led_off = mrs_plc_tx_phase_a_off_ev;
|
|
g_cco_phase_b_led_off = mrs_plc_tx_phase_b_off_ev;
|
|
g_cco_phase_c_led_off = mrs_plc_tx_phase_c_off_ev;
|
|
|
|
*io_dir = 0x007FFFFF;
|
|
}
|
|
__isr td_void app_io_init_chip_sv(td_u32 *io_dir)
|
|
{
|
|
uapi_io_set_func(EXT_GPIO_IDX_19, 0); /* A_LED */
|
|
uapi_io_set_func(EXT_GPIO_IDX_15, 0); /* SWITCH_A_TX */
|
|
uapi_io_set_func(EXT_GPIO_IDX_16, 0); /* SWITCH_A_RX */
|
|
|
|
uapi_io_set_func(EXT_GPIO_IDX_1, 1); /* B_LED */
|
|
uapi_io_set_func(EXT_GPIO_IDX_6, 0); /* SWITCH_B_TX */
|
|
uapi_io_set_func(EXT_GPIO_IDX_21, 0); /* SWITCH_B_RX */
|
|
|
|
uapi_io_set_func(EXT_GPIO_IDX_4, 1); /* C_LED */
|
|
uapi_io_set_func(EXT_GPIO_IDX_20, 0); /* SWITCH_C_TX */
|
|
uapi_io_set_func(EXT_GPIO_IDX_0, 0); /* SWITCH_C_RX */
|
|
|
|
g_cco_phase_a_tx = (td_u8)EXT_GPIO_IDX_15;
|
|
g_cco_phase_a_rx = (td_u8)EXT_GPIO_IDX_16;
|
|
g_cco_phase_b_tx = (td_u8)EXT_GPIO_IDX_6;
|
|
g_cco_phase_b_rx = (td_u8)EXT_GPIO_IDX_21;
|
|
g_cco_phase_c_tx = (td_u8)EXT_GPIO_IDX_20;
|
|
g_cco_phase_c_rx = (td_u8)EXT_GPIO_IDX_0;
|
|
|
|
/* RST */
|
|
uapi_io_set_func(EXT_GPIO_IDX_8, 0); /* GPIO_8_SEL: GPIO_8, RST */
|
|
g_cco_io_rst = (td_u8)EXT_GPIO_IDX_8;
|
|
|
|
g_cco_phase_a_led_on = mrs_plc_tx_phase_a_on_sv;
|
|
g_cco_phase_b_led_on = mrs_plc_tx_phase_b_on_sv;
|
|
g_cco_phase_c_led_on = mrs_plc_tx_phase_c_on_sv;
|
|
g_cco_phase_a_led_off = mrs_plc_tx_phase_a_off_sv;
|
|
g_cco_phase_b_led_off = mrs_plc_tx_phase_b_off_sv;
|
|
g_cco_phase_c_led_off = mrs_plc_tx_phase_c_off_sv;
|
|
|
|
*io_dir = 0x003FEF7F;
|
|
}
|
|
|
|
__isr td_void app_io_init(td_void)
|
|
{
|
|
td_u32 chip_type = uapi_get_hw_chip_type();
|
|
td_u32 io_dir = 0x0078FFFF;
|
|
td_u32 io_val = 0x00006640;
|
|
|
|
/* 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 */
|
|
|
|
/* 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);
|
|
|
|
/* LDRVR_PD */
|
|
uapi_io_set_func(EXT_GPIO_IDX_5, 0);
|
|
|
|
if (chip_type == EXT_FTM_CHIP_TYPE_21EV) {
|
|
app_io_init_chip_ev(&io_dir);
|
|
} else {
|
|
app_io_init_chip_sv(&io_dir);
|
|
}
|
|
|
|
uapi_io_init(&io_val, &io_dir);
|
|
}
|
|
|
|
td_u32 mrs_cco_io_init(td_void)
|
|
{
|
|
/* GPIO8: RESET */
|
|
uapi_io_set_func((ext_gpio_idx_e)g_cco_io_rst, 0);
|
|
uapi_io_set_dir((ext_gpio_idx_e)g_cco_io_rst, EXT_GPIO_DIRECTION_IN);
|
|
uapi_io_int_connect((ext_gpio_idx_e)g_cco_io_rst, EXT_INT_EDGE,
|
|
EXT_EDGE_FALL_LEVEL_LOW, mrs_cco_reset_isr_callback);
|
|
|
|
uapi_register_led_handle_frame_send_end_func(mrs_cco_plc_tx_callback);
|
|
uapi_register_led_handle_frame_rcv_end_func(mrs_cco_plc_rx_callback);
|
|
|
|
return EXT_ERR_SUCCESS;
|
|
}
|
|
|
|
__isr td_void mrs_cco_reset_isr_callback(td_void)
|
|
{
|
|
ext_gpio_value_e value = EXT_GPIO_VALUE0;
|
|
|
|
uapi_io_get_input_val((ext_gpio_idx_e)g_cco_io_rst, &value);
|
|
|
|
mrs_timer_stop(MRS_TIMER_ID_RST_IO);
|
|
|
|
uapi_io_int_disconnect((ext_gpio_idx_e)g_cco_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((ext_gpio_idx_e)g_cco_io_rst, EXT_INT_EDGE,
|
|
EXT_EDGE_RISE_LEVEL_HIGH, mrs_cco_reset_isr_callback);
|
|
} else {
|
|
uapi_io_int_connect((ext_gpio_idx_e)g_cco_io_rst, EXT_INT_EDGE,
|
|
EXT_EDGE_FALL_LEVEL_LOW, mrs_cco_reset_isr_callback);
|
|
}
|
|
}
|
|
|
|
__isr td_void mrs_plc_set_tx_single_phase(td_u32 phase_name, td_u8 phase_mode)
|
|
{
|
|
ext_gpio_value_e value = (phase_mode == PHASE_MODE_ON) ? EXT_GPIO_VALUE1 : EXT_GPIO_VALUE0;
|
|
|
|
switch (phase_name) {
|
|
case PHASE_B:
|
|
uapi_io_set_ouput_val((ext_gpio_idx_e)g_cco_phase_b_tx, value);
|
|
break;
|
|
|
|
case PHASE_C:
|
|
uapi_io_set_ouput_val((ext_gpio_idx_e)g_cco_phase_c_tx, value);
|
|
break;
|
|
|
|
default:
|
|
uapi_io_set_ouput_val((ext_gpio_idx_e)g_cco_phase_a_tx, value);
|
|
break;
|
|
}
|
|
}
|
|
|
|
__isr td_void mrs_plc_set_rx_single_phase(td_u32 phase_name, td_u8 phase_mode)
|
|
{
|
|
ext_gpio_value_e value = (phase_mode == PHASE_MODE_ON) ? EXT_GPIO_VALUE1 : EXT_GPIO_VALUE0;
|
|
|
|
switch (phase_name) {
|
|
case PHASE_B:
|
|
uapi_io_set_ouput_val((ext_gpio_idx_e)g_cco_phase_b_rx, value);
|
|
break;
|
|
|
|
case PHASE_C:
|
|
uapi_io_set_ouput_val((ext_gpio_idx_e)g_cco_phase_c_rx, value);
|
|
break;
|
|
|
|
default:
|
|
uapi_io_set_ouput_val((ext_gpio_idx_e)g_cco_phase_a_rx, value);
|
|
break;
|
|
}
|
|
}
|
|
|
|
td_void mrs_cco_phase_init(td_void)
|
|
{
|
|
uapi_register_phase_func(TD_NULL, mrs_plc_set_tx_single_phase, mrs_plc_set_rx_single_phase);
|
|
}
|
|
|
|
td_void mrs_cco_plc_tx_callback(td_u8 dt, td_u16 source_type, td_u8 phase)
|
|
{
|
|
if ((dt != SOF_DT) || (source_type != APP_TYPE)) {
|
|
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);
|
|
|
|
switch (phase) {
|
|
case PHASE_ALL:
|
|
mrs_plc_tx_phase_a_on();
|
|
mrs_plc_tx_phase_b_on();
|
|
mrs_plc_tx_phase_c_on();
|
|
break;
|
|
|
|
case PHASE_A:
|
|
mrs_plc_tx_phase_a_on();
|
|
break;
|
|
|
|
case PHASE_B:
|
|
mrs_plc_tx_phase_b_on();
|
|
break;
|
|
|
|
case PHASE_C:
|
|
mrs_plc_tx_phase_c_on();
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
td_void mrs_cco_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;
|
|
}
|
|
|
|
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_plc_tx_phase_a_on_ev(td_void)
|
|
{
|
|
uapi_led_on(EXT_LED_IDX_4);
|
|
}
|
|
|
|
td_void mrs_plc_tx_phase_b_on_ev(td_void)
|
|
{
|
|
uapi_io_set_ouput_val(EXT_GPIO_IDX_22, EXT_GPIO_VALUE1);
|
|
}
|
|
|
|
td_void mrs_plc_tx_phase_c_on_ev(td_void)
|
|
{
|
|
uapi_io_set_ouput_val(EXT_GPIO_IDX_20, EXT_GPIO_VALUE1);
|
|
}
|
|
|
|
td_void mrs_plc_tx_phase_a_off_ev(td_void)
|
|
{
|
|
uapi_led_off(EXT_LED_IDX_4);
|
|
}
|
|
|
|
td_void mrs_plc_tx_phase_b_off_ev(td_void)
|
|
{
|
|
uapi_io_set_ouput_val(EXT_GPIO_IDX_22, EXT_GPIO_VALUE0);
|
|
}
|
|
|
|
td_void mrs_plc_tx_phase_c_off_ev(td_void)
|
|
{
|
|
uapi_io_set_ouput_val(EXT_GPIO_IDX_20, EXT_GPIO_VALUE0);
|
|
}
|
|
|
|
td_void mrs_plc_tx_phase_a_on_sv(td_void)
|
|
{
|
|
uapi_io_set_ouput_val(EXT_GPIO_IDX_19, EXT_GPIO_VALUE1);
|
|
}
|
|
|
|
td_void mrs_plc_tx_phase_b_on_sv(td_void)
|
|
{
|
|
uapi_led_on(EXT_LED_IDX_4);
|
|
}
|
|
|
|
td_void mrs_plc_tx_phase_c_on_sv(td_void)
|
|
{
|
|
uapi_led_on(EXT_LED_IDX_2);
|
|
}
|
|
|
|
td_void mrs_plc_tx_phase_a_off_sv(td_void)
|
|
{
|
|
uapi_io_set_ouput_val(EXT_GPIO_IDX_19, EXT_GPIO_VALUE0);
|
|
}
|
|
|
|
td_void mrs_plc_tx_phase_b_off_sv(td_void)
|
|
{
|
|
uapi_led_off(EXT_LED_IDX_4);
|
|
}
|
|
|
|
td_void mrs_plc_tx_phase_c_off_sv(td_void)
|
|
{
|
|
uapi_led_off(EXT_LED_IDX_2);
|
|
}
|
|
|
|
td_void mrs_plc_tx_phase_a_off(td_void)
|
|
{
|
|
g_cco_phase_a_led_off();
|
|
}
|
|
|
|
td_void mrs_plc_tx_phase_b_off(td_void)
|
|
{
|
|
g_cco_phase_b_led_off();
|
|
}
|
|
|
|
td_void mrs_plc_tx_phase_c_off(td_void)
|
|
{
|
|
g_cco_phase_c_led_off();
|
|
}
|
|
|
|
td_void mrs_plc_tx_phase_a_on(td_void)
|
|
{
|
|
g_cco_phase_a_led_on();
|
|
mrs_timer_start(MRS_TIMER_ID_LED_PHASE_A, MRS_PLC_LED_TIME, EXT_TIMER_TYPE_ONCE);
|
|
}
|
|
|
|
td_void mrs_plc_tx_phase_b_on(td_void)
|
|
{
|
|
g_cco_phase_b_led_on();
|
|
mrs_timer_start(MRS_TIMER_ID_LED_PHASE_B, MRS_PLC_LED_TIME, EXT_TIMER_TYPE_ONCE);
|
|
}
|
|
|
|
td_void mrs_plc_tx_phase_c_on(td_void)
|
|
{
|
|
g_cco_phase_c_led_on();
|
|
mrs_timer_start(MRS_TIMER_ID_LED_PHASE_C, MRS_PLC_LED_TIME, EXT_TIMER_TYPE_ONCE);
|
|
}
|
|
|
|
#endif /* defined(PRODUCT_CFG_PRODUCT_TYPE_CCO) */
|