inwudriver-weibo/app/mrs/common/mrs_common_uart.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;
}