/**************************************************************************************************
 
  Phyplus Microelectronics Limited confidential and proprietary. 
  All rights reserved.

  IMPORTANT: All rights of this software belong to Phyplus Microelectronics 
  Limited ("Phyplus"). Your use of this Software is limited to those 
  specific rights granted under  the terms of the business contract, the 
  confidential agreement, the non-disclosure agreement and any other forms 
  of agreements as a customer or a partner of Phyplus. You may not use this 
  Software unless you agree to abide by the terms of these agreements. 
  You acknowledge that the Software may not be modified, copied, 
  distributed or disclosed unless embedded on a Phyplus Bluetooth Low Energy 
  (BLE) integrated circuit, either as a product or is integrated into your 
  products.  Other than for the aforementioned purposes, you may not use, 
  reproduce, copy, prepare derivative works of, modify, distribute, perform, 
  display or sell this Software and/or its documentation for any purposes.

  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE
  PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,
  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL
  PHYPLUS OR ITS SUBSIDIARIES BE LIABLE OR OBLIGATED UNDER CONTRACT,
  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER
  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
  INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE
  OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT
  OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
  
**************************************************************************************************/

/*******************************************************************************
* @file		uart.h
* @brief	Contains all functions support for uart driver
* @version	0.0
* @date		19. Oct. 2017
* @author	qing.han
* 
* Copyright(C) 2016, PhyPlus Semiconductor
* All rights reserved.
*
*******************************************************************************/
#ifndef __UART_H__
#define __UART_H__

#include "types.h"
#include "gpio.h"

#define MAX_UART_BUF_SIZE     364
#define MAX_UART_BUF_ID      (MAX_UART_BUF_SIZE-1)
#define MAX_UART_RX_SIZE_2_NOTIFY_APP   (64) //1/4*MAX_UART_BUF_SIZE
#define UART_IRQ_ENABLE       *(volatile unsigned int *) 0xe000e100 |= BIT(11)
#define UART_IRQ_DISABLE      *(volatile unsigned int *) 0xe000e100 &= ~BIT(11)

  
#define IS_RBR_DATA_READY     (*(volatile unsigned int *) 0x40004014 & 0x01)
#define IS_THR_DATA_EMPTY     (*(volatile unsigned int *) 0x40004014 & 0x20)
#define IS_TX_DATA_EMPTY      (*(volatile unsigned int *) 0x40004014 & 0x40)
#define IS_UART_BUSY          (*(volatile unsigned int *) 0x4000407c & 0x01)
	
#define  GetIRQ_ID             (*(volatile unsigned int *) 0x40004008) & 0x0f
  


#define TX_NOT_DONE           !(*(volatile unsigned int *) 0x40004014 & 0x40)
  

#define UART_TX_FIFO_SIZE    16
#define UART_RX_FIFO_SIZE    16

#define TX_FIFO_MODE    1
#define RX_FIFO_MODE    2
#define TX_RX_FIFO_MODE 3

#define FIFO_MODE 0//TX_RX_FIFO_MODE  //0

#define FCR_RX_TRIGGER_00 0x00
#define FCR_RX_TRIGGER_01 0x40
#define FCR_RX_TRIGGER_10 0x80
#define FCR_RX_TRIGGER_11 0xc0
#define FCR_TX_TRIGGER_00 0x00
#define FCR_TX_TRIGGER_01 0x10
#define FCR_TX_TRIGGER_10 0x20
#define FCR_TX_TRIGGER_11 0x30
#define FCR_TX_FIFO_RESET 0x04
#define FCR_RX_FIFO_RESET 0x02
#define FCR_FIFO_ENABLE   0x01


#define IER_PTIME   0x80
#define IER_EDSSI   0x08
#define IER_ELSI    0x04
#define IER_ETBEI   0x02
#define IER_ERBFI   0x01

/*LSR 0x14*/
#define LSR_RFE		0x80
#define LSR_TEMT	0x40
#define LSR_THRE	0x20
#define LSR_BI		0x10
#define LSR_FE		0x08
#define LSR_PE		0x04
#define LSR_OE		0x02
#define LSR_DR		0x01

/*USR 0x7c*/
#define USR_RFF   0x10
#define USR_RFNE  0x08
#define USR_TFE   0x04
#define USR_TFNF  0x02
#define USR_BUSY  0x01

#define UART_FIFO_RX_TRIGGER	FCR_RX_TRIGGER_10//FCR_RX_TRIGGER_10//FCR_RX_TRIGGER_11
#define UART_FIFO_TX_TRIGGER	FCR_TX_TRIGGER_00//FCR_TX_TRIGGER_00//FCR_TX_TRIGGER_01

enum UARTIRQID{
	NONE_IRQ = 0,
	NO_IRQ_PENDING_IRQ = 1,
	THR_EMPTY = 2,
	RDA_IRQ = 4,
	RLS_IRQ = 6,
	BUSY_IRQ = 7,
	TIMEOUT_IRQ = 12,
};

enum{
  TX_STATE_UNINIT = 0,
  TX_STATE_IDLE,
  TX_STATE_TX,
  TX_STATE_ERR
};

typedef struct _uart_Evt_t{
  uint8_t   type;
  uint8_t*  data;
  uint8_t   len;
}uart_Evt_t;


typedef enum{
  UART_EVT_TYPE_RX_DATA = 1,
  UART_EVT_TYPE_RX_DATA_TO, //case rx data of uart RX timeout
  UART_EVT_TYPE_TX_COMPLETED,
} uart_Evt_Type_t;

typedef void (*uart_Hdl_t)(uart_Evt_t* pev);

typedef struct _uart_Cfg_t{
	GPIO_Pin_e  tx_pin;
	GPIO_Pin_e  rx_pin;
	GPIO_Pin_e  rts_pin;
	GPIO_Pin_e  cts_pin;
	uint32_t    baudrate;
	bool        use_fifo;
	bool        hw_fwctrl;
	bool        use_tx_buf;
	bool        parity;
	uart_Hdl_t  evt_handler;
}uart_Cfg_t;

typedef struct _uart_Tx_Buf_t{
	uint8_t   tx_state;
	uint16_t  tx_data_offset;
	uint16_t  tx_data_size;
	uint16_t  tx_buf_size;
	uint8_t*  tx_buf;
}uart_Tx_Buf_t;

  
int hal_uart_deinit(void);
int hal_uart_init(uart_Cfg_t cfg);
int hal_uart_set_tx_buf(uint8_t* buf, uint16_t size);
int hal_uart_get_tx_ready(void);
int hal_uart_send_buff(uint8_t *buff,uint16_t len);
int hal_uart_send_byte(unsigned char data);
void __attribute__((weak)) hal_UART0_IRQHandler(void);


#endif