#ifndef _SR_BSP_UART_H
#define _SR_BSP_UART_H

#include "sr_config.h"
#include "board_config.h"

//stm32头文件
#include "n32l40x_usart.h"

//配置参数枚举直接赋值为原厂值，省去参数转换
#define BSP_UART_DATA_BIT_5         SR_INVALID   //无效值
#define	BSP_UART_DATA_BIT_6         SR_INVALID   //无效值
#define BSP_UART_DATA_BIT_7         SR_INVALID   //无效值
#define BSP_UART_DATA_BIT_8         USART_WL_8B
#define	BSP_UART_DATA_BIT_9         USART_WL_9B

#define BSP_UART_PARITY_NONE        USART_PE_NO
#define BSP_UART_PARITY_ODD         USART_PE_ODD
#define BSP_UART_PARITY_EVEN        USART_PE_EVEN

#define BPS_UART_STOP_BIT_1         USART_STPB_1
#define BPS_UART_STOP_BIT_2         USART_STPB_2
#define BPS_UART_STOP_BIT_0_5       USART_STPB_0_5   
#define BPS_UART_STOP_BIT_1_5       USART_STPB_1_5  


#define	BSP_UART_FC_NONE            USART_HFCTRL_NONE
#define	BSP_UART_FC_CTSRTS          USART_HFCTRL_RTS_CTS

#define BSP_UART_ORDER_LSB          SR_INVALID   //无效值
#define BSP_UART_ORDER_MSB          SR_INVALID   //无效值

//F4系列没用到
#define BSP_UART_CLKS_PCLK1         SR_INVALID   //无效值
#define BSP_UART_CLKS_SYSCLK        SR_INVALID   //无效值
#define BSP_UART_CLKS_HSI           SR_INVALID   //无效值
#define BSP_UART_CLKS_LSE           SR_INVALID   //无效值



//UART GPIO配置
#ifndef  BSP_UART1_TX_ID
#define  BSP_UART1_TX_ID  SR_GPIO9   //PA9
#endif
#ifndef  BSP_UART1_TX_AF
#define  BSP_UART1_TX_AF  SR_GPIO_AF4   
#endif
#ifndef  BSP_UART1_RX_ID
#define  BSP_UART1_RX_ID  SR_GPIO10  //PA10
#endif
#ifndef  BSP_UART1_RX_AF
#define  BSP_UART1_RX_AF  SR_GPIO_AF4
#endif

#ifndef  BSP_UART2_TX_ID
#define  BSP_UART2_TX_ID  SR_GPIO2   //PA2
#endif
#ifndef  BSP_UART2_TX_AF
#define  BSP_UART2_TX_AF  SR_GPIO_AF4   
#endif
#ifndef  BSP_UART2_RX_ID
#define  BSP_UART2_RX_ID  SR_GPIO3  //PA3
#endif
#ifndef  BSP_UART2_RX_AF
#define  BSP_UART2_RX_AF  SR_GPIO_AF4
#endif

#ifndef  BSP_UART4_TX_ID
#define  BSP_UART4_TX_ID  SR_GPIO34  //PA3
#endif
#ifndef  BSP_UART4_TX_AF
#define  BSP_UART4_TX_AF  SR_GPIO_AF6
#endif
#ifndef  BSP_UART4_RX_ID
#define  BSP_UART4_RX_ID  SR_GPIO35
#endif
#ifndef  BSP_UART4_RX_AF
#define  BSP_UART4_RX_AF  SR_GPIO_AF6
#endif


#ifndef  BSP_LUART0_TX_ID
#define  BSP_LUART0_TX_ID  SR_GPIO30  //PB10
#endif
#ifndef  BSP_LUART0_TX_AF
#define  BSP_LUART0_TX_AF  SR_GPIO_AF4
#endif
#ifndef  BSP_LUART0_RX_ID
#define  BSP_LUART0_RX_ID  SR_GPIO31  //PB11
#endif
#ifndef  BSP_LUART0_RX_AF
#define  BSP_LUART0_RX_AF  SR_GPIO_AF4
#endif


/**
 * @brief 朝阳应用使用的UART的ID号
 */
typedef enum
{
#ifdef SR_USE_UART1
  SR_UART1,
#endif

#ifdef SR_USE_UART2
  SR_UART2,
#endif
 
#ifdef SR_USE_UART4
  SR_UART4,
#endif

#ifdef SR_USE_LUART0    //低功耗串口
  SR_LUART0,
#endif
  SR_UART_MX
} SR_UART_ID_E;


/**
 * @brief UART设备信息结构体
 */
typedef struct BSP_UART_INFO
{
  const char *name;  /*!< uart设备的名字*/

  void *trdHandle;   /*!< 第三方平台使用的句柄指针*/
  
  USART_Module  *instance;  /*!< 国名平台HAL库变量，对应UART寄存器地址*/
  int8_t srId;       /*!< 朝阳使用的ID*/

} BSP_UART_INFO_T;




SR_DEVICE_T *BspUartOpen(SR_UART_ID_E uartId);
int BspUartClose(SR_DEVICE_T *dev);
int BspUartConfig(SR_DEVICE_T *dev, SR_UART_CFG_T *config);
srSSize_t BspUartRead(SR_DEVICE_T *dev, void *buffer, srSize_t size);
srSSize_t BspUartWrite(SR_DEVICE_T *dev, void *buffer, srSize_t size);
int BspUartSetCallback(SR_DEVICE_T *dev, UartEventCb cb, void *args);

int BspUartClkIoSel(SR_DEVICE_T *dev,uint32_t clk,SR_UART_IO_T *io);

#endif
