inwudriver-weibo/app/mrs/cco/mrs_cco_io.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) */