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