#ifndef _INCLUDE_KERNEL_MAX3100_H_
#define _INCLUDE_KERNEL_MAX3100_H_

#include <kernel/fileio.h>
#include <drivers/spi.h>

#define MAX3100_SPI_ADDR   0
#define MAX3100_SPI_BPS     SPI_BPS_MAX

#define MAX3100_BUFFER_SIZE 38

#define MAX3100_CFG_READ    0x4000
#define MAX3100_CFG_WRITE   0xC000
#define MAX3100_DATA_READ   0x0000
#define MAX3100_DATA_WRITE  0x8000
#define MAX3100_POR_TEST    MAX_3100_CFG_READ
#define MAX3100_CONFIG      (MAX3100_CFG_TM | MAX3100_CFG_RM | MAX3100_BAUD_MAX)
#define MAX3100_POR_STATE   (0x4000 | MAX3100_CONFIG)

//config mode
#define MAX3100_CFG_FEN    (1 << 13)   // fifo enable
#define MAX3100_CFG_SHDN   (1 << 12)   
#define MAX3100_CFG_TM     (1 << 11)   // mask for T bit
#define MAX3100_CFG_RM     (1 << 10)   // mask for R bit
#define MAX3100_CFG_PM     (1 << 9)    // mask for Pr bit
#define MAX3100_CFG_RAM    (1 << 8)    // mask for RA/FE bit
#define MAX3100_CFG_IR     (1 << 7)    // irda timing mode 
#define MAX3100_CFG_ST     (1 << 6)    // transmit stop bit
#define MAX3100_CFG_PE     (1 << 5)    // parity enable bit
#define MAX3100_CFG_L      (1 << 4)    // word length of data
#define MAX3100_CFG_B3     (1 << 3)    // baud rate divisor bit
#define MAX3100_CFG_B2     (1 << 2)    // baud rate divisor bit
#define MAX3100_CFG_B1     (1 << 1)    // baud rate divisor bit
#define MAX3100_CFG_B0     0           // baud rate divisor bit

// data mode
#define MAX3100_DATA_R      (1 << 15)     // FIFO not empty flag
#define MAX3100_DATA_T      (1 << 14)     // TX buffer empty flag 
#define MAX3100_DATA_TX     (0x0080 << 8) // Send data
#define MAX3100_TE          (0x0004 << 8) 
#define MAX3100_RTS         (0x0002 << 8)

#define MAX3100_TCV_TX      0x8400
#define MAX3100_TCV_RX      0x8600

// uart baud rates
#define MAX3100_BAUD_MAX    MAX3100_BAUD_230400
#define MAX3100_BAUD_230400 0x0000
#define MAX3100_BAUD_115200 0x0001
#define MAX3100_BAUD_57600  0x0002
#define MAX3100_BAUD_600    0x000F
#define MAX3100_BAUD_MIN    MAX3100_BAUD_600

//extern int rx_buffer_head;
//extern int rx_buffer_tail;

int max3100_init(void);
void max3100_term(void);
int max3100_read(file_t *file, char far *buffer, int size);
int max3100_write(file_t *file, const char far *buffer, int size);

extern const driver_t max3100_driver;

#endif
