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 #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