diff --git a/sdk/xtdk/hlfuncs.h b/sdk/xtdk/hlfuncs.h index e2efd09..69ea0be 100644 --- a/sdk/xtdk/hlfuncs.h +++ b/sdk/xtdk/hlfuncs.h @@ -39,6 +39,7 @@ XTCDECL XTSTATUS HlInitializeComPort(IN OUT PCPPORT Port, IN ULONG PortNumber, + IN PUCHAR PortAddress, IN ULONG BaudRate); #endif /* __XTDK_HLFUNCS_H */ diff --git a/xtldr/efiutil.c b/xtldr/efiutil.c index 13fd8a9..d3d4c25 100644 --- a/xtldr/efiutil.c +++ b/xtldr/efiutil.c @@ -22,12 +22,13 @@ BlComPortInitialize() { EFI_GUID LIPGuid = EFI_LOADED_IMAGE_PROTOCOL_GUID; PEFI_LOADED_IMAGE_PROTOCOL LoadedImage; - ULONG PortNumber, BaudRate; + ULONG PortAddress, PortNumber, BaudRate; PWCHAR Argument, CommandLine, LastArg; EFI_STATUS EfiStatus; XTSTATUS Status; /* Set default serial port options */ + PortAddress = 0; PortNumber = 0; BaudRate = 0; @@ -72,6 +73,37 @@ BlComPortInitialize() 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 */ if(*Argument == ',') { @@ -97,7 +129,7 @@ BlComPortInitialize() } /* Initialize COM port */ - Status = HlInitializeComPort(&EfiSerialPort, PortNumber, BaudRate); + Status = HlInitializeComPort(&EfiSerialPort, PortNumber, UlongToPtr(PortAddress), BaudRate); if(Status != STATUS_SUCCESS) { /* Serial port initialization failed, mark as not ready */ diff --git a/xtoskrnl/hl/cport.c b/xtoskrnl/hl/cport.c index 1fb6d6c..809d5bf 100644 --- a/xtoskrnl/hl/cport.c +++ b/xtoskrnl/hl/cport.c @@ -200,6 +200,9 @@ HlComPortPutByte(IN PCPPORT Port, * @param PortNumber * Supplies a port number. * + * @param PortAddress + * Supplies an address of the COM port. + * * @param BaudRate * Supplies an optional port baud rate. * @@ -211,6 +214,7 @@ XTCDECL XTSTATUS HlInitializeComPort(IN OUT PCPPORT Port, IN ULONG PortNumber, + IN PUCHAR PortAddress, IN ULONG BaudRate) { PUCHAR Address; @@ -218,13 +222,6 @@ HlInitializeComPort(IN OUT PCPPORT Port, USHORT Flags = 0; 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 */ if(PortNumber > ARRAY_SIZE(ComPortAddress)) { @@ -232,6 +229,22 @@ HlInitializeComPort(IN OUT PCPPORT Port, 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 */ if(BaudRate == 0) {