REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the EmbeddedPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Andrew Fish <afish@apple.com>
		
			
				
	
	
		
			240 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			240 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Basic serial IO abstraction for GDB
 | |
| 
 | |
|   Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
 | |
| 
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include <Uefi.h>
 | |
| #include <Library/GdbSerialLib.h>
 | |
| #include <Library/PcdLib.h>
 | |
| #include <Library/IoLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| 
 | |
| // ---------------------------------------------
 | |
| // UART Register Offsets
 | |
| // ---------------------------------------------
 | |
| #define BAUD_LOW_OFFSET    0x00
 | |
| #define BAUD_HIGH_OFFSET   0x01
 | |
| #define IER_OFFSET         0x01
 | |
| #define LCR_SHADOW_OFFSET  0x01
 | |
| #define FCR_SHADOW_OFFSET  0x02
 | |
| #define IR_CONTROL_OFFSET  0x02
 | |
| #define FCR_OFFSET         0x02
 | |
| #define EIR_OFFSET         0x02
 | |
| #define BSR_OFFSET         0x03
 | |
| #define LCR_OFFSET         0x03
 | |
| #define MCR_OFFSET         0x04
 | |
| #define LSR_OFFSET         0x05
 | |
| #define MSR_OFFSET         0x06
 | |
| 
 | |
| // ---------------------------------------------
 | |
| // UART Register Bit Defines
 | |
| // ---------------------------------------------
 | |
| #define LSR_TXRDY    0x20U
 | |
| #define LSR_RXDA     0x01U
 | |
| #define DLAB         0x01U
 | |
| #define ENABLE_FIFO  0x01U
 | |
| #define CLEAR_FIFOS  0x06U
 | |
| 
 | |
| // IO Port Base for the UART
 | |
| UINTN  gPort;
 | |
| 
 | |
| /**
 | |
|   The constructor function initializes the UART.
 | |
| 
 | |
|   @param  ImageHandle   The firmware allocated handle for the EFI image.
 | |
|   @param  SystemTable   A pointer to the EFI System Table.
 | |
| 
 | |
|   @retval EFI_SUCCESS   The constructor always returns EFI_SUCCESS.
 | |
| 
 | |
| **/
 | |
| RETURN_STATUS
 | |
| EFIAPI
 | |
| GdbSerialLibConstructor (
 | |
|   IN EFI_HANDLE        ImageHandle,
 | |
|   IN EFI_SYSTEM_TABLE  *SystemTable
 | |
|   )
 | |
| {
 | |
|   UINT64  BaudRate;
 | |
|   UINT8   DataBits;
 | |
|   UINT8   Parity;
 | |
|   UINT8   StopBits;
 | |
| 
 | |
|   gPort = (UINTN)PcdGet32 (PcdGdbUartPort);
 | |
| 
 | |
|   BaudRate = PcdGet64 (PcdGdbBaudRate);
 | |
|   Parity   = PcdGet8 (PcdGdbParity);
 | |
|   DataBits = PcdGet8 (PcdGdbDataBits);
 | |
|   StopBits = PcdGet8 (PcdGdbStopBits);
 | |
| 
 | |
|   return GdbSerialInit (BaudRate, Parity, DataBits, StopBits);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Sets the baud rate, receive FIFO depth, transmit/receive time out, parity,
 | |
|   data buts, and stop bits on a serial device. This call is optional as the serial
 | |
|   port will be set up with defaults base on PCD values.
 | |
| 
 | |
|   @param  BaudRate         The requested baud rate. A BaudRate value of 0 will use the the
 | |
|                            device's default interface speed.
 | |
|   @param  Parity           The type of parity to use on this serial device. A Parity value of
 | |
|                            DefaultParity will use the device's default parity value.
 | |
|   @param  DataBits         The number of data bits to use on the serial device. A DataBits
 | |
|                            value of 0 will use the device's default data bit setting.
 | |
|   @param  StopBits         The number of stop bits to use on this serial device. A StopBits
 | |
|                            value of DefaultStopBits will use the device's default number of
 | |
|                            stop bits.
 | |
| 
 | |
|   @retval EFI_SUCCESS      The device was configured.
 | |
|   @retval EFI_DEVICE_ERROR The serial device could not be configured.
 | |
| 
 | |
| **/
 | |
| RETURN_STATUS
 | |
| EFIAPI
 | |
| GdbSerialInit (
 | |
|   IN UINT64  BaudRate,
 | |
|   IN UINT8   Parity,
 | |
|   IN UINT8   DataBits,
 | |
|   IN UINT8   StopBits
 | |
|   )
 | |
| {
 | |
|   UINTN  Divisor;
 | |
|   UINT8  OutputData;
 | |
|   UINT8  Data;
 | |
|   UINT8  BreakSet = 0;
 | |
| 
 | |
|   //
 | |
|   // We assume the UART has been turned on to decode gPort address range
 | |
|   //
 | |
| 
 | |
|   //
 | |
|   // Map 5..8 to 0..3
 | |
|   //
 | |
|   Data = (UINT8)(DataBits - (UINT8)5);
 | |
| 
 | |
|   //
 | |
|   // Calculate divisor for baud generator
 | |
|   //
 | |
|   Divisor = 115200/(UINTN)BaudRate;
 | |
| 
 | |
|   //
 | |
|   // Set communications format
 | |
|   //
 | |
|   OutputData = (UINT8)((DLAB << 7) | ((BreakSet << 6) | ((Parity << 3) | ((StopBits << 2) | Data))));
 | |
|   IoWrite8 (gPort + LCR_OFFSET, OutputData);
 | |
| 
 | |
|   //
 | |
|   // Configure baud rate
 | |
|   //
 | |
|   IoWrite8 (gPort + BAUD_HIGH_OFFSET, (UINT8)(Divisor >> 8));
 | |
|   IoWrite8 (gPort + BAUD_LOW_OFFSET, (UINT8)(Divisor & 0xff));
 | |
| 
 | |
|   //
 | |
|   // Switch back to bank 0
 | |
|   //
 | |
|   OutputData = (UINT8)((~DLAB<<7)|((BreakSet<<6)|((Parity<<3)|((StopBits<<2)| Data))));
 | |
|   IoWrite8 (gPort + LCR_OFFSET, OutputData);
 | |
| 
 | |
|   // Not sure this is the right place to enable the FIFOs....
 | |
|   // We probably need the FIFO enabled to not drop input
 | |
|   IoWrite8 (gPort + FCR_SHADOW_OFFSET, ENABLE_FIFO);
 | |
| 
 | |
|   // Configure the UART hardware here
 | |
|   return RETURN_SUCCESS;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Check to see if a character is available from GDB. Do not read the character as that is
 | |
|   done via GdbGetChar().
 | |
| 
 | |
|   @return TRUE  - Character available
 | |
|   @return FALSE - Character not available
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| GdbIsCharAvailable (
 | |
|   VOID
 | |
|   )
 | |
| {
 | |
|   UINT8  Data;
 | |
| 
 | |
|   Data = IoRead8 (gPort + LSR_OFFSET);
 | |
| 
 | |
|   return ((Data & LSR_RXDA) == LSR_RXDA);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Get a character from GDB. This function must be able to run in interrupt context.
 | |
| 
 | |
|   @return A character from GDB
 | |
| 
 | |
| **/
 | |
| CHAR8
 | |
| EFIAPI
 | |
| GdbGetChar (
 | |
|   VOID
 | |
|   )
 | |
| {
 | |
|   UINT8  Data;
 | |
|   CHAR8  Char;
 | |
| 
 | |
|   // Wait for the serial port to be ready
 | |
|   do {
 | |
|     Data = IoRead8 (gPort + LSR_OFFSET);
 | |
|   } while ((Data & LSR_RXDA) == 0);
 | |
| 
 | |
|   Char = IoRead8 (gPort);
 | |
| 
 | |
|   // Make this an DEBUG_INFO after we get everything debugged.
 | |
|   DEBUG ((DEBUG_ERROR, "<%c<", Char));
 | |
|   return Char;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Send a character to GDB. This function must be able to run in interrupt context.
 | |
| 
 | |
| 
 | |
|   @param  Char    Send a character to GDB
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| EFIAPI
 | |
| GdbPutChar (
 | |
|   IN  CHAR8  Char
 | |
|   )
 | |
| {
 | |
|   UINT8  Data;
 | |
| 
 | |
|   // Make this an DEBUG_INFO after we get everything debugged.
 | |
|   DEBUG ((DEBUG_ERROR, ">%c>", Char));
 | |
| 
 | |
|   // Wait for the serial port to be ready
 | |
|   do {
 | |
|     Data = IoRead8 (gPort + LSR_OFFSET);
 | |
|   } while ((Data & LSR_TXRDY) == 0);
 | |
| 
 | |
|   IoWrite8 (gPort, Char);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Send an ASCII string to GDB. This function must be able to run in interrupt context.
 | |
| 
 | |
| 
 | |
|   @param  String    Send a string to GDB
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| GdbPutString (
 | |
|   IN CHAR8  *String
 | |
|   )
 | |
| {
 | |
|   while (*String != '\0') {
 | |
|     GdbPutChar (*String);
 | |
|     String++;
 | |
|   }
 | |
| }
 |