/*
 * File      : bsp.h
 * This file is part of RT-Thread RTOS
 * COPYRIGHT (C) 2006, RT-Thread Develop Team
 *
 * The license and distribution terms for this file may be
 * found in the file LICENSE in this distribution or at
 * http://openlab.rt-thread.com/license/LICENSE
 *
 * Change Logs:
 * Date           Author       Notes
 * 2006-09-15     QiuYi        the first version */

#ifndef __BSP_H_
#define __BSP_H_

#include <i386.h>

/*******************************************************************/
/*  Timer Register  */
/*******************************************************************/
#define TIMER_CNTR0			(IO_TIMER1 + 0)	/* timer 0 counter port */
#define TIMER_CNTR1			(IO_TIMER1 + 1)	/* timer 1 counter port */
#define TIMER_CNTR2			(IO_TIMER1 + 2)	/* timer 2 counter port */
#define TIMER_MODE			(IO_TIMER1 + 3)	/* timer mode port */
#define TIMER_SEL0			0x00	/* select counter 0 */
#define TIMER_SEL1			0x40	/* select counter 1 */
#define TIMER_INTTC			0x00	/* mode 0, intr on terminal cnt */
#define TIMER_ONESHOT		0x02	/* mode 1, one shot */
#define TIMER_RATEGEN		0x04	/* mode 2, rate generator */
#define TIMER_SQWAVE		0x06	/* mode 3, square wave */
#define TIMER_SWSTROBE		0x08	/* mode 4, s/w triggered strobe */
#define TIMER_HWSTROBE		0x0a	/* mode 5, h/w triggered strobe */
#define TIMER_LATCH			0x00	/* latch counter for reading */
#define TIMER_LSB			0x10	/* r/w counter LSB */
#define TIMER_MSB			0x20	/* r/w counter MSB */
#define TIMER_16BIT			0x30	/* r/w counter 16 bits, LSB first */
#define TIMER_BCD			0x01	/* count in BCD */

#define TIMER_FREQ			1193182
#define TIMER_DIV(x)		((TIMER_FREQ+(x)/2)/(x))

#define IO_TIMER1			0x040	/* 8253 Timer #1 */

/*******************************************************************/
/* Interrupt Controller */
/*******************************************************************/
/* these are processor defined */
#define T_DIVIDE			0		/* divide error */
#define T_DEBUG	 			1		/* debug exception */
#define T_NMI				2		/* non-maskable interrupt */
#define T_BRKPT	 			3		/* breakpoint */
#define T_OFLOW				4		/* overflow */
#define T_BOUND	  			5		/* bounds check */
#define T_ILLOP	  			6		/* illegal opcode */
#define T_DEVICE	 		7		/* device not available */
#define T_DBLFLT	 		8		/* double fault */
/* 9 is reserved */
#define T_TSS				10		/* invalid task switch segment */
#define T_SEGNP				11		/* segment not present */
#define T_STACK	 			12		/* stack exception */
#define T_GPFLT				13		/* genernal protection fault */
#define T_PGFLT				14		/* page fault */
/* 15 is reserved */
#define T_FPERR	 			16		/* floating point error */
#define T_ALIGN				17		/* aligment check */
#define T_MCHK				18		/* machine check */
#define T_DEFAULT			500		/* catchall */

#define INTTIMER0			0
#define INTKEYBOARD			1
#define INTUART0_RX			4

/* I/O Addresses of the two 8259A programmable interrupt controllers */
#define IO_PIC1 			0x20 	/* Master(IRQs 0-7) */
#define IO_PIC2 			0xa0	/* Slave(IRQs 8-15) */
#define IRQ_SLAVE 			0x2		/* IRQ at which slave connects to master */
#define IRQ_OFFSET 			0x20	/* IRQ 0 corresponds to int IRQ_OFFSET */

#define MAX_HANDLERS		16		/*max number of isr handler*/

/*******************************************************************/
/* CRT Register */
/*******************************************************************/
#define MONO_BASE			0x3b4
#define MONO_BUF			0xb0000
#define CGA_BASE			0x3d4
#define CGA_BUF				0xb8000

#define CRT_ROWS			25
#define CRT_COLS			80
#define CRT_SIZE				(CRT_ROWS * CRT_COLS)

/*******************************************************************/
/* Keyboard Register */
/*******************************************************************/
#define	KBSTATP				0x64	/* kbd controller status port(I) */
#define	KBS_DIB				0x01	/* kbd data in buffer */
#define	KBDATAP				0x60	/* kbd data port(I) */

/*******************************************************************/
/* Serial Register */
/*******************************************************************/
/*Serial I/O code */
#define COM1				0x3F8
#define COMSTATUS			5
#define COMDATA				0x01
#define COMREAD				0
#define COMWRITE			0

/* Bits definition of the Line Status Register (LSR)*/
#define DR					0x01	/* Data Ready */
#define OE					0x02	/* Overrun Error */
#define PE					0x04	/* Parity Error */
#define FE					0x08	/* Framing Error */
#define BI					0x10	/* Break Interrupt */
#define THRE				0x20	/* Transmitter Holding Register Empty */
#define TEMT				0x40	/* Transmitter Empty */
#define ERFIFO				0x80	/* Error receive Fifo */

#ifdef __cplusplus
}
#endif

#endif /* __BSP_H_ */
