214 lines
6.7 KiB
C
214 lines
6.7 KiB
C
/****************************************************************************
|
|
|
|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
|
|
|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
|
be copied by any method or incorporated into another program without
|
|
the express written consent of Aerospace C.Power. This Information or any portion
|
|
thereof remains the property of Aerospace C.Power. The Information contained herein
|
|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
|
liability for its use in any way and conveys no license or title under
|
|
any patent or copyright and makes no representation or warranty that this
|
|
Information is free from patent or copyright infringement.
|
|
|
|
****************************************************************************/
|
|
|
|
#ifndef IOT_UART_H_H
|
|
#define IOT_UART_H_H
|
|
|
|
#include "iot_config.h"
|
|
#include "iot_frame_parse_api.h"
|
|
#include "os_task_api.h"
|
|
#include "os_lock_api.h"
|
|
#include "os_timer_api.h"
|
|
#include "iot_mem_pool_api.h"
|
|
|
|
#if (IOT_UART_DMA_SUPPORT == 1)
|
|
#include "osif_dma_uart.h"
|
|
#else
|
|
typedef void* iot_dma_uart_h;
|
|
#endif
|
|
|
|
/* export includes */
|
|
#include "iot_uart_api.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @brief Type of uart phy-port..
|
|
*/
|
|
typedef enum _iot_uart_type_e {
|
|
UART_TYPE_OC = 0, /* Uart is on KL chip. */
|
|
UART_TYPE_EXT, /* Uart is on an ext-uart-chip. */
|
|
UART_TYPE_VP /* Uart is virtual port, by USB transfered. */
|
|
} iot_uart_type_e;
|
|
|
|
typedef struct _iot_uart {
|
|
//iot_list_head_t link;
|
|
#ifdef _MSC_VER
|
|
/*receive task handle for win simulator*/
|
|
os_task_h receive_task_handle;
|
|
void *uart_handle;
|
|
#else
|
|
int uart_handle;
|
|
iot_dma_uart_h uart_dma_handle;
|
|
#endif
|
|
int uart_port;
|
|
/* the callback after receive a frame*/
|
|
iot_uart_recv_func_t recv_func;
|
|
/* save callback function before taken */
|
|
iot_uart_recv_func_t old_recv_func;
|
|
|
|
/*the receive buffer per uart port*/
|
|
uint8_t* recv_buffer;
|
|
uint32_t recv_buffer_len;
|
|
iot_mem_pool_t *mem_pool;
|
|
ringbuf_t recv_ring;
|
|
/*frame format per uart port*/
|
|
iot_frame_fmt *frame_fmt;
|
|
/* save old frame format */
|
|
iot_frame_fmt old_frame_fmt;
|
|
/*the lock for receive buffer*/
|
|
os_mutex_h frame_buffer_lock;
|
|
/*if receive the preamble code, will create a timer to receive the back code,
|
|
if timeout happen, will clear the data in receive buffer, the time out value
|
|
can be changed in iot_frame_fmt format*/
|
|
timer_id_t frame_timer;
|
|
/*send buffer pre uart port*/
|
|
ringbuf_t send_ring;
|
|
uint8_t* send_buffer;
|
|
//uint32_t send_cur_pos;
|
|
uint32_t send_buffer_len;
|
|
/* memory pool for send buffer */
|
|
iot_mem_pool_t *send_mem_pool;
|
|
/* flag to mark already tanken */
|
|
uint8_t taken;
|
|
/* 1 is dma mode*/
|
|
uint8_t is_dma_mode;
|
|
uint32_t dma_rx_pending_cnt;
|
|
uint32_t bandrate;
|
|
/* timeout for no formate frame checking */
|
|
uint32_t no_fmt_timeout;
|
|
} iot_uart_h_t;
|
|
|
|
/**
|
|
* @brief Check if a logic-port is an onchip port.
|
|
*/
|
|
uint32_t iot_uart_is_onchip(uint8_t lport);
|
|
|
|
/**
|
|
* @brief Check if a logic-port is an external port.
|
|
*/
|
|
uint32_t iot_uart_is_external(uint8_t lport);
|
|
|
|
/**
|
|
* @brief Check if a logic-port is an virtual port.
|
|
*/
|
|
uint32_t iot_uart_is_virtual(uint8_t lport);
|
|
|
|
/**
|
|
* @brief Convert logic-port to phy-port.
|
|
*/
|
|
uint8_t iot_uart_lport_to_pport(uint8_t lport);
|
|
|
|
/**
|
|
* @brief Convert phy-port to logic-port.
|
|
*/
|
|
uint8_t iot_uart_pport_to_lport(iot_uart_type_e type, uint8_t pport);
|
|
|
|
/*
|
|
* @brief iot_uart_init() - init uart internal resource.
|
|
* @param ftm_mode flag to mark if current firmware is working in FTM mode
|
|
*
|
|
* @return: true - success
|
|
* @return: otherwise - failure
|
|
*/
|
|
bool_t iot_uart_init(uint8_t ftm_mode);
|
|
|
|
/*
|
|
* iot_uart_deinit() - deinit uart internal resource.
|
|
*
|
|
* return:
|
|
* true - success
|
|
* otherwise - failure
|
|
*/
|
|
bool_t iot_uart_deinit();
|
|
|
|
/**
|
|
* @brief iot_uart_taken() - for the already opened uart, get the existing uart
|
|
* handle by uart port id, and install the new receive
|
|
* callback function and format. If the uart port is
|
|
* not opened yet, the behavior is same as
|
|
* iot_uart_open. NOTE that this function is tricky,
|
|
* the callback function can be called before this
|
|
* function returned.
|
|
* @param uart_port: uart port id
|
|
* @param func: callback function to receive data
|
|
* @receive_buffer_len: the buffer size to receive a full frame.
|
|
* @p_frame_fmt: the format structure of a full frame, if it is null,
|
|
* recv_func will be invoked once receive any uart message.
|
|
* @retval: NULL -- fail.
|
|
* @retval: otherwise -- pointer to uart handle.
|
|
*/
|
|
iot_uart_h iot_uart_taken(const uint8_t uart_port, iot_uart_recv_func_t func,
|
|
uint32_t receive_buffer_len, iot_frame_fmt *p_frame_fmt);
|
|
|
|
/**
|
|
* @brief iot_uart_release() - release already taken uart port. NOTE that this
|
|
* function is tricky, the callback function can be
|
|
* called after this function returned.
|
|
* @param uart_port: uart port id
|
|
*/
|
|
void iot_uart_release(const uint8_t uart_port);
|
|
|
|
/**
|
|
* @brief iot_uart_send_taken() - send the buffer by already taken uart port,
|
|
* it is a asyn func.
|
|
* @param uart_h: handle of the UART obtained by the iot_uart_taken
|
|
* function.
|
|
* @param pkt: the iot pkt buffer.
|
|
* @param p_frame_fmt: the format structor of the frame.
|
|
* @retval: 0 -- success.
|
|
* @retval: otherwise -- error code.
|
|
*/
|
|
uint32_t iot_uart_send_taken(iot_uart_h uart_h, iot_pkt_t *pkt,
|
|
iot_frame_fmt *p_frame_fmt);
|
|
|
|
/**
|
|
* @brief iot_uart_set_config_taken() - set paramter to the already taken
|
|
* uart port.
|
|
* @param uart_h: handle of the UART obtained by the iot_uart_taken
|
|
* @param baud: baudrate
|
|
* @param parity: see IOT_UART_PARITY_XXX
|
|
* @param data: data bits
|
|
* @param stop: stop flag
|
|
*
|
|
* @retval: false -- for failure case
|
|
* @retcal: true -- success
|
|
*/
|
|
bool_t iot_uart_set_config_taken(iot_uart_h uart_h, uint32_t baud,
|
|
uint8_t parity, uint8_t data, uint8_t stop);
|
|
|
|
/*
|
|
* iot_uart_task_post_ext_isr_event() - Post isr event to uart task.
|
|
*/
|
|
void iot_uart_task_post_ext_isr_event(void);
|
|
|
|
/**
|
|
* @brief iot_uart_ctrl_ir_loopback() - set paramter to crtl ir loopback
|
|
*
|
|
* @param en: true-close ir loopback false-open ir loopback
|
|
*
|
|
* @retval: false -- fail
|
|
* @retcal: true -- success
|
|
*/
|
|
bool_t iot_uart_ctrl_ir_loopback(iot_uart_h uart_h, bool_t en);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* IOT_UART_H_H */
|