| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548 |
- /**
- * @file wm_uart.h
- *
- * @brief uart Driver Module
- *
- * @author dave
- *
- * Copyright (c) 2015 Winner Microelectronics Co., Ltd.
- */
- #ifndef WM_UART_H
- #define WM_UART_H
- #include "list.h"
- //#include "wm_regs.h"
- #include "wm_type_def.h"
- #include "wm_osal.h"
- #define TLS_UART_RX_BUF_SIZE 4096
- #define TLS_UART_TX_BUF_SIZE 4096
- #define WAKEUP_CHARS 256
- #define MBOX_MSG_UART_RX 1
- #define MBOX_MSG_UART_TX 2
- /** baud rate definition */
- #define UART_BAUDRATE_B600 600
- #define UART_BAUDRATE_B1200 1200
- #define UART_BAUDRATE_B1800 1800
- #define UART_BAUDRATE_B2400 2400
- #define UART_BAUDRATE_B4800 4800
- #define UART_BAUDRATE_B9600 9600
- #define UART_BAUDRATE_B19200 19200
- #define UART_BAUDRATE_B38400 38400
- #define UART_BAUDRATE_B57600 57600
- #define UART_BAUDRATE_B115200 115200
- #define UART_BAUDRATE_B230400 230400
- #define UART_BAUDRATE_B460800 460800
- #define UART_BAUDRATE_B921600 921600
- #define UART_BAUDRATE_B1000000 1000000
- #define UART_BAUDRATE_B1250000 1250000
- #define UART_BAUDRATE_B1500000 1500000
- #define UART_BAUDRATE_B2000000 2000000
- #define UART_RX_INT_FLAG (UIS_RX_FIFO | UIS_RX_FIFO_TIMEOUT | UIS_BREAK |\
- UIS_OVERRUN | UIS_FRM_ERR | UIS_PARITY_ERR)
- #define UART_RX_ERR_INT_FLAG (UIS_BREAK | UIS_FRM_ERR | \
- UIS_PARITY_ERR)
- #define UART_TX_INT_FLAG (UIS_TX_FIFO | UIS_TX_FIFO_EMPTY)
- /** return count in buffer. */
- #define CIRC_CNT(head,tail,size) (((head) - (tail)) & ((size)-1))
- /** Return space available, 0..size-1. We always leave one free char
- as a completely full buffer has head == tail, which is the same as
- empty. */
- #define CIRC_SPACE(head,tail,size) CIRC_CNT((tail),((head)+1),(size))
- /** Return count up to the end of the buffer. Carefully avoid
- accessing head and tail more than once, so they can change
- underneath us without returning inconsistent results. */
- #define CIRC_CNT_TO_END(head,tail,size) \
- ({int end = (size) - (tail); \
- int n = ((head) + end) & ((size)-1); \
- n < end ? n : end;})
- /** Return space available up to the end of the buffer. */
- #define CIRC_SPACE_TO_END(head,tail,size) \
- ({int end = (size) - 1 - (head); \
- int n = (end + (tail)) & ((size)-1); \
- n <= end ? n : end+1;})
- #define CIRC_SPACE_TO_END_FULL(head,tail,size) \
- ({int end = (size) - 1 - (head); \
- int n = (end + (tail)) & ((size)-1); \
- n < end ? n : end+1;})
- #define uart_circ_empty(circ) ((circ)->head == (circ)->tail)
- #define uart_circ_chars_pending(circ) \
- (CIRC_CNT((circ)->head, (circ)->tail, TLS_UART_TX_BUF_SIZE))
- /**
- * @struct tls_uart_baud_rate baudrate define
- */
- struct tls_uart_baud_rate
- {
- u32 baud_rate;
- u16 ubdiv;
- u16 ubdiv_frac;
- };
- /**
- * @enum uart number enum
- */
- enum
- {
- TLS_UART_0 = 0,
- TLS_UART_1 = 1,
- TLS_UART_2 = 2,
- TLS_UART_3 = 3,
- TLS_UART_4 = 4,
- TLS_UART_5 = 5,
- TLS_UART_MAX = 6,
- };
- /**
- * @typedef enum TLS_UART_PMODE Parity Mode
- */
- typedef enum TLS_UART_PMODE
- {
- TLS_UART_PMODE_DISABLED = 0, /**< No Parity */
- TLS_UART_PMODE_ODD = 1, /**< Odd Parity */
- TLS_UART_PMODE_EVEN = 2, /**< Even Parity */
- TLS_UART_PMODE_MARK = 3, /**< The parity bit is always 1. */
- TLS_UART_PMODE_SPACE = 4, /**< The parity bit is always 0. */
- } TLS_UART_PMODE_T;
- /**
- * @typedef enum TLS_UART_CHSIZE Character Size
- */
- typedef enum TLS_UART_CHSIZE
- {
- TLS_UART_CHSIZE_5BIT = (0x00 << 0), /**< Character size: 5 bit */
- TLS_UART_CHSIZE_6BIT = (0x01 << 0), /**< Character size: 6 bit */
- TLS_UART_CHSIZE_7BIT = (0x02 << 0), /**< Character size: 7 bit */
- TLS_UART_CHSIZE_8BIT = (0x03 << 0), /**< Character size: 8 bit */
- } TLS_UART_CHSIZE_T;
- /**
- * @typedef enum TLS_UART_FLOW_CTRL_MODE flow control mode
- */
- typedef enum TLS_UART_FLOW_CTRL_MODE
- {
- TLS_UART_FLOW_CTRL_NONE,
- TLS_UART_FLOW_CTRL_HARDWARE,
- } TLS_UART_FLOW_CTRL_MODE_T;
- /**
- * @typedef enum TLS_UART_RX_FLOW_CTRL_FLAG flow control rx flag
- */
- typedef enum TLS_UART_RX_FLOW_CTRL_FLAG
- {
- TLS_UART_RX_DISABLE,
- TLS_UART_RX_ENABLE,
- } TLS_UART_RX_FLOW_CTRL_FLAG_T;
- /**
- * @typedef enum TLS_UART_STOPBITS
- */
- typedef enum TLS_UART_STOPBITS
- {
- TLS_UART_ONE_STOPBITS,
- TLS_UART_TWO_STOPBITS,
- } TLS_UART_STOPBITS_T;
- /**
- * @typedef enum TLS_UART_STATUS
- */
- typedef enum TLS_UART_STATUS
- {
- TLS_UART_STATUS_OK,
- TLS_UART_STATUS_ERROR,
- } TLS_UART_STATUS_T;
- /**
- * @typedef enum TLS_UART_MODE operation mode
- */
- typedef enum TLS_UART_MODE
- {
- TLS_UART_MODE_POLL, /**< uart operation mode: poll */
- TLS_UART_MODE_INT, /**< uart operation mode: interrupt mode */
- } TLS_UART_MODE_T;
- /**
- * @struct tls_uart_icount
- */
- struct tls_uart_icount
- {
- u32 cts;
- u32 dsr;
- u32 rng;
- u32 dcd;
- u32 rx;
- u32 tx;
- u32 frame;
- u32 overrun;
- u32 parity;
- u32 brk;
- u32 buf_overrun;
- };
- /**
- * @typedef struct tls_uart_options
- */
- typedef struct tls_uart_options
- {
- u32 baudrate; /**< Set baud rate of the UART */
- TLS_UART_CHSIZE_T charlength; /**< Number of bits to transmit as a character (5 to 8). */
- TLS_UART_PMODE_T paritytype; /**< Parity type */
- TLS_UART_FLOW_CTRL_MODE_T flow_ctrl; /**< Flow control type */
- TLS_UART_STOPBITS_T stopbits; /**< Number of stop bits */
- } tls_uart_options_t;
- /**
- * @typedef struct tls_uart_circ_buf
- */
- typedef struct tls_uart_circ_buf
- {
- volatile u8 *buf;
- volatile u32 head;
- volatile u32 tail;
- } tls_uart_circ_buf_t;
- #if TLS_CONFIG_CMD_NET_USE_LIST_FTR
- /**
- * @typedef struct tls_uart_net_buf
- */
- typedef struct tls_uart_net_buf
- {
- struct dl_list list;
- char *buf;
- void *pbuf;
- u16 buflen;
- u16 offset;
- } tls_uart_net_buf_t;
- typedef struct tls_uart_net_msg
- {
- struct dl_list tx_msg_pending_list;
- } tls_uart_net_msg_t;
- #endif
- /**
- * @typedef struct TLS_UART_REGS
- */
- typedef struct TLS_UART_REGS
- {
- u32 UR_LC; /**< line control register */
- u32 UR_FC; /**< flow control register */
- u32 UR_DMAC; /**< dma control register */
- u32 UR_FIFOC; /**< fifo control register */
- u32 UR_BD; /**< baud rate register */
- u32 UR_INTM; /**< interrupt mask register */
- u32 UR_INTS; /**< interrupt source register */
- u32 UR_FIFOS; /**< fifo status register */
- u32 UR_TXW; /**< tx windows register */
- u32 UR_RES0;
- u32 UR_RES1;
- u32 UR_RES2;
- u32 UR_RXW; /**< rx windows register */
- } TLS_UART_REGS_T;
- typedef struct
- {
- // timer_t *rs485_timer;
- union
- {
- u16 rs485_param;
- struct
- {
- u16 wait_time:14;
- u16 rx_level:1;
- u16 is_485used:1;
- }rs485_param_bit;
- };
- u8 rx_mark;
- u8 rs485_pin;
- }rs480_info;
- /**
- * @typedef struct tls_uart_port
- */
- typedef struct tls_uart_port
- {
- rs480_info rs480;
- u8 uart_cb_len;
- u32 uart_no; /**< uart number: 0 or 1 */
- u32 uart_irq_no; /**< uart interrupt number */
- u32 plus_char_cnt;
- TLS_UART_MODE_T uart_mode; /**< uart work mode: interrupt mode or poll mode */
- struct tls_uart_options opts; /**< uart config parameters */
- int fcStatus; /**< flow ctrl status,0 closed ,1 opened */
- enum TLS_UART_RX_FLOW_CTRL_FLAG rxstatus;
- u32 tx_fifofull; /**< uart tx fifo trigger level */
- TLS_UART_REGS_T volatile *regs; /**< uart registers struct pointer */
- struct tls_uart_icount icount; /**< uart statistics information */
- struct tls_uart_circ_buf recv; /**< uart ring buffer */
- // struct tls_uart_circ_buf xmit;
- struct dl_list tx_msg_pending_list;
- struct dl_list tx_msg_to_be_freed_list;
- u8 hw_stopped;
- tls_os_sem_t *tx_sem;
- char *buf_ptr;
- u16 buf_len;
- s16(*rx_callback) (u16 len, void* priv_data);
- s16(*tx_callback) (struct tls_uart_port * port);
- s16(*tx_sent_callback) (struct tls_uart_port * port);
- bool tx_dma_on;
- bool rx_dma_on;
- void *priv_data;
- } tls_uart_port_t;
- /**
- * @typedef struct tls_uart_tx_msg
- */
- typedef struct tls_uart_tx_msg
- {
- struct dl_list list;
- char *buf;
- u16 buflen;
- u16 offset;
- void (*finish_callback) (void *arg);
- void *callback_arg;
- } tls_uart_tx_msg_t;
- /**
- * @defgroup Driver_APIs Driver APIs
- * @brief Driver APIs
- */
- /**
- * @addtogroup Driver_APIs
- * @{
- */
- /**
- * @defgroup UART_Driver_APIs UART Driver APIs
- * @brief UART driver APIs
- */
- /**
- * @addtogroup UART_Driver_APIs
- * @{
- */
- /**
- * @brief This function is used to initial uart port.
- *
- * @param[in] uart_no: is the uart number.
- * - \ref TLS_UART_0 TLS_UART_1 TLS_UART_2 TLS_UART_3 TLS_UART_4 TLS_UART_5
- * @param[in] opts: is the uart setting options,if this param is NULL,this function will use the default options.
- * @param[in] modeChoose:; choose uart2 mode or 7816 mode when uart_no is TLS_UART_2, 0 for uart2 mode and 1 for 7816 mode.
- *
- * @retval
- * - \ref WM_SUCCESS
- * - \ref WM_FAILED
- *
- * @note When the system is initialized, the function has been called, so users can not call the function.
- */
- int tls_uart_port_init(u16 uart_no, tls_uart_options_t * opts, u8 modeChoose);
- /**
- * @brief This function is used to register uart rx interrupt.
- *
- * @param[in] uart_no TLS_UART_0 or TLS_UART_1
- * @param[in] rx_callback is the uart rx interrupt call back function.
- *
- * @return None
- *
- * @note None
- */
- void tls_uart_rx_callback_register(u16 uart_no, s16(*rx_callback) (u16 len, void* user_data), void* user_data);
- void tls_uart_rx_byte_callback_flag(u16 uart_no, u8 flag);
- /**
- * @brief This function is used to register uart tx interrupt.
- *
- * @param[in] uart_no: is the uart numer.
- * @param[in] callback: is the uart tx interrupt call back function.
- *
- * @retval
- */
- void tls_uart_tx_callback_register(u16 uart_no, s16(*tx_callback) (struct tls_uart_port *port));
- /**
- * @brief This function is used to copy circular buffer data to user buffer.
- *
- * @param[in] uart_no is the uart numer
- * @param[in] buf is the user buffer
- * @param[in] readsize is the user read size
- *
- * @retval copy data size
- *
- * @note None
- */
- int tls_uart_read(u16 uart_no, u8 * buf, u16 readsize);
- /**
- * @brief This function is used to check the available data in the cache buffer.
- *
- * @param[in] uart_no is the uart numer
- * @param[in] readsize is the user read size
- *
- * @retval if the cache buffer size is greater or equals to readsize , then return readsize; otherwise return 0;
- *
- * @note None
- */
- int tls_uart_try_read(u16 uart_no, int32_t read_size);
- /**
- * @brief This function is used to transfer data synchronously.
- *
- * @param[in] uart_no is the uart number
- * @param[in] buf is a buf for saving user data
- * @param[in] writesize is the user data length
- *
- * @retval WM_SUCCESS tx success
- * @retval WM_FAILED tx failed
- *
- * @note None
- */
- int tls_uart_write(u16 uart_no, char *buf, u16 writesize);
- /**
- * @brief This function is used to transfer data with DMA.
- *
- * @param[in] buf is a buf for saving user data
- * @param[in] writesize is the user data length
- * @param[in] cmpl_callback function point,when the transfer is completed, the function will be called.
- *
- * @retval WM_SUCCESS success
- * @retval WM_FAILED failed
- *
- * @note Only uart1 support DMA transfer.
- */
- int tls_uart_dma_write(char *buf, u16 writesize, void (*cmpl_callback) (void *p), u16 uart_no);
- /**
- * @brief This function is used to set uart parity.
- *
- * @param[in] uart_no is the uart number
- * @param[in] paritytype is a parity type defined in TLS_UART_PMODE_T
- *
- * @retval WM_SUCCESS if setting success
- * @retval WM_FAILED if setting fail
- *
- * @note None
- */
- int tls_uart_set_parity(u16 uart_no, TLS_UART_PMODE_T paritytype);
- /**
- * @brief This function is used to set uart baudrate.
- *
- * @param[in] uart_no is the uart number
- * @param[in] baudrate is the baudrate user want used,the unit is HZ.
- *
- * @retval WM_SUCCESS if setting success
- * @retval WM_FAILED if setting fail
- *
- * @note None
- */
- int tls_uart_set_baud_rate(u16 uart_no, u32 baudrate);
- /**
- * @brief This function is used to set uart stop bits.
- *
- * @param[in] uart_no is the uart number
- * @param[in] stopbits is a stop bit type defined in TLS_UART_STOPBITS_T
- *
- * @retval WM_SUCCESS if setting success
- * @retval WM_FAILED if setting fail
- *
- * @note None
- */
- int tls_uart_set_stop_bits(u16 uart_no, TLS_UART_STOPBITS_T stopbits);
- /**
- * @}
- */
- /**
- * @}
- */
- void tls_uart_push(int uart_no, u8* data, int length);
- /**
- * @brief This function is used to transfer data asynchronously.
- *
- * @param[in] uart_no is the uart number
- * @param[in] buf is a buf for saving user data
- * @param[in] writesize is the user data length
- *
- * @retval WM_SUCCESS tx success
- * @retval WM_FAILED tx failed
- *
- * @note None
- */
- int tls_uart_write_async(u16 uart_no, char *buf, u16 writesize);
- /**
- * @brief This function is used to register uart tx sent callback function.
- *
- * @param[in] uart_no: is the uart numer.
- * @param[in] callback: is the uart tx sent out call back function.
- *
- * @retval
- */
- void tls_uart_tx_sent_callback_register(u16 uart_no, s16(*tx_callback) (struct tls_uart_port *port));
- #endif /* WM_UART_H */
|