142 lines
3.8 KiB
C
142 lines
3.8 KiB
C
/*
|
|
* Copyright (c) CompanyNameMagicTag 2019-2020. All rights reserved.
|
|
* Description: MRS uart entry.
|
|
*/
|
|
|
|
#include "mrs_common_uart.h"
|
|
#include "mrs_config.h"
|
|
#include "mrs_common_tools.h"
|
|
#include "mrs_common_main.h"
|
|
#include "mrs_dfx.h"
|
|
#include "soc_mac_nv.h"
|
|
|
|
ext_uart_port g_mrs_uart_port = MRS_SRV_UART_PORT;
|
|
|
|
static td_void mrs_uart_rx_handle(td_u8 ch);
|
|
|
|
td_u32 mrs_uart_init(td_void)
|
|
{
|
|
td_u32 ret;
|
|
ext_uart_init_type init = {
|
|
MRS_SRV_UART_BAUDRATE, MRS_SRV_UART_DATABITS,
|
|
MRS_SRV_UART_STOPBITS, MRS_SRV_UART_PARITY
|
|
};
|
|
|
|
#ifdef PRODUCT_CFG_PRODUCT_TYPE_NDM
|
|
diag_cmd_config_ndm_connect_para_stru ndm_param = { 0 };
|
|
ret = uapi_nv_read(ID_DIAG_CMD_CONFIG_NDM_CONNECT_PARA,
|
|
&ndm_param, sizeof(diag_cmd_config_ndm_connect_para_stru));
|
|
if (ret == EXT_ERR_SUCCESS) {
|
|
switch (ndm_param.work_mode) {
|
|
case EXT_NDM_CIU_MODE_SWITCH_COM:
|
|
case EXT_NDM_SEARCH_NET_MODE_SWITCH_COM:
|
|
g_mrs_uart_port = EXT_UART_1; /* business port. CNComents:业务串口 */
|
|
break;
|
|
case EXT_NDM_UNKNOWN_WORK_MODE:
|
|
case EXT_NDM_CIU_MODE:
|
|
case EXT_NDM_SEARCH_NET_MODE: /* 2 is search mode */
|
|
g_mrs_uart_port = EXT_UART_0; /* debug port. CNComents:调试串口 */
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
#endif
|
|
(td_void) uapi_uart_close(g_mrs_uart_port);
|
|
ret = uapi_uart_open(g_mrs_uart_port);
|
|
if (ret != EXT_ERR_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
ret = uapi_uart_ioctl(g_mrs_uart_port, UART_CFG_SET_ATTR, (uintptr_t)&init);
|
|
if (ret != EXT_ERR_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
mrs_uart_register_tx_callback(mrs_uart_send_data);
|
|
|
|
return ret;
|
|
}
|
|
|
|
td_void mrs_uart_task_body(uintptr_t param)
|
|
{
|
|
td_s32 len;
|
|
td_u8 ch = 0;
|
|
|
|
ext_unref_param(param);
|
|
|
|
for (;;) {
|
|
len = uapi_uart_read(g_mrs_uart_port, &ch, 1);
|
|
if (len == 1) {
|
|
mrs_uart_rx_handle(ch);
|
|
continue;
|
|
}
|
|
|
|
uapi_sleep(1000); /* sleep time 1000ms */
|
|
}
|
|
}
|
|
|
|
td_void mrs_uart_register_rx_callback(mrs_uart_recv callback)
|
|
{
|
|
mrs_main_srv_context *srv = mrs_get_main_srv_ctx();
|
|
|
|
mrs_printf("mrs_uart_register_rx_fct: %x\n", (uintptr_t)callback);
|
|
if (srv != TD_NULL) {
|
|
srv->uart_callback.recv = callback;
|
|
}
|
|
}
|
|
|
|
td_void mrs_uart_register_tx_callback(mrs_uart_send callback)
|
|
{
|
|
mrs_main_srv_context *srv = mrs_get_main_srv_ctx();
|
|
if (srv != TD_NULL) {
|
|
srv->uart_callback.send = callback;
|
|
}
|
|
}
|
|
|
|
static td_void mrs_uart_rx_handle(td_u8 ch)
|
|
{
|
|
mrs_main_srv_context *srv = mrs_get_main_srv_ctx();
|
|
|
|
if (srv == TD_NULL) {
|
|
return;
|
|
}
|
|
|
|
mrs_dfx_uart_chl_rx(&ch, 1, TD_FALSE);
|
|
|
|
if (srv->uart_callback.recv != TD_NULL) {
|
|
srv->uart_callback.recv(ch);
|
|
}
|
|
}
|
|
|
|
td_u16 mrs_uart_send_data(td_pbyte data, td_u16 length)
|
|
{
|
|
return (td_u16)uapi_uart_write(g_mrs_uart_port, data, length);
|
|
}
|
|
|
|
td_u32 mrs_uart_tx(td_pbyte data, td_u16 length)
|
|
{
|
|
mrs_main_srv_context *srv = mrs_get_main_srv_ctx();
|
|
|
|
mrs_logbuf("[ Tx]: ", data, length);
|
|
mrs_dfx_uart_chl_tx(data, length);
|
|
|
|
if (srv == TD_NULL) {
|
|
mrs_dfx_uart_chl_tx_err_cnt(length, EXT_ERR_INVALID_PARAMETER);
|
|
return EXT_ERR_NO_INITILIZATION;
|
|
}
|
|
|
|
if (srv->uart_callback.send == TD_NULL) {
|
|
mrs_dfx_uart_chl_tx_err_cnt(length, EXT_ERR_NOT_SUPPORT);
|
|
return EXT_ERR_NO_INITILIZATION;
|
|
}
|
|
|
|
if (length != srv->uart_callback.send(data, length)) {
|
|
mrs_dfx_uart_chl_tx_err_cnt(length, EXT_ERR_FAILURE);
|
|
return EXT_ERR_FAILURE;
|
|
}
|
|
|
|
mrs_dfx_uart_chl_tx_ok_cnt(length);
|
|
return EXT_ERR_SUCCESS;
|
|
}
|