mirror of
https://github.com/reactos/reactos.git
synced 2024-11-02 12:53:33 +00:00
122 lines
2.2 KiB
C
122 lines
2.2 KiB
C
|
/*
|
||
|
* PROJECT: ReactOS Kernel
|
||
|
* LICENSE: BSD - See COPYING.ARM in the top level directory
|
||
|
* FILE: ntoskrnl/inbv/inbvport.c
|
||
|
* PURPOSE: Serial Port Boot Driver for Headless Terminal Support
|
||
|
* PROGRAMMERS: ReactOS Portable Systems Group
|
||
|
*/
|
||
|
|
||
|
/* INCLUDES ******************************************************************/
|
||
|
|
||
|
#include <ntoskrnl.h>
|
||
|
#include <debug.h>
|
||
|
|
||
|
/* GLOBALS *******************************************************************/
|
||
|
|
||
|
CPPORT Port[4] =
|
||
|
{
|
||
|
{NULL, 0, TRUE},
|
||
|
{NULL, 0, TRUE},
|
||
|
{NULL, 0, TRUE},
|
||
|
{NULL, 0, TRUE}
|
||
|
};
|
||
|
|
||
|
/* FUNCTIONS *****************************************************************/
|
||
|
|
||
|
VOID
|
||
|
NTAPI
|
||
|
InbvPortEnableFifo(
|
||
|
IN ULONG PortId,
|
||
|
IN BOOLEAN Enable
|
||
|
)
|
||
|
{
|
||
|
/* Set FIFO as requested */
|
||
|
CpEnableFifo(Port[PortId].Address, Enable);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
NTAPI
|
||
|
InbvPortPutByte(
|
||
|
IN ULONG PortId,
|
||
|
IN BOOLEAN Output
|
||
|
)
|
||
|
{
|
||
|
/* Send the byte */
|
||
|
CpPutByte(&Port[PortId], Output);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
NTAPI
|
||
|
InbvPortTerminate(
|
||
|
IN ULONG PortId
|
||
|
)
|
||
|
{
|
||
|
/* The port is now available */
|
||
|
Port[PortId].Address = NULL;
|
||
|
}
|
||
|
|
||
|
BOOLEAN
|
||
|
NTAPI
|
||
|
InbvPortInitialize(
|
||
|
IN ULONG BaudRate,
|
||
|
IN ULONG PortNumber,
|
||
|
IN PUCHAR PortAddress,
|
||
|
OUT PULONG PortId,
|
||
|
IN BOOLEAN IsMMIODevice
|
||
|
)
|
||
|
{
|
||
|
/* Not yet supported */
|
||
|
ASSERT(IsMMIODevice == FALSE);
|
||
|
|
||
|
/* Set default baud rate */
|
||
|
if (BaudRate == 0) BaudRate = 19200;
|
||
|
|
||
|
/* Check if port or address given */
|
||
|
if (PortNumber)
|
||
|
{
|
||
|
/* Pick correct address for port */
|
||
|
if (!PortAddress)
|
||
|
{
|
||
|
switch (PortNumber)
|
||
|
{
|
||
|
case 1:
|
||
|
PortAddress = (PUCHAR)0x3F8;
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
PortAddress = (PUCHAR)0x2F8;
|
||
|
break;
|
||
|
|
||
|
case 3:
|
||
|
PortAddress = (PUCHAR)0x3E8;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
PortNumber = 4;
|
||
|
PortAddress = (PUCHAR)0x2E8;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* Pick correct port for address */
|
||
|
PortAddress = (PUCHAR)0x2F8;
|
||
|
if (CpDoesPortExist(PortAddress))
|
||
|
{
|
||
|
PortNumber = 2;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
PortAddress = (PUCHAR)0x3F8;
|
||
|
if (!CpDoesPortExist(PortAddress)) return FALSE;
|
||
|
PortNumber = 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Initialize the port unless it's already up, and then return it */
|
||
|
if (Port[PortNumber - 1].Address) return FALSE;
|
||
|
CpInitialize(&Port[PortNumber - 1], PortAddress, BaudRate);
|
||
|
*PortId = PortNumber - 1;
|
||
|
return TRUE;
|
||
|
}
|