[MSGINA] Make DLG_DATA object-oriented (#2353)
[reactos.git] / ntoskrnl / inbv / inbvport.c
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
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
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
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
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
65 InbvPortTerminate(IN ULONG PortId)
66 {
67 /* The port is now available */
68 Port[PortId].Address = NULL;
69 }
70
71 BOOLEAN
72 NTAPI
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 /* Set default baud rate */
83 if (BaudRate == 0) BaudRate = 19200;
84
85 /* Check if port or address given */
86 if (PortNumber)
87 {
88 /* Pick correct address for port */
89 if (!PortAddress)
90 {
91 switch (PortNumber)
92 {
93 case 1:
94 PortAddress = (PUCHAR)0x3F8;
95 break;
96
97 case 2:
98 PortAddress = (PUCHAR)0x2F8;
99 break;
100
101 case 3:
102 PortAddress = (PUCHAR)0x3E8;
103 break;
104
105 default:
106 PortNumber = 4;
107 PortAddress = (PUCHAR)0x2E8;
108 }
109 }
110 }
111 else
112 {
113 /* Pick correct port for address */
114 PortAddress = (PUCHAR)0x2F8;
115 if (CpDoesPortExist(PortAddress))
116 {
117 PortNumber = 2;
118 }
119 else
120 {
121 PortAddress = (PUCHAR)0x3F8;
122 if (!CpDoesPortExist(PortAddress)) return FALSE;
123 PortNumber = 1;
124 }
125 }
126
127 /* Initialize the port unless it's already up, and then return it */
128 if (Port[PortNumber - 1].Address) return FALSE;
129
130 CpInitialize(&Port[PortNumber - 1], PortAddress, BaudRate);
131 *PortId = PortNumber - 1;
132
133 return TRUE;
134 }
135
136 /* EOF */