Allow to provide custom COM port address

This commit is contained in:
Rafal Kupiec 2022-12-29 23:44:52 +01:00
parent feabac2d98
commit 94e9fa1293
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4
3 changed files with 55 additions and 9 deletions

View File

@ -39,6 +39,7 @@ XTCDECL
XTSTATUS XTSTATUS
HlInitializeComPort(IN OUT PCPPORT Port, HlInitializeComPort(IN OUT PCPPORT Port,
IN ULONG PortNumber, IN ULONG PortNumber,
IN PUCHAR PortAddress,
IN ULONG BaudRate); IN ULONG BaudRate);
#endif /* __XTDK_HLFUNCS_H */ #endif /* __XTDK_HLFUNCS_H */

View File

@ -22,12 +22,13 @@ BlComPortInitialize()
{ {
EFI_GUID LIPGuid = EFI_LOADED_IMAGE_PROTOCOL_GUID; EFI_GUID LIPGuid = EFI_LOADED_IMAGE_PROTOCOL_GUID;
PEFI_LOADED_IMAGE_PROTOCOL LoadedImage; PEFI_LOADED_IMAGE_PROTOCOL LoadedImage;
ULONG PortNumber, BaudRate; ULONG PortAddress, PortNumber, BaudRate;
PWCHAR Argument, CommandLine, LastArg; PWCHAR Argument, CommandLine, LastArg;
EFI_STATUS EfiStatus; EFI_STATUS EfiStatus;
XTSTATUS Status; XTSTATUS Status;
/* Set default serial port options */ /* Set default serial port options */
PortAddress = 0;
PortNumber = 0; PortNumber = 0;
BaudRate = 0; BaudRate = 0;
@ -72,6 +73,37 @@ BlComPortInitialize()
Argument++; Argument++;
} }
/* Check for some custom COM port (COM0 means non-default one) */
if(PortNumber == 0)
{
/* Look for COM port address */
if(RtlWideStringCompare(Argument, L",0x", 3) == 0)
{
/* COM port address provided */
Argument += 3;
while((*Argument >= '0' && *Argument <= '9') ||
(*Argument >= 'A' && *Argument <= 'F') ||
(*Argument >= 'a' && *Argument <= 'f'))
{
/* Get port address */
PortAddress *= 16;
if(*Argument >= '0' && *Argument <= '9')
{
PortAddress += *Argument - '0';
}
else if(*Argument >= 'A' && *Argument <= 'F')
{
PortAddress += *Argument - 'A' + 10;
}
else if(*Argument >= 'a' && *Argument <= 'f')
{
PortAddress += *Argument - 'a' + 10;
}
Argument++;
}
}
}
/* Look for additional COM port parameters */ /* Look for additional COM port parameters */
if(*Argument == ',') if(*Argument == ',')
{ {
@ -97,7 +129,7 @@ BlComPortInitialize()
} }
/* Initialize COM port */ /* Initialize COM port */
Status = HlInitializeComPort(&EfiSerialPort, PortNumber, BaudRate); Status = HlInitializeComPort(&EfiSerialPort, PortNumber, UlongToPtr(PortAddress), BaudRate);
if(Status != STATUS_SUCCESS) if(Status != STATUS_SUCCESS)
{ {
/* Serial port initialization failed, mark as not ready */ /* Serial port initialization failed, mark as not ready */

View File

@ -200,6 +200,9 @@ HlComPortPutByte(IN PCPPORT Port,
* @param PortNumber * @param PortNumber
* Supplies a port number. * Supplies a port number.
* *
* @param PortAddress
* Supplies an address of the COM port.
*
* @param BaudRate * @param BaudRate
* Supplies an optional port baud rate. * Supplies an optional port baud rate.
* *
@ -211,6 +214,7 @@ XTCDECL
XTSTATUS XTSTATUS
HlInitializeComPort(IN OUT PCPPORT Port, HlInitializeComPort(IN OUT PCPPORT Port,
IN ULONG PortNumber, IN ULONG PortNumber,
IN PUCHAR PortAddress,
IN ULONG BaudRate) IN ULONG BaudRate)
{ {
PUCHAR Address; PUCHAR Address;
@ -218,13 +222,6 @@ HlInitializeComPort(IN OUT PCPPORT Port,
USHORT Flags = 0; USHORT Flags = 0;
ULONG Mode; ULONG Mode;
/* Check if serial port is set */
if(PortNumber == 0)
{
/* Use COM1 by default */
PortNumber = 1;
}
/* We support only a pre-defined number of ports */ /* We support only a pre-defined number of ports */
if(PortNumber > ARRAY_SIZE(ComPortAddress)) if(PortNumber > ARRAY_SIZE(ComPortAddress))
{ {
@ -232,6 +229,22 @@ HlInitializeComPort(IN OUT PCPPORT Port,
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
} }
/* Check if serial port is set */
if(PortNumber == 0)
{
/* Check if port address supplied instead */
if(PortAddress)
{
/* Set custom port address */
ComPortAddress[PortNumber] = PtrToUlong(PortAddress);
}
else
{
/* Use COM1 by default */
PortNumber = 1;
}
}
/* Check if baud rate is set */ /* Check if baud rate is set */
if(BaudRate == 0) if(BaudRate == 0)
{ {