~kris/9p

9hist

ref: b61b499dacef481fa7ec5424e055b18a2d6fa607 9hist/alphapc/ns16552.h -rw-r--r-- 1.0 KiB
b61b499d — David du Colombier Plan 9 from Bell Labs 2000-11-24 25 years ago
                                                                                
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
#define uartwrreg(u,r,v)	outb((u)->port + (r), (u)->sticky[r] | (v))
#define uartrdreg(u,r)		inb((u)->port + (r))

#define uartpower(x, y)

void ns16552setup(ulong, ulong, char*, int);
void ns16552intr(int);
void uartclock(void);

/*
 *  handle an interrupt to a single uart
 */
static void
ns16552intrx(Ureg*, void* arg)
{
	ns16552intr((ulong)arg);
}

void
ns16552install(void)
{
	static int already;

	if(already)
		return;
	already = 1;

	if(ioalloc(Uart0, 8, 0, "eia0") < 0)
		print("eia0: port %d in use\n", Uart0);
	ns16552setup(Uart0, UartFREQ, "eia0", Ns550);
	intrenable(IrqUART0, ns16552intrx, (void*)0, BUSUNKNOWN, "eia0");
	if(ioalloc(Uart1, 8, 0, "eia1") < 0)
		print("eia1: port %d in use\n", Uart1);
	ns16552setup(Uart1, UartFREQ, "eia1", Ns550);
	intrenable(IrqUART1, ns16552intrx, (void*)0, BUSUNKNOWN, "eia1");
	addclock0link(uartclock);
}

#define RD(r)	inb(Uart0+(r))
static void
ns16552iputc(char c)
{
	mb();
	while((RD(5) & (1<<5)) == 0)
		mb();
	outb(Uart0, c);
	mb();
	while((RD(5) & (1<<5)) == 0)
		mb();
}