summaryrefslogtreecommitdiff
path: root/os/ks32/io.h
blob: 5e1721400c10aeb48e1e56c3d66a25d77e146776 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/*
 * Memory Map for Samsung ks32c50100
 */

#define SFRbase	0x7ff0000

#define SYSCFG	(*(ulong *)(SFRbase + 0))

#define IOPbase	(SFRbase + 0x5000)
#define IOPMOD	(*(ulong *)(IOPbase + 0))
#define IOPCON	(*(ulong *)(IOPbase + 4))
#define IOPDATA	(*(ulong *)(IOPbase + 8))

#define MaxIRQbit		20			/* Maximum IRQ */
#define EXT0bit		0
#define EXT1bit		1
#define EXT2bit		2
#define EXT3bit		3
#define UART0TXbit		4
#define UART0RXbit		5
#define UART1TXbit		6
#define UART1RXbit		7
#define GDMA0		8
#define GDMA1		9
#define TIMER0bit		10
#define TIMER1bit		11
#define HDLCATXbit		12
#define HDLCARXbit		13
#define HDLCBTXbit		14
#define HDLCBRXbit		15
#define ETHBDMATXbit	16
#define ETHBDMARXbit	17
#define ETHMACRXint	18
#define ETHMAXTXint	19
#define IICbit			20

#define TIMERbit(n) 		(TIMER0bit + n)
#define UARTTXbit(n)	(UART0TXbit + (n) * 2)
#define UARTRXbit(n)	(UART0RXbit + (n) * 2)

/*
  * Interrupt controller
  */

#define INTbase	(SFRbase + 0x4000)
#define INTREG	((IntReg *)INTbase)

typedef struct IntReg IntReg;
struct IntReg {
	ulong	mod;		/* 00 */
	ulong	pnd;			/* 04 */
	ulong	msk;			/* 08 */
	ulong	pri[6];		/* 0c */
	ulong	offset;		/* 24 */
	ulong	pndpri;		/* 28 */
	ulong	pndtst;		/* 2c */
	ulong	oset_fiq;		/* 30 */
	ulong	oset_irq;		/* 34 */
};

/*
  * UARTs
  */
#define UART0base	(SFRbase + 0xd000)
#define UART1base	(SFRbase + 0xe000)
#define UARTREG	((UartReg *)UART0base)

typedef struct UartReg UartReg;
struct UartReg {
	ulong	lcon;		/* 00 */
	ulong	con;		/* 04 */
	ulong	stat;		/* 08 */
	ulong	txbuf;	/* 0c */
	ulong	rxbuf;	/* 10 */
	ulong	brdiv;	/* 14 */
	ulong	pad[(UART1base - UART0base - 0x18) / 4];
};

#define ULCON_WLMASK		0x03
#define ULCON_WL5		0x00
#define ULCON_WL6		0x01
#define ULCON_WL7		0x02
#define ULCON_WL8		0x03

#define ULCON_STOPMASK	0x04
#define ULCON_STOP1		0x00
#define ULCON_STOP2		0x04

#define ULCON_PMDMASK	0x38
#define ULCON_PMDNONE	0x00
#define ULCON_PMDODD	(4 << 3)
#define ULCON_PMDEVEN	(5 << 3)
#define ULCON_PMDFORCE1	(6 << 3)
#define ULCON_PMDFORCE0	(7 << 3)

#define ULCON_CLOCKMASK	0x40
#define ULCON_CLOCKMCLK	0x00
#define ULCON_CLOCKUCLK	(1 << 6)

#define ULCON_IRMASK		0x80
#define ULCON_IROFF		0x00
#define ULCON_IRON		0x80

#define UCON_RXMDMASK	0x03
#define UCON_RXMDOFF		0x00
#define UCON_RXMDINT		0x01
#define UCON_RXMDGDMA0	0x02
#define UCON_RXMDGDMA1	0x03

#define UCON_SINTMASK	0x04
#define UCON_SINTOFF		0x00
#define UCON_SINTON		0x04

#define UCON_TXMDMASK	0x18
#define UCON_TXMDOFF		(0 << 3)
#define UCON_TXMDINT		(1 << 3)
#define UCON_TXMDGDMA0	(2 << 3)
#define UCON_TXMDGDMA1	(3 << 3)

#define UCON_DSRMASK		0x20
#define UCON_DSRON		(1 << 5)
#define UCON_DSROFF		(0 << 5)

#define UCON_BRKMASK		0x40
#define UCON_BRKON		(1 << 6)
#define UCON_BRKOFF		(0 << 6)

#define UCON_LOOPMASK	0x80
#define UCON_LOOPON		0x80
#define UCON_LOOPOFF		0x00

#define USTAT_OV			0x01
#define USTAT_PE			0x02
#define USTAT_FE			0x04
#define USTAT_BKD			0x08
#define USTAT_DTR			0x10
#define USTAT_RDR			0x20
#define USTAT_TBE			0x40
#define USTAT_TC			0x80

/*
  * Timers
  */
#define TIMERbase	(SFRbase + 0x6000)
#define TIMERREG	((TimerReg *)TIMERbase)

typedef struct TimerReg TimerReg;
struct TimerReg {
	ulong mod;
	ulong data[2];
	ulong cnt[2];
};

/*
 *	PC compatibility support for PCMCIA drivers
 */

extern ulong ins(ulong);		/* return ulong to prevent unecessary compiler shifting */
void outs(ulong, int);
#define inb(addr)	(*((uchar*)(addr)))
#define inl(addr)	(*((ulong*)(addr)))
ulong ins(ulong);
#define outb(addr, val)	*((uchar*)(addr)) = (val)
#define outl(addr, val)	*((ulong*)(addr)) = (val)

void inss(ulong, void*, int);
void outss(ulong, void*, int);