VOID GetOemSetupConfig(pGBL_DATA pGblData) { UINT8 i; UINT8 input = 0; if (pGblData->mem.marginTest) { pGblData->needColdReset = 1; } else { while (1) { if (SerialPortPoll()) { (VOID)SerialPortRead ((UINT8*)&input, 1); } else { break; } } DEBUG((EFI_D_ERROR, "\nPress 't' or 'T' to run MarginTest in 3 seconds, any other press to pass\n")); for (i = 0; i < 100; i++) { if (SerialPortPoll()) { (VOID)SerialPortRead ((UINT8*)&input, 1); break; } MicroSecondDelay(30000); } if ('T' == input || 't' == input) { pGblData->mem.marginTest = TRUE; pGblData->needColdReset = 1; } } return; }
/** Read data from debug device and save the datas in buffer. Reads NumberOfBytes data bytes from a debug device into the buffer specified by Buffer. The number of bytes actually read is returned. If the return value is less than NumberOfBytes, then the rest operation failed. If NumberOfBytes is zero, then return 0. @param Handle Debug port handle. @param Buffer Pointer to the data buffer to store the data read from the debug device. @param NumberOfBytes Number of bytes which will be read. @param Timeout Timeout value for reading from debug device. It unit is Microsecond. @retval 0 Read data failed, no data is to be read. @retval >0 Actual number of bytes read from debug device. **/ UINTN EFIAPI DebugPortReadBuffer ( IN DEBUG_PORT_HANDLE Handle, IN UINT8 *Buffer, IN UINTN NumberOfBytes, IN UINTN Timeout ) { if (NumberOfBytes != 1 || Buffer == NULL || Timeout != 0) { return 0; } return SerialPortRead (Buffer, 1); }
EFI_STATUS EFIAPI SerialRead ( IN EFI_SERIAL_IO_PROTOCOL *This, IN OUT UINTN *BufferSize, OUT VOID *Buffer ) { UINTN Count = 0; if (SerialPortPoll()) { Count = SerialPortRead (Buffer, *BufferSize); } if (Count != *BufferSize) { *BufferSize = Count; return EFI_TIMEOUT; } return EFI_SUCCESS; }
/** Reads data from a serial device. @param This Protocol instance pointer. @param BufferSize On input, the size of the Buffer. On output, the amount of data returned in Buffer. @param Buffer The buffer to return the data into. @retval EFI_SUCCESS The data was read. @retval EFI_DEVICE_ERROR The device reported an error. @retval EFI_TIMEOUT The data write was stopped due to a timeout. **/ EFI_STATUS EFIAPI SerialRead ( IN EFI_SERIAL_IO_PROTOCOL *This, IN OUT UINTN *BufferSize, OUT VOID *Buffer ) { UINTN Count; UINTN TimeOut; Count = 0; while (Count < *BufferSize) { TimeOut = 0; while (TimeOut < mSerialIoMode.Timeout) { if (SerialPortPoll ()) { break; } gBS->Stall (10); TimeOut += 10; } if (TimeOut >= mSerialIoMode.Timeout) { break; } SerialPortRead (Buffer, 1); Count++; Buffer = (VOID *) ((UINT8 *) Buffer + 1); } if (Count != *BufferSize) { *BufferSize = Count; return EFI_TIMEOUT; } return EFI_SUCCESS; }
EFI_STATUS EFIAPI ReadKeyStroke ( IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, OUT EFI_INPUT_KEY *Key ) { CHAR8 Char; if (!SerialPortPoll ()) { return EFI_NOT_READY; } SerialPortRead ((UINT8 *)&Char, 1); // // Check for ESC sequence. This code is not techincally correct VT100 code. // An illegal ESC sequence represents an ESC and the characters that follow. // This code will eat one or two chars after an escape. This is done to // prevent some complex FIFOing of the data. It is good enough to get // the arrow and delete keys working // Key->UnicodeChar = 0; Key->ScanCode = SCAN_NULL; if (Char == 0x1b) { SerialPortRead ((UINT8 *)&Char, 1); if (Char == '[') { SerialPortRead ((UINT8 *)&Char, 1); switch (Char) { case 'A': Key->ScanCode = SCAN_UP; break; case 'B': Key->ScanCode = SCAN_DOWN; break; case 'C': Key->ScanCode = SCAN_RIGHT; break; case 'D': Key->ScanCode = SCAN_LEFT; break; case 'H': Key->ScanCode = SCAN_HOME; break; case 'K': case 'F': // PC ANSI Key->ScanCode = SCAN_END; break; case '@': case 'L': Key->ScanCode = SCAN_INSERT; break; case 'P': case 'X': // PC ANSI Key->ScanCode = SCAN_DELETE; break; case 'U': case '/': case 'G': // PC ANSI Key->ScanCode = SCAN_PAGE_DOWN; break; case 'V': case '?': case 'I': // PC ANSI Key->ScanCode = SCAN_PAGE_UP; break; // PCANSI that does not conflict with VT100 case 'M': Key->ScanCode = SCAN_F1; break; case 'N': Key->ScanCode = SCAN_F2; break; case 'O': Key->ScanCode = SCAN_F3; break; case 'Q': Key->ScanCode = SCAN_F5; break; case 'R': Key->ScanCode = SCAN_F6; break; case 'S': Key->ScanCode = SCAN_F7; break; case 'T': Key->ScanCode = SCAN_F8; break; default: Key->UnicodeChar = Char; break; } } else if (Char == '0') { SerialPortRead ((UINT8 *)&Char, 1); switch (Char) { case 'P': Key->ScanCode = SCAN_F1; break; case 'Q': Key->ScanCode = SCAN_F2; break; case 'w': Key->ScanCode = SCAN_F3; break; case 'x': Key->ScanCode = SCAN_F4; break; case 't': Key->ScanCode = SCAN_F5; break; case 'u': Key->ScanCode = SCAN_F6; break; case 'q': Key->ScanCode = SCAN_F7; break; case 'r': Key->ScanCode = SCAN_F8; break; case 'p': Key->ScanCode = SCAN_F9; break; case 'm': Key->ScanCode = SCAN_F10; break; default : break; } } } else if (Char < ' ') { if ((Char == CHAR_BACKSPACE) || (Char == CHAR_TAB) || (Char == CHAR_LINEFEED) || (Char == CHAR_CARRIAGE_RETURN)) { // Only let through EFI required control characters Key->UnicodeChar = (CHAR16)Char; } } else if (Char == 0x7f) { Key->ScanCode = SCAN_DELETE; } else { Key->UnicodeChar = (CHAR16)Char; } return EFI_SUCCESS; }