blob: bedcb4d5de7019ef2ce0424a986f4bf25ab24369 [file] [log] [blame]
/******************************************************************************
* @file uart.h
*
* @brief for TLSR chips
*
* @author public@telink-semi.com;
* @date Sep. 30, 2010
*
* @attention
*
* Copyright (C) 2019-2020 Telink Semiconductor (Shanghai) Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*****************************************************************************/
#include "register.h"
#include "gpio.h"
#include "compiler.h"
#ifndef uart_H
#define uart_H
/**
* @brief Define mul bits
*/
enum{
UART_BW_MUL1 = 0,
UART_BW_MUL2 = 1,
UART_BW_MUL3 = 2,
UART_BW_MUL4 = 3,
};
/**
* @brief Define parity type
*/
typedef enum {
PARITY_NONE = 0,
PARITY_EVEN,
PARITY_ODD,
} UART_ParityTypeDef;
/**
* @brief Define the length of stop bit
*/
typedef enum {
STOP_BIT_ONE = 0,
STOP_BIT_ONE_DOT_FIVE = BIT(4),
STOP_BIT_TWO = BIT(5),
} UART_StopBitTypeDef;
/**
* @brief Define UART RTS mode
*/
typedef enum {
UART_RTS_MODE_AUTO = 0,
UART_RTS_MODE_MANUAL,
} UART_RTSModeTypeDef;
/**
* @brief Define UART TX pin:A2 B1 D0 D3 D7
*/
typedef enum{
UART_TX_PA2 = GPIO_PA2,
UART_TX_PB1 = GPIO_PB1,
UART_TX_PC2 = GPIO_PC2,
UART_TX_PD0 = GPIO_PD0,
UART_TX_PD3 = GPIO_PD3,
UART_TX_PD7 = GPIO_PD7,
}UART_TxPinDef;
/**
* @brief Define UART RX pin: A0 B0 B7 C3 C5 D6
*/
typedef enum{
UART_RX_PA0 = GPIO_PA0,
UART_RX_PB0 = GPIO_PB0,
UART_RX_PB7 = GPIO_PB7,
UART_RX_PC3 = GPIO_PC3,
UART_RX_PC5 = GPIO_PC5,
UART_RX_PD6 = GPIO_PD6,
}UART_RxPinDef;
/**
* @brief Define UART CTS pin : A3 B2 C4 D1
*/
typedef enum{
UART_CTS_PA3 = GPIO_PA3,
UART_CTS_PB2 = GPIO_PB2,
UART_CTS_PC4 = GPIO_PC4,
UART_CTS_PD1 = GPIO_PD1,
}UART_CtsPinDef;
/**
* @brief Define UART RTS pin : A4 B3 B6 C0
*/
typedef enum{
UART_RTS_PA4 = GPIO_PA4,
UART_RTS_PB3 = GPIO_PB3,
UART_RTS_PB6 = GPIO_PB6,
UART_RTS_PC0 = GPIO_PC0,
}UART_RtsPinDef;
/**
* @brief This function servers to indicate Tx state.
* @param[in] none.
* @return the state of Tx 0:Tx done 1:not.
*/
static inline unsigned char uart_tx_is_busy(void)
{
return ( (reg_uart_status1 & FLD_UART_TX_DONE) ? 0 : 1) ;
}
/**
* @brief This function resets the UART module.
* @param[in] none
* @return none
*/
static inline void uart_reset(void)
{
reg_rst0 |= FLD_RST0_UART;
reg_rst0 &= (~FLD_RST0_UART);
}
/**
* @brief This function initializes the UART module.
* @param[in] g_uart_div - uart clock divider
* @param[in] g_bwpc - bitwidth, should be set to larger than
*
* sys_clk baud rate g_uart_div g_bwpc
*
* 16Mhz 9600 118 13
* 19200 118 6
* 115200 9 13
*
* 24Mhz 9600 249 9
* 19200 124 9
* 115200 12 15
*
* 32Mhz 9600 235 13
* 19200 235 6
* 115200 17 13
*
* 48Mhz 9600 499 9
* 19200 249 9
* 115200 25 15
*
* @param[in] Parity - selected parity type for UART interface
* @param[in] StopBit - selected length of stop bit for UART interface
* @return none
*/
extern void uart_init(unsigned short g_uart_div, unsigned char g_bwpc, UART_ParityTypeDef Parity, UART_StopBitTypeDef StopBit);
/**
* @brief This function initializes the UART module.
* @param[in] Baudrate - uart baud rate
* @param[in] System_clock - clock of system
* @param[in] Parity - selected parity type for UART interface
* @param[in] StopBit - selected length of stop bit for UART interface
* @return none
*/
extern void uart_init_baudrate(unsigned int Baudrate,unsigned int System_clock , UART_ParityTypeDef Parity, UART_StopBitTypeDef StopBit);
/**
* @brief enable uart DMA mode
* @param[in] none
* @return none
*/
extern void uart_dma_enable(unsigned char rx_dma_en, unsigned char tx_dma_en);
/**
* @brief config the irq of uart tx and rx
* @param[in] rx_irq_en - 1:enable rx irq. 0:disable rx irq
* @param[in] tx_irq_en - 1:enable tx irq. 0:disable tx irq
* @return none
*/
extern void uart_irq_enable(unsigned char rx_irq_en, unsigned char tx_irq_en);
//use this index to cycle the four register of uart. this index should be reset to 0,when send data after system wakeup.
extern unsigned char uart_TxIndex;
/**
* @brief uart send data function with not DMA method.
* variable uart_TxIndex,it must cycle the four registers 0x90 0x91 0x92 0x93 for the design of SOC.
* so we need variable to remember the index.
* Before entering power-saving mode,you need to call this function in order to ensure that the data sent is completed
* @param[in] uartData - the data to be send.
* @return none
*/
extern void uart_ndma_send_byte(unsigned char uartData);
/**
* @brief This function is used to set the 'uart_TxIndex' to 0.
* After wakeup from power-saving mode, you must call this function before sending the data.
* @param[in] none.
* @return none.
*/
static inline void uart_ndma_clear_tx_index(void)
{
uart_TxIndex=0;
}
/**
* @brief config the number level setting the irq bit of status register 0x9d
* ie 0x9d[3].
* uart_ndma_get_irq If the cnt register value(0x9c[0,3]) larger or equal than the value of 0x99[0,3]
* or the cnt register value(0x9c[4,7]) less or equal than the value of 0x99[4,7],
* it will set the irq bit of status register 0x9d, ie 0x9d[3]
* @param[in] rx_level - receive level value. ie 0x99[0,3]
* @param[in] tx_level - transmit level value.ie 0x99[4,7]
* @return none
*/
extern void uart_ndma_irq_triglevel(unsigned char rx_level, unsigned char tx_level);
/**
* @brief get the status of uart irq.
* @param[in] none
* @return 0: not uart irq ;
* not 0: indicate tx or rx irq
*/
extern unsigned char uart_ndmairq_get(void);
/**
* @brief uart send data function, this function tell the DMA to get data from the RAM and start
* the DMA transmission
* @param[in] Addr - pointer to the buffer containing data need to send
* @return 1: send success ;
* 0: DMA busy
*/
extern volatile unsigned char uart_dma_send(unsigned char* Addr);
/**
* @brief uart send data function, this function tell the DMA to get data from the RAM and start
* the DMA transmission
* @param[in] byte - single byte data need to send
* @return 1: send success ;
* 0: DMA busy
*/
extern volatile unsigned char uart_send_byte(unsigned char byte);
/**
* @brief data receive buffer initiate function. DMA would move received uart data to the address space,
* uart packet length needs to be no larger than (recBuffLen - 4).
* @param[in] RecvAddr - pointer to the receiving buffer
* @param[in] RecvBufLen - length in byte of the receiving buffer
* @return none
*/
extern void uart_recbuff_init(unsigned char *RecvAddr, unsigned short RecvBufLen);
/**
* @brief This function determines whether parity error occurs once a packet arrives.
* @param[in] none
* @return 1: parity error ;
* 0: no parity error
*/
extern unsigned char uart_is_parity_error(void);
/**
* @brief This function clears parity error status once when it occurs.
* @param[in] none
* @return none
*
* Note:
*(1)DMA mode
* RX FIFO will also be cleared when parity error flag is cleared .
*(2)NON-DMA mode
* When parity error occurs, clear parity error flag after UART receives the data.
* Cycle the four registers (0x90 0x91 0x92 0x93) from register "0x90" to get data when UART receives the data next time.
*/
extern void uart_clear_parity_error(void);
/**
* @brief UART hardware flow control configuration. Configure RTS pin.
* @param[in] Enable - enable or disable RTS function.
* @param[in] Mode - set the mode of RTS(auto or manual).
* @param[in] Thresh - threshold of trig RTS pin's level toggle(only for auto mode),
* it means the number of bytes that has arrived in Rx buf.
* @param[in] Invert - whether invert the output of RTS pin(only for auto mode)
* @param[in] pin - RTS pin select,it can be GPIO_PA4/GPIO_PB3/GPIO_PB6/GPIO_PC0.
* @return none
*/
extern void uart_set_rts(unsigned char Enable, UART_RTSModeTypeDef Mode, unsigned char Thresh, unsigned char Invert, UART_RtsPinDef pin);
/**
* @brief This function sets the RTS pin's level manually
* @param[in] Polarity - set the output of RTS pin(only for manual mode)
* @return none
*/
extern void uart_set_rts_level(unsigned char Polarity);
/**
* @brief UART hardware flow control configuration. Configure CTS pin.
* @param[in] Enable - enable or disable CTS function.
* @param[in] Select - when CTS's input equals to select, tx will be stopped
* @param[in] pin - CTS pin select,it can be GPIO_PA3/GPIO_PB2/GPIO_PC4/GPIO_PD1.
* @return none
*/
extern void uart_set_cts(unsigned char Enable, unsigned char Select,UART_CtsPinDef pin);
/**
* @brief This function serves to select pin for UART module.
* @param[in] tx_pin - the pin to send data.
* @param[in] rx_pin - the pin to receive data.
* @return none
*/
extern void uart_gpio_set(UART_TxPinDef tx_pin,UART_RxPinDef rx_pin);
/**
* @brief This function enables the irq when UART module receives error data.
* @param[in] none
* @return none
*/
extern void uart_mask_error_irq_enable(void);
#endif