349 lines
10 KiB
C
349 lines
10 KiB
C
/*
|
|
* Copyright (c) CompanyNameMagicTag 2019-2020. All rights reserved.
|
|
* Description: MRS main entry.
|
|
*/
|
|
|
|
#include "mrs_common_main.h"
|
|
#include "mrs_proto.h"
|
|
#include "mrs_msg.h"
|
|
#include "mrs_common_power_manage.h"
|
|
#include "mrs_common_tools.h"
|
|
#include "mrs_common_diag.h"
|
|
#include "mrs_cco_srv.h"
|
|
#include "mrs_cco_io.h"
|
|
#include "mrs_sta_srv.h"
|
|
#include "mrs_ndm_srv.h"
|
|
#include "mrs_dfx.h"
|
|
#include "soc_mdm_adc_control.h"
|
|
#include "soc_mdm_adc.h"
|
|
#include "mrs_common_power_failure.h"
|
|
#include "mrs_sta_power_failure.h"
|
|
#include "soc_mdm_pi.h"
|
|
#include "soc_mdm_tl.h"
|
|
#include "mrs_common_capture.h"
|
|
#include "dfx_app.h"
|
|
#include "soc_mdm_tf.h"
|
|
|
|
static mrs_main_srv_context *g_mrs_main_srv = TD_NULL;
|
|
|
|
td_void mrs_main_init(td_void);
|
|
td_u32 mrs_main_context_init(td_void);
|
|
td_u32 mrs_main_res_init(EXT_CONST mrs_main_srv_context *ctx);
|
|
td_void mrs_main_task_body(uintptr_t param);
|
|
td_void mrs_msg_handle(EXT_CONST mrs_queue_msg *msg);
|
|
td_void mrs_main_init_mac_addr(td_void);
|
|
td_u32 app_query_mrs_version_info(EXT_OUT td_pbyte ver_info, EXT_IN EXT_CONST td_u16 ver_info_size);
|
|
|
|
__hot mrs_main_srv_context *mrs_get_main_srv_ctx(td_void)
|
|
{
|
|
return g_mrs_main_srv;
|
|
}
|
|
|
|
#if defined(PRODUCT_CFG_DEBUG_CRASH_MRS)
|
|
__isr td_void led_flash_when_exc(td_void)
|
|
{
|
|
uapi_watchdog_disable();
|
|
#ifdef PRODUCT_CFG_PRODUCT_TYPE_STA
|
|
uapi_io_set_func(EXT_GPIO_IDX_6, 0);
|
|
uapi_io_set_dir(EXT_GPIO_IDX_6, EXT_GPIO_DIRECTION_OUT);
|
|
uapi_io_set_ouput_val(EXT_GPIO_IDX_6, EXT_GPIO_VALUE0);
|
|
while (1) {
|
|
for (uintptr_t i = 0x02000000; i < 0x02038000; i += 16) { /* shifts 16bits */
|
|
if ((i & 0x3ff) == 0 && (i & 0x7ff) != 0) {
|
|
uapi_io_set_ouput_val(EXT_GPIO_IDX_6, EXT_GPIO_VALUE1);
|
|
uapi_led_on(EXT_LED_IDX_4);
|
|
uapi_led_on(EXT_LED_IDX_1);
|
|
uapi_led_on(EXT_LED_IDX_0);
|
|
} else if ((i & 0x3ff) == 0) {
|
|
uapi_led_off(EXT_LED_IDX_4);
|
|
uapi_led_off(EXT_LED_IDX_1);
|
|
uapi_led_off(EXT_LED_IDX_0);
|
|
uapi_io_set_ouput_val(EXT_GPIO_IDX_6, EXT_GPIO_VALUE0);
|
|
}
|
|
printf(" 0x%08x: 0x%08x 0x%08x 0x%08x 0x%08x \n",
|
|
i, *(td_u32 *)i, *(td_u32 *)(i + 4), *(td_u32 *)(i + 8), *(td_u32 *)(i + 12)); /* shifts 4/8/12b */
|
|
}
|
|
}
|
|
#else
|
|
while (1) {
|
|
for (uintptr_t i = 0x02000000; i < 0x02038000; i += 16) { /* shifts 16bits */
|
|
if ((i & 0x3ff) == 0 && (i & 0x7ff) != 0) {
|
|
uapi_led_on(EXT_LED_IDX_4);
|
|
uapi_led_on(EXT_LED_IDX_1);
|
|
uapi_led_on(EXT_LED_IDX_0);
|
|
} else if ((i & 0x3ff) == 0) {
|
|
uapi_led_off(EXT_LED_IDX_4);
|
|
uapi_led_off(EXT_LED_IDX_1);
|
|
uapi_led_off(EXT_LED_IDX_0);
|
|
}
|
|
printf(" 0x%08x: 0x%08x 0x%08x 0x%08x 0x%08x \n",
|
|
i, *(td_u32 *)i, *(td_u32 *)(i + 4), *(td_u32 *)(i + 8), *(td_u32 *)(i + 12)); /* shifts 4/8/12b */
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
#endif
|
|
|
|
td_void mrs_adc_ctrl_pi_init(td_void)
|
|
{
|
|
#if defined(PRODUCT_CFG_PRODUCT_TYPE_CCO) || defined(PRODUCT_CFG_PRODUCT_TYPE_STA)
|
|
ext_adc_channel_index_en channel[AD_COLLECT_ENTRY_NUM];
|
|
#endif
|
|
|
|
/* set data aquisition channel and data aquisition self checking parameter */
|
|
#if defined(PRODUCT_CFG_PRODUCT_TYPE_CCO)
|
|
channel[0] = EN_CHANNEL_6;
|
|
uapi_adc_set_channel(channel, 1);
|
|
#endif
|
|
#if defined(PRODUCT_CFG_PRODUCT_TYPE_STA)
|
|
channel[0] = EN_CHANNEL_6;
|
|
uapi_adc_set_channel(channel, 1);
|
|
#endif
|
|
uapi_adc_set_self_check_para(AD_SELF_CHECK_COLLECT_CYCLE, AD_SELF_CHECK_COLLECT_DURATION, AD_POWER_FAILURE_DIFF_TH);
|
|
/* initialization for data aquisition control module */
|
|
uapi_adc_control_init();
|
|
uapi_sar_adc_noiseshaping_cfg(EN_NOISE_SHAPING_OFF);
|
|
|
|
#if defined(PRODUCT_CFG_PRODUCT_TYPE_STA) || defined(PRODUCT_CFG_PRODUCT_TYPE_CCO)
|
|
/* loading phase identification module */
|
|
uapi_load_pi();
|
|
#endif
|
|
}
|
|
|
|
td_void app_main(td_void)
|
|
{
|
|
#if defined(PRODUCT_CFG_DEBUG_CRASH_MRS)
|
|
uapi_syserr_exc_register((ext_syserr_exc_callback)led_flash_when_exc);
|
|
#endif
|
|
(td_void) uapi_board_init();
|
|
(td_void) uapi_io_int_init();
|
|
(td_void) uapi_aes_init();
|
|
uapi_phy_init();
|
|
#if defined(PRODUCT_CFG_PRODUCT_TYPE_CCO)
|
|
mrs_cco_phase_init();
|
|
#endif
|
|
uapi_mac_cp_init();
|
|
uapi_load_sg_and_1901_protocol();
|
|
/* loading transport-layer */
|
|
uapi_load_tl(APP_TL_QUEUE_SIZE);
|
|
|
|
#if !defined(PRODUCT_CFG_PRODUCT_TYPE_CCO)
|
|
uapi_load_p2p_component_p1901();
|
|
#endif
|
|
#if defined(PRODUCT_CFG_PRODUCT_TYPE_STA) || defined(PRODUCT_CFG_PRODUCT_TYPE_CCO)
|
|
uapi_load_config_belong_network_component();
|
|
#endif
|
|
mrs_adc_ctrl_pi_init();
|
|
|
|
#if defined(PRODUCT_CFG_PRODUCT_TYPE_STA)
|
|
/* loading transformer identify module */
|
|
uapi_load_tf_snr_component();
|
|
#if defined(PRODUCT_CFG_SUPPORT_UPG_FROM_DBK)
|
|
uapi_upg_sta_cmd_init();
|
|
#endif
|
|
#endif
|
|
|
|
(td_void) uapi_mac_init();
|
|
uapi_phase_evaluate_enable();
|
|
|
|
mrs_common_power_manage_init();
|
|
(td_void) uapi_diag_init();
|
|
(td_void) uapi_mid_init();
|
|
/* set partition info for list upgrading. By default, using user data partition: [0x7B000,0x7D000). */
|
|
#if defined(PRODUCT_CFG_PRODUCT_TYPE_CCO)
|
|
ext_flash_partition_table *partition = uapi_get_partition_table();
|
|
if (partition->table[EXT_FLASH_PARTITON_USER_INFO_1].size_blk >= 2) { /* more than 2blocks */
|
|
uapi_upg_list_set_cache_info(partition->table[EXT_FLASH_PARTITON_USER_INFO_1].addr_blk,
|
|
2); /* Cache size: 2 blks */
|
|
}
|
|
#endif
|
|
uapi_upg_init();
|
|
mrs_dfx_init();
|
|
mrs_main_init();
|
|
|
|
(td_void) uapi_diag_register_query_app_ver_cmd_callback((ext_mdm_query_app_ver)app_query_mrs_version_info);
|
|
}
|
|
|
|
td_void mrs_main_init(td_void)
|
|
{
|
|
td_u32 ret;
|
|
mrs_main_srv_context *ctx = TD_NULL;
|
|
|
|
ret = mrs_main_context_init();
|
|
if (ret != EXT_ERR_SUCCESS) {
|
|
return;
|
|
}
|
|
|
|
ctx = mrs_get_main_srv_ctx();
|
|
|
|
ret = mrs_uart_init();
|
|
if (ret != EXT_ERR_SUCCESS) {
|
|
return;
|
|
}
|
|
|
|
ret = mrs_proto_init();
|
|
if (ret != EXT_ERR_SUCCESS) {
|
|
return;
|
|
}
|
|
|
|
ret = mrs_main_res_init(ctx);
|
|
if (ret != EXT_ERR_SUCCESS) {
|
|
return;
|
|
}
|
|
|
|
ret = mrs_plc_chl_init();
|
|
if (ret != EXT_ERR_SUCCESS) {
|
|
return;
|
|
}
|
|
|
|
mrs_main_init_mac_addr();
|
|
/* power down detection feature(download settings) */
|
|
mrs_common_power_failure_init();
|
|
#if defined(PRODUCT_CFG_PRODUCT_TYPE_STA)
|
|
mrs_pwf_init();
|
|
#endif
|
|
#if defined(PRODUCT_CFG_PRODUCT_TYPE_STA) || defined(PRODUCT_CFG_PRODUCT_TYPE_CCO)
|
|
mrs_common_capture_init();
|
|
uapi_register_power_failure_rejoin_event_report(mrs_handle_power_failure_rejoin_event);
|
|
#endif
|
|
}
|
|
|
|
td_u32 mrs_main_context_init(td_void)
|
|
{
|
|
if (g_mrs_main_srv != TD_NULL) {
|
|
return EXT_ERR_INITILIZATION_ALREADY;
|
|
}
|
|
|
|
g_mrs_main_srv = (mrs_main_srv_context *)mrs_malloc(sizeof(mrs_main_srv_context));
|
|
if (g_mrs_main_srv == TD_NULL) {
|
|
return EXT_ERR_MALLOC_FAILUE;
|
|
}
|
|
|
|
(td_void) memset_s(g_mrs_main_srv, sizeof(mrs_main_srv_context), 0, sizeof(mrs_main_srv_context));
|
|
|
|
return EXT_ERR_SUCCESS;
|
|
}
|
|
|
|
td_u32 mrs_main_res_init(EXT_CONST mrs_main_srv_context *ctx)
|
|
{
|
|
td_u32 ret;
|
|
td_u32 task_id = EXT_ERR_INVALID_ID;
|
|
td_s8 i;
|
|
|
|
ret = uapi_msg_queue_create((td_u32 *)&ctx->queue_id, "mrsq", MRS_MAIN_QUEUE_SIZE, sizeof(mrs_queue_msg));
|
|
if (ret != EXT_ERR_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
for (i = 0; i < MRS_SEM_ID_MAX; i++) {
|
|
ret = uapi_sem_bcreate((td_u32 *)&ctx->sem_id[i], "sem_mrs", 1);
|
|
if (ret != EXT_ERR_SUCCESS) {
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
ret = uapi_task_create(&task_id, "srv_mrs", mrs_main_task_body, ctx->queue_id,
|
|
MRS_MAIN_TASK_STACK_SIZE, MRS_MAIN_TASK_PRIORITY);
|
|
if (ret != EXT_ERR_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
ret = uapi_task_create(&task_id, "uart_m", mrs_uart_task_body, 0, MRS_UART_TASK_STACK_SIZE,
|
|
MRS_UART_TASK_PRIORITY);
|
|
if (ret != EXT_ERR_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
td_void mrs_main_task_body(uintptr_t param)
|
|
{
|
|
td_u32 ret;
|
|
mrs_queue_msg msg = { 0 };
|
|
td_u32 queue_id = (td_u32)param;
|
|
|
|
mrs_srv_init();
|
|
mrs_diag_init();
|
|
|
|
for (;;) {
|
|
ret = uapi_msg_queue_wait(queue_id, &msg, EXT_SYS_WAIT_FOREVER, sizeof(mrs_queue_msg));
|
|
if (ret == EXT_ERR_SUCCESS) {
|
|
mrs_msg_handle(&msg);
|
|
continue;
|
|
}
|
|
|
|
uapi_sleep(1000); /* sleep time: 1000ms */
|
|
}
|
|
}
|
|
|
|
td_void mrs_msg_handle(EXT_CONST mrs_queue_msg *msg)
|
|
{
|
|
mrs_msg_handler_fct handler[] = MRS_MSG_HANDLER_MAP;
|
|
|
|
if (msg->id >= MRS_MSG_ID_MAX) {
|
|
return;
|
|
}
|
|
|
|
if (handler[msg->id] != TD_NULL) {
|
|
handler[msg->id](msg);
|
|
}
|
|
}
|
|
|
|
td_void mrs_main_init_mac_addr(td_void)
|
|
{
|
|
td_u32 ret;
|
|
errno_t err;
|
|
td_u8 mac[EXT_PLC_MAC_ADDR_LEN] = { 0 };
|
|
td_u32 result;
|
|
|
|
ret = uapi_get_local_mac_addr(mac, sizeof(mac));
|
|
if (ret != EXT_ERR_SUCCESS) {
|
|
return;
|
|
}
|
|
|
|
if (mrs_is_invalid_mac_addr(mac)) {
|
|
td_u32 trng_result[2] = { 0 }; /* note: 2*4 = 8bytes */
|
|
ext_nv_ftm_product_id nv = { EXT_FTM_PRODUCT_TYPE_UNKOWN, { 0 }, { 0 } };
|
|
|
|
ret = uapi_factory_nv_read(EXT_NV_FTM_PRODUCT_ID, &nv, sizeof(nv));
|
|
if (ret != EXT_ERR_SUCCESS) {
|
|
return;
|
|
}
|
|
|
|
result = 0;
|
|
(td_void) uapi_trng_getrandom(&result);
|
|
trng_result[0] = result;
|
|
(td_void) uapi_trng_getrandom(&result);
|
|
trng_result[1] = result;
|
|
|
|
err = memcpy_s(nv.plc_mac, sizeof(nv.plc_mac), trng_result, EXT_PLC_MAC_ADDR_LEN);
|
|
if (err != EOK) {
|
|
return;
|
|
}
|
|
|
|
ret = uapi_factory_nv_write(EXT_NV_FTM_PRODUCT_ID, &nv, sizeof(nv));
|
|
if (ret != EXT_ERR_SUCCESS) {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
td_u32 app_query_mrs_version_info(EXT_OUT td_pbyte ver_info, EXT_IN EXT_CONST td_u16 ver_info_size)
|
|
{
|
|
td_char app_name[] = {"MRS"};
|
|
ext_app_ver_cmd_ind_info *cur_ver_info = TD_NULL;
|
|
|
|
if (ver_info == TD_NULL || ver_info_size != sizeof(ext_app_ver_cmd_ind_info)) {
|
|
return EXT_ERR_FAILURE;
|
|
}
|
|
|
|
cur_ver_info = (ext_app_ver_cmd_ind_info *)ver_info;
|
|
if (strcpy_s((td_char *)cur_ver_info->app_name, sizeof(app_name), app_name) != EOK) {
|
|
return EXT_ERR_FAILURE;
|
|
}
|
|
|
|
return EXT_ERR_SUCCESS;
|
|
}
|