1 /*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: ntoskrnl/inbv/inbvport.c
5 * PURPOSE: Serial Port Boot Driver for Headless Terminal Support
6 * PROGRAMMERS: ReactOS Portable Systems Group
7 */
8
9 /* INCLUDES ******************************************************************/
10
11 #include <ntoskrnl.h>
12 #include <debug.h>
13
14 /* GLOBALS *******************************************************************/
15
16 CPPORT Port[4] =
17 {
18 {NULL, 0, TRUE},
19 {NULL, 0, TRUE},
20 {NULL, 0, TRUE},
21 {NULL, 0, TRUE}
22 };
23
24 /* FUNCTIONS *****************************************************************/
25
26 BOOLEAN
27 NTAPI
InbvPortPollOnly(IN ULONG PortId)28 InbvPortPollOnly(IN ULONG PortId)
29 {
30 UCHAR Dummy;
31
32 /* Poll a byte from the port */
33 return CpGetByte(&Port[PortId], &Dummy, FALSE, TRUE) == CP_GET_SUCCESS;
34 }
35
36 BOOLEAN
37 NTAPI
InbvPortGetByte(IN ULONG PortId,OUT PUCHAR Byte)38 InbvPortGetByte(IN ULONG PortId,
39 OUT PUCHAR Byte)
40 {
41 /* Read a byte from the port */
42 return CpGetByte(&Port[PortId], Byte, TRUE, FALSE) == CP_GET_SUCCESS;
43 }
44
45 VOID
46 NTAPI
InbvPortPutByte(IN ULONG PortId,IN UCHAR Byte)47 InbvPortPutByte(IN ULONG PortId,
48 IN UCHAR Byte)
49 {
50 /* Send the byte */
51 CpPutByte(&Port[PortId], Byte);
52 }
53
54 VOID
55 NTAPI
InbvPortEnableFifo(IN ULONG PortId,IN BOOLEAN Enable)56 InbvPortEnableFifo(IN ULONG PortId,
57 IN BOOLEAN Enable)
58 {
59 /* Set FIFO as requested */
60 CpEnableFifo(Port[PortId].Address, Enable);
61 }
62
63 VOID
64 NTAPI
InbvPortTerminate(IN ULONG PortId)65 InbvPortTerminate(IN ULONG PortId)
66 {
67 /* The port is now available */
68 Port[PortId].Address = NULL;
69 }
70
71 BOOLEAN
72 NTAPI
InbvPortInitialize(IN ULONG BaudRate,IN ULONG PortNumber,IN PUCHAR PortAddress,OUT PULONG PortId,IN BOOLEAN IsMMIODevice)73 InbvPortInitialize(IN ULONG BaudRate,
74 IN ULONG PortNumber,
75 IN PUCHAR PortAddress,
76 OUT PULONG PortId,
77 IN BOOLEAN IsMMIODevice)
78 {
79 /* Not yet supported */
80 ASSERT(IsMMIODevice == FALSE);
81
82 #if defined(SARCH_PC98)
83 /* Set default baud rate */
84 if (BaudRate == 0) BaudRate = 9600;
85
86 /* Check if port or address given */
87 if (PortNumber)
88 {
89 /* Pick correct address for port */
90 if (!PortAddress)
91 {
92 if (PortNumber == 1)
93 {
94 PortAddress = (PUCHAR)0x30;
95 }
96 else
97 {
98 PortAddress = (PUCHAR)0x238;
99 PortNumber = 2;
100 }
101 }
102 }
103 else
104 {
105 /* Pick correct port for address */
106 PortAddress = (PUCHAR)0x30;
107 if (CpDoesPortExist(PortAddress))
108 {
109 PortNumber = 1;
110 }
111 else
112 {
113 PortAddress = (PUCHAR)0x238;
114 if (!CpDoesPortExist(PortAddress))
115 return FALSE;
116
117 PortNumber = 2;
118 }
119 }
120 #else
121 /* Set default baud rate */
122 if (BaudRate == 0) BaudRate = 19200;
123
124 /* Check if port or address given */
125 if (PortNumber)
126 {
127 /* Pick correct address for port */
128 if (!PortAddress)
129 {
130 switch (PortNumber)
131 {
132 case 1:
133 PortAddress = (PUCHAR)0x3F8;
134 break;
135
136 case 2:
137 PortAddress = (PUCHAR)0x2F8;
138 break;
139
140 case 3:
141 PortAddress = (PUCHAR)0x3E8;
142 break;
143
144 default:
145 PortNumber = 4;
146 PortAddress = (PUCHAR)0x2E8;
147 }
148 }
149 }
150 else
151 {
152 /* Pick correct port for address */
153 PortAddress = (PUCHAR)0x2F8;
154 if (CpDoesPortExist(PortAddress))
155 {
156 PortNumber = 2;
157 }
158 else
159 {
160 PortAddress = (PUCHAR)0x3F8;
161 if (!CpDoesPortExist(PortAddress)) return FALSE;
162 PortNumber = 1;
163 }
164 }
165 #endif
166
167 /* Initialize the port unless it's already up, and then return it */
168 if (Port[PortNumber - 1].Address) return FALSE;
169
170 CpInitialize(&Port[PortNumber - 1], PortAddress, BaudRate);
171 *PortId = PortNumber - 1;
172
173 return TRUE;
174 }
175
176 /* EOF */
177