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 */
 |