|
|
1.1 root 1: /*****************************************************************************
2:
3: Copyright � 1995, 1996 Digital Equipment Corporation,
4: Maynard, Massachusetts.
5:
6: All Rights Reserved
7:
8: Permission to use, copy, modify, and distribute this software and its
9: documentation for any purpose and without fee is hereby granted, provided
10: that the copyright notice and this permission notice appear in all copies
11: of software and supporting documentation, and that the name of Digital not
12: be used in advertising or publicity pertaining to distribution of the software
13: without specific, written prior permission. Digital grants this permission
14: provided that you prominently mark, as not part of the original, any
15: modifications made to this software or documentation.
16:
17: Digital Equipment Corporation disclaims all warranties and/or guarantees
18: with regard to this software, including all implied warranties of fitness for
19: a particular purpose and merchantability, and makes no representations
20: regarding the use of, or the results of the use of, the software and
21: documentation in terms of correctness, accuracy, reliability, currentness or
22: otherwise; and you rely on the software, documentation and results solely at
23: your own risk.
24:
25: ******************************************************************************/
26:
27: /*
28: * [email protected]
29: *
30: * Modified for QEMU PALcode by [email protected].
31: */
32:
33: #include "protos.h"
34: #include "uart.h"
35:
36: #ifndef SERIAL_SPEED
37: #define SERIAL_SPEED 9600
38: #endif
39:
40: int
41: uart_charav(int offset)
42: {
43: return inb(com2Lsr + offset) & 1;
44: }
45:
46: int
47: uart_getchar(int offset)
48: {
49: /* If interrupts are enabled, use wtint assuming that either the
50: device itself will wake us, or that a clock interrupt will. */
51: if ((rdps() & 7) == 0) {
52: while (!uart_charav(offset)) {
53: wtint(0);
54: }
55: } else {
56: while (!uart_charav(offset))
57: continue;
58: }
59:
60: return inb(com2Rbr + offset);
61: }
62:
63: void
64: uart_putchar_raw(int offset, char c)
65: {
66: while ((inb(com2Lsr + offset) & 0x20) == 0)
67: continue;
68: outb(c, com2Thr + offset);
69: }
70:
71: void
72: uart_putchar(int offset, char c)
73: {
74: if (c == '\n')
75: uart_putchar_raw(offset, '\r');
76: uart_putchar_raw(offset, c);
77: }
78:
79: void
80: uart_puts(int offset, const char *s)
81: {
82: while (*s != '\0')
83: uart_putchar(offset, *s++);
84: }
85:
86: void
87: uart_init_line(int offset, int baud)
88: {
89: int i;
90: int baudconst;
91:
92: switch (baud) {
93: case 56000:
94: baudconst = 2;
95: break;
96: case 38400:
97: baudconst = 3;
98: break;
99: case 19200:
100: baudconst = 6;
101: break;
102: case 9600:
103: baudconst = 12;
104: break;
105: case 4800:
106: baudconst = 24;
107: break;
108: case 2400:
109: baudconst = 48;
110: break;
111: case 1200:
112: baudconst = 96;
113: break;
114: case 300:
115: baudconst = 384;
116: break;
117: case 150:
118: baudconst = 768;
119: break;
120: default:
121: baudconst = 12;
122: break;
123: }
124:
125:
126: outb(0x87, com2Lcr + offset);
127: outb(0, com2Dlm + offset);
128: outb(baudconst, com2Dll + offset);
129: outb(0x07, com2Lcr + offset);
130: outb(0x0F, com2Mcr + offset);
131:
132: for (i = 10; i > 0; i--) {
133: if (inb(com2Lsr + offset) == 0)
134: break;
135: inb(com2Rbr + offset);
136: }
137: }
138:
139: void uart_init(void)
140: {
141: uart_init_line(COM1, SERIAL_SPEED);
142: uart_init_line(COM2, SERIAL_SPEED);
143: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.