/*
 * uart.h
 */
#ifndef UART_H_
#define UART_H_

#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "sys/alt_irq.h"
#include "key.h"

#define RXFIFO_SIZE 128
#define TXFIFO_SIZE 128

#define UART_TRUE	1
#define UART_FALSE	0

typedef void *UART_HANDLE;

#define ITIM_IRQ_MASK 0x0020
#define ITRDY_IRQ_MASK 0x0040
#define IRRDY_IRQ_MASK 0x0080

#define UART_TX_IDLE 0
#define UART_TX_BUSY 1

typedef struct{
	alt_u32 uart_base;
	alt_u32 uart_data;
	alt_u32 uart_ic_id;
	alt_u32 uart_irq;
	alt_u32 irq_mask;  // 1-pin
	alt_u8 rxfifo_len;	//յݳ
	alt_u8 txfifo_len;	//͵ݳ
	alt_u8 uart_rxfifo[RXFIFO_SIZE];
	alt_u8 uart_txfifo[TXFIFO_SIZE];
	alt_u32 uart_state;
}CoreCourse_UART;

alt_isr_func UART0_isr(void* context, alt_u32 id);

KEY_HANDLE UART_Init(
	const alt_u32 uart_base,
	const alt_u32 uart_ic_id,
	const alt_u32 uart_irq,
	const alt_u32 uart_irq_mask,
	alt_u32 uart_bps,
	alt_isr_func uart_isr);

void UART_UnInit(UART_HANDLE pHandle);

//16
void UARTx_Tx(void* context, alt_u8 * datas, alt_u8 len);

//16
alt_u8 UARTx_Rx(void* context, alt_u8 * datas);

//ò
void Set_Uart_Bps(void *p, alt_u32 uart_bps);

#endif /* UART_H_ */
