X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=ArmPkg%2FLibrary%2FSemiHostingSerialPortLib%2FSerialPortLib.c;fp=ArmPkg%2FLibrary%2FSemiHostingSerialPortLib%2FSerialPortLib.c;h=df43f31413a2697dc5bba080ad1ada2f2b15714b;hp=0000000000000000000000000000000000000000;hb=2ef2b01e07c02db339f34004445734a2dbdd80e1;hpb=f7753a96ba1653ddd31b01c198a352f6332ac404 diff --git a/ArmPkg/Library/SemiHostingSerialPortLib/SerialPortLib.c b/ArmPkg/Library/SemiHostingSerialPortLib/SerialPortLib.c new file mode 100644 index 0000000000..df43f31413 --- /dev/null +++ b/ArmPkg/Library/SemiHostingSerialPortLib/SerialPortLib.c @@ -0,0 +1,144 @@ +/** @file + Serial I/O Port library functions with no library constructor/destructor + + Copyright (c) 2008-2009, Apple Inc. All rights reserved. + + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include +#include +#include +#include + + +/* + + Programmed hardware of Serial port. + + @return Always return EFI_UNSUPPORTED. + +**/ +RETURN_STATUS +EFIAPI +SerialPortInitialize ( + VOID + ) +{ + if (SemihostConnectionSupported ()) { + return RETURN_SUCCESS; + } else { + return RETURN_UNSUPPORTED; + } +} + +/** + Write data to serial device. + + @param Buffer Point of data buffer which need to be writed. + @param NumberOfBytes Number of output bytes which are cached in Buffer. + + @retval 0 Write data failed. + @retval !0 Actual number of bytes writed to serial device. + +**/ + +#define PRINT_BUFFER_SIZE 512 +#define PRINT_BUFFER_THRESHOLD (PRINT_BUFFER_SIZE - 4) + +UINTN +EFIAPI +SerialPortWrite ( + IN UINT8 *Buffer, + IN UINTN NumberOfBytes +) +{ + UINT8 PrintBuffer[PRINT_BUFFER_SIZE]; + UINTN SourceIndex = 0; + UINTN DestinationIndex = 0; + UINT8 CurrentCharacter; + + while (SourceIndex < NumberOfBytes) + { + CurrentCharacter = Buffer[SourceIndex++]; + + switch (CurrentCharacter) + { + case '\r': + continue; + + case '\n': + PrintBuffer[DestinationIndex++] = ' '; + // fall through + + default: + PrintBuffer[DestinationIndex++] = CurrentCharacter; + break; + } + + if (DestinationIndex > PRINT_BUFFER_THRESHOLD) + { + PrintBuffer[DestinationIndex] = '\0'; + SemihostWriteString ((CHAR8 *) PrintBuffer); + + DestinationIndex = 0; + } + } + + if (DestinationIndex > 0) + { + PrintBuffer[DestinationIndex] = '\0'; + SemihostWriteString ((CHAR8 *) PrintBuffer); + } + + return 0; +} + + +/** + Read data from serial device and save the datas in buffer. + + @param Buffer Point of data buffer which need to be writed. + @param NumberOfBytes Number of output bytes which are cached in Buffer. + + @retval 0 Read data failed. + @retval !0 Aactual number of bytes read from serial device. + +**/ +UINTN +EFIAPI +SerialPortRead ( + OUT UINT8 *Buffer, + IN UINTN NumberOfBytes +) +{ + *Buffer = SemihostReadCharacter (); + return 1; +} + + + +/** + Check to see if any data is avaiable to be read from the debug device. + + @retval TRUE At least one byte of data is avaiable to be read + @retval FALS No data is avaiable to be read + +**/ +BOOLEAN +EFIAPI +SerialPortPoll ( + VOID + ) +{ + // Since SemiHosting read character is blocking always say we have a char ready? + return SemihostConnectionSupported (); +} +