#ifndef _WK2XXX_H_
#define _WK2XXX_H_

#include "main.h"

#define 	WK2XXX_GPORT    1//	/wkxxxx  Global rigister of PORT

#define 	WK2XXX_GENA     0X00
#define 	WK2XXX_GRST     0X01
#define		WK2XXX_GMUT     0X02
#define 	WK2XXX_GIER     0X10
#define 	WK2XXX_GIFR     0X11
#define 	WK2XXX_GPDIR    0X21
#define 	WK2XXX_GPDAT    0X31
//wkxxxx  slave uarts  rigister address defines

#define 	WK2XXX_SPAGE    0X03
//PAGE0
#define 	WK2XXX_SCR      0X04
#define 	WK2XXX_LCR      0X05
#define 	WK2XXX_FCR      0X06
#define 	WK2XXX_SIER     0X07
#define 	WK2XXX_SIFR     0X08
#define 	WK2XXX_TFCNT    0X09
#define 	WK2XXX_RFCNT    0X0A
#define 	WK2XXX_FSR      0X0B
#define 	WK2XXX_LSR      0X0C
#define 	WK2XXX_FDAT     0X0D
#define 	WK2XXX_FWCR     0X0E
#define 	WK2XXX_RS485    0X0F
//PAGE1
#define 	WK2XXX_BAUD1    0X04
#define 	WK2XXX_BAUD0    0X05
#define 	WK2XXX_PRES     0X06
#define 	WK2XXX_RFTL     0X07
#define 	WK2XXX_TFTL     0X08
#define 	WK2XXX_FWTH     0X09
#define 	WK2XXX_FWTL     0X0A
#define 	WK2XXX_XON1     0X0B
#define 	WK2XXX_XOFF1    0X0C
#define 	WK2XXX_SADR     0X0D
#define 	WK2XXX_SAEN     0X0E
#define 	WK2XXX_RTSDLY   0X0F

//WK串口扩展芯片的寄存器的位定义
//wkxxx register bit defines
// GENA
#define 	WK2XXX_UT4EN	0x08
#define 	WK2XXX_UT3EN	0x04
#define 	WK2XXX_UT2EN	0x02
#define 	WK2XXX_UT1EN	0x01
//GRST
#define 	WK2XXX_UT4SLEEP	0x80
#define 	WK2XXX_UT3SLEEP	0x40
#define 	WK2XXX_UT2SLEEP	0x20
#define 	WK2XXX_UT1SLEEP	0x10
#define 	WK2XXX_UT4RST	0x08
#define 	WK2XXX_UT3RST	0x04
#define 	WK2XXX_UT2RST	0x02
#define 	WK2XXX_UT1RST	0x01
//GIER
#define 	WK2XXX_UT4IE	0x08
#define 	WK2XXX_UT3IE	0x04
#define 	WK2XXX_UT2IE	0x02
#define 	WK2XXX_UT1IE	0x01
//GIFR
#define 	WK2XXX_UT4INT	0x08
#define 	WK2XXX_UT3INT	0x04
#define 	WK2XXX_UT2INT	0x02
#define 	WK2XXX_UT1INT	0x01
//SPAGE
#define 	WK2XXX_SPAGE0	  0x00
#define 	WK2XXX_SPAGE1   0x01
//SCR
#define 	WK2XXX_SLEEPEN	0x04
#define 	WK2XXX_TXEN     0x02
#define 	WK2XXX_RXEN     0x01
//LCR
#define 	WK2XXX_BREAK	  0x20
#define 	WK2XXX_IREN     0x10
#define 	WK2XXX_PAEN     0x08
#define 	WK2XXX_PAM1     0x04
#define 	WK2XXX_PAM0     0x02
#define 	WK2XXX_STPL     0x01
//FCR
//SIER
#define 	WK2XXX_FERR_IEN      0x80
#define 	WK2XXX_CTS_IEN       0x40
#define 	WK2XXX_RTS_IEN       0x20
#define 	WK2XXX_XOFF_IEN      0x10
#define 	WK2XXX_TFEMPTY_IEN   0x08
#define 	WK2XXX_TFTRIG_IEN    0x04
#define 	WK2XXX_RXOUT_IEN     0x02
#define 	WK2XXX_RFTRIG_IEN    0x01
//SIFR
#define 	WK2XXX_FERR_INT      0x80  /* 接收FIFO数据错误中断标志位 */
#define 	WK2XXX_CTS_INT       0x40
#define 	WK2XXX_RTS_INT       0x20
#define 	WK2XXX_XOFF_INT      0x10
#define 	WK2XXX_TFEMPTY_INT   0x08  /*  发送FIFO空中断标志位  */
#define 	WK2XXX_TFTRIG_INT    0x04  /*  发送FIFO触点中断标志位  */
#define 	WK2XXX_RXOVT_INT     0x02  /*  接收FIFO超时中断标志位  */
#define 	WK2XXX_RFTRIG_INT    0x01  /*  接收FIFO触点中断标志位  */

//TFCNT
//RFCNT
//FSR  FIFO
#define 	WK2XXX_RFOE     0x80   /* 子串口溢出 */
#define 	WK2XXX_RFBI     0x40   /* 子串口 break line 	*/
#define 	WK2XXX_RFFE     0x20   /* 子串口数据帧错误  	*/
#define 	WK2XXX_RFPE     0x10   /* 子串口数据校验错误  	*/
#define 	WK2XXX_RDAT     0x08   /* 子串口接收为空  0：非空  1：空*/
#define 	WK2XXX_TDAT     0x04   /* 子串口发送为空  		*/
#define 	WK2XXX_TFULL    0x02   /* 子串口发送满  		*/
#define 	WK2XXX_TBUSY    0x01   /* 子串口发送忙  		*/
//LSR  接收状态
#define 	WK2XXX_OE       0x08   /* 子串口接收溢出 		*/
#define 	WK2XXX_BI       0x04   /* 子串口接收 line-break */
#define 	WK2XXX_FE       0x02   /* 子串口数据接收帧错误  */
#define 	WK2XXX_PE       0x01   /* 子串口数据接收校验错误  */
//FWCR

uint16_t WK_PortSendData(uint8_t port, const void* buf, uint16_t len);
uint16_t WK_PortRecvData(uint8_t port, void* buf, uint16_t len);
void WK_PortInit(uint8_t port, uint32_t fosc, uint32_t baudrate);
void WK_IRQHandler(void);
void WK_Rst(void);
uint8_t Wk2xxx_Test(void);

/* 切换子串口回调函数 */
// int wk2114_sub_uart_chenge_recv_fun(struct wk2114_sub_uart *sub_uart,void *recv_class,wk2114_sub_uart_recv_fun recv_fun);

#endif /* _WK2XXX_H_ */


// // #include "sys.h"
// #include "myuart.h"
// #include "main.h"
// static uint8_t init_buf=0x55;

// //如下为WK系列串口扩展芯片的寄存器地址定义，不同的芯片，可能寄存器少一些，所以具体的寄存器请看数据手册
// //wkxxxx  Global rigister address defines
// #define 	WK2XXX_GENA     0X00
// #define 	WK2XXX_GRST     0X01
// #define		WK2XXX_GMUT     0X02
// #define 	WK2XXX_GIER     0X10
// #define 	WK2XXX_GIFR     0X11
// #define 	WK2XXX_GPDIR    0X21
// #define 	WK2XXX_GPDAT    0X31
// #define 	WK2XXX_GPORT    1//	/wkxxxx  Global rigister of PORT
// //wkxxxx  slave uarts  rigister address defines

// #define 	WK2XXX_SPAGE    0X03
// //PAGE0
// #define 	WK2XXX_SCR      0X04
// #define 	WK2XXX_LCR      0X05
// #define 	WK2XXX_FCR      0X06
// #define 	WK2XXX_SIER     0X07
// #define 	WK2XXX_SIFR     0X08
// #define 	WK2XXX_TFCNT    0X09
// #define 	WK2XXX_RFCNT    0X0A
// #define 	WK2XXX_FSR      0X0B
// #define 	WK2XXX_LSR      0X0C
// #define 	WK2XXX_FDAT     0X0D
// #define 	WK2XXX_FWCR     0X0E
// #define 	WK2XXX_RS485    0X0F
// //PAGE1
// #define 	WK2XXX_BAUD1    0X04
// #define 	WK2XXX_BAUD0    0X05
// #define 	WK2XXX_PRES     0X06
// #define 	WK2XXX_RFTL     0X07
// #define 	WK2XXX_TFTL     0X08
// #define 	WK2XXX_FWTH     0X09
// #define 	WK2XXX_FWTL     0X0A
// #define 	WK2XXX_XON1     0X0B
// #define 	WK2XXX_XOFF1    0X0C
// #define 	WK2XXX_SADR     0X0D
// #define 	WK2XXX_SAEN     0X0E
// #define 	WK2XXX_RRSDLY   0X0F

// //WK串口扩展芯片的寄存器的位定义
// //wkxxx register bit defines
// // GENA
// #define 	WK2XXX_UT4EN	0x08
// #define 	WK2XXX_UT3EN	0x04
// #define 	WK2XXX_UT2EN	0x02
// #define 	WK2XXX_UT1EN	0x01
// //GRST
// #define 	WK2XXX_UT4SLEEP	0x80
// #define 	WK2XXX_UT3SLEEP	0x40
// #define 	WK2XXX_UT2SLEEP	0x20
// #define 	WK2XXX_UT1SLEEP	0x10
// #define 	WK2XXX_UT4RST	0x08
// #define 	WK2XXX_UT3RST	0x04
// #define 	WK2XXX_UT2RST	0x02
// #define 	WK2XXX_UT1RST	0x01
// //GIER
// #define 	WK2XXX_UT4IE	0x08
// #define 	WK2XXX_UT3IE	0x04
// #define 	WK2XXX_UT2IE	0x02
// #define 	WK2XXX_UT1IE	0x01
// //GIFR
// #define 	WK2XXX_UT4INT	0x08
// #define 	WK2XXX_UT3INT	0x04
// #define 	WK2XXX_UT2INT	0x02
// #define 	WK2XXX_UT1INT	0x01
// //SPAGE
// #define 	WK2XXX_SPAGE0	0x00
// #define 	WK2XXX_SPAGE1   0x01
// //SCR
// #define 	WK2XXX_SLEEPEN	0x04
// #define 	WK2XXX_TXEN     0x02
// #define 	WK2XXX_RXEN     0x01
// //LCR
// #define 	WK2XXX_BREAK	0x20
// #define 	WK2XXX_IREN     0x10
// #define 	WK2XXX_PAEN     0x08
// #define 	WK2XXX_PAM1     0x04
// #define 	WK2XXX_PAM0     0x02
// #define 	WK2XXX_STPL     0x01
// //FCR
// //SIER
// #define 	WK2XXX_FERR_IEN      0x80
// #define 	WK2XXX_CTS_IEN       0x40
// #define 	WK2XXX_RTS_IEN       0x20
// #define 	WK2XXX_XOFF_IEN      0x10
// #define 	WK2XXX_TFEMPTY_IEN   0x08
// #define 	WK2XXX_TFTRIG_IEN    0x04
// #define 	WK2XXX_RXOVT_IEN     0x02
// #define 	WK2XXX_RFTRIG_IEN    0x01
// //SIFR
// #define 	WK2XXX_FERR_INT      0x80
// #define 	WK2XXX_CTS_INT       0x40
// #define 	WK2XXX_RTS_INT       0x20
// #define 	WK2XXX_XOFF_INT      0x10
// #define 	WK2XXX_TFEMPTY_INT   0x08
// #define 	WK2XXX_TFTRIG_INT    0x04
// #define 	WK2XXX_RXOVT_INT     0x02
// #define 	WK2XXX_RFTRIG_INT    0x01


// //TFCNT
// //RFCNT
// //FSR
// #define 	WK2XXX_RFOE     0x80
// #define 	WK2XXX_RFBI     0x40
// #define 	WK2XXX_RFFE     0x20
// #define 	WK2XXX_RFPE     0x10
// #define 	WK2XXX_RDAT     0x08
// #define 	WK2XXX_TDAT     0x04
// #define 	WK2XXX_TFULL    0x02
// #define 	WK2XXX_TBUSY    0x01
// //LSR
// #define 	WK2XXX_OE       0x08
// #define 	WK2XXX_BI       0x04
// #define 	WK2XXX_FE       0x02
// #define 	WK2XXX_PE       0x01
// //FWCR
// //RS485
// //常用波特率宏定义

// #define     B600      1
// #define 	B1200	    2
// #define 	B2400	    3
// #define 	B4800     4
// #define 	B9600	    5
// #define 	B19200	  6
// #define 	B38400	  7
// #define 	B76800	  8
// #define 	B1800	    9
// #define 	B3600	    10
// #define		B7200	    11
// #define 	B14400	  12
// #define  	B28800	  13
// #define	    B57600	  14
// #define		B115200	  15
// #define		B230400	  16

// // typedef int (*wk2xxx_send_fun)(void *send_obj,char *buf,uint32_t size);

// typedef void (*wk2xxx_sub_uart_recv_fun)( void *recv_obj, uint8_t *buf, uint32_t size );  //< 子串口接收数据回调函数
// typedef int (*wk2xxx_send_fun)( void *send_obj, uint8_t *buf, uint32_t size );            //< wk2114发送函数

// /* 发送数据的buf  size*/
// struct wk2114_send_record
// {
//     uint32_t size;
//     uint8_t *p_data;
// };

// /*子串口*/
// struct wk2114_sub_uart
// {
//     uint8_t flag;                               //< 标志位
//     uint8_t cmd;                                //< 上一次的子串口寄存器读命令
//     uint8_t reg;                                //< 上一次接收到的子串口寄存器
//     uint8_t uart_index;                         //< 串口地址
//     void *recv_obj;                           //< 接收回调函数的第一个参数
//     wk2xxx_sub_uart_recv_fun recv_fun;          //< 接收回调函数
//     uint8_t *recv_buf;                          //< 接收缓冲区
//     uint8_t *send_buf;                          //< 当前发送数据指针
//     uint32_t recv_buf_p;                        //< 接收缓冲区计数
//     uint32_t recv_buf_size;                     //< 接收缓冲区大小
//     uint32_t send_buf_p;                        //< 发送缓冲区计数
//     struct wk2114_send_record send_record[8];   //< 发送记录

//     WK2xxx_TypeDef *wk2114;                      //< wk2114结构指针
// };


// /*主串口 主spi*/
// typedef struct 
// {
// 	// UART_HandleTypeDef *huart;
//     uint8_t flag;                           //< 标志位
//     uint8_t cmd;                            //< 上一次的全局寄存器读命令
//     uint8_t reg;                            //< 上一次接收到的全局寄存器
//     uint32_t dev_clock_hz;                  //< wk2114时钟源频率
//     uint8_t cmd_buf[64][2];                 //< 命令队列缓冲区
//     uint8_t send_buf[18];                   //< 发送缓冲区
// 	void *send_obj;							//< 主spi  
// 	wk2xxx_send_fun send;
// 	EXTI_HandleTypeDef *exti;
// 	uint8_t trans_mode; /* 0 :polling, 1: IT  2: DMA*/

// 	struct wk2114_sub_uart *sub_uart[4];    //< 子串口
// }WK2xxx_TypeDef;

// WK2xxx_TypeDef* WK2XXX_Init( void );

// void WK2xxx_EXTI_callback( WK2xxx_TypeDef *wk2xxx );


// void Wk2xxxWriteReg( unsigned char port, unsigned char reg, unsigned char dat );
// unsigned char Wk2xxxReadReg( unsigned char port, unsigned char reg );
// void Wk2xxxWriteFifo( unsigned char port,unsigned char *wbuf,unsigned int len );
// void Wk2xxxReadFifo( unsigned char port,unsigned char *rbuf,unsigned int len );
// void Wk2xxxInit( unsigned char port );
// void Wk2xxxClose( unsigned char port );
// void Wk2xxxSetBaud( unsigned char port, int baud );
// unsigned int Wk2xxxGetBuf( unsigned char port,unsigned char *getbuf );
// unsigned int Wk2xxxSendBuf( unsigned char port,unsigned char *sendbuf,unsigned int len );

// extern void WK2XXX_SPI_Init(void);
// extern void WK2XXX_Reset_Init(void);
// extern void WK2XXX_RST_Init(void);
