/** Implements EFI_SIMPLE_TEXT_INPUT_PROTOCOL.ReadKeyStroke(). @param This Indicates the calling context. @param Key A pointer to a buffer that is filled in with the keystroke information for the key that was sent from terminal. @retval EFI_SUCCESS The keystroke information is returned successfully. @retval EFI_NOT_READY There is no keystroke data available. @retval EFI_DEVICE_ERROR The dependent serial device encounters error. **/ EFI_STATUS EFIAPI TerminalConInReadKeyStroke ( IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, OUT EFI_INPUT_KEY *Key ) { TERMINAL_DEV *TerminalDevice; EFI_STATUS Status; EFI_KEY_DATA KeyData; // // get TERMINAL_DEV from "This" parameter. // TerminalDevice = TERMINAL_CON_IN_DEV_FROM_THIS (This); Status = ReadKeyStrokeWorker (TerminalDevice, &KeyData); if (EFI_ERROR (Status)) { return Status; } CopyMem (Key, &KeyData.Key, sizeof (EFI_INPUT_KEY)); return EFI_SUCCESS; }
/** Implements EFI_SIMPLE_TEXT_INPUT_PROTOCOL.Reset(). This driver only perform dependent serial device reset regardless of the value of ExtendeVerification @param This Indicates the calling context. @param ExtendedVerification Skip by this driver. @retval EFI_SUCCESS The reset operation succeeds. @retval EFI_DEVICE_ERROR The dependent serial port reset fails. **/ EFI_STATUS EFIAPI TerminalConInReset ( IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, IN BOOLEAN ExtendedVerification ) { EFI_STATUS Status; TERMINAL_DEV *TerminalDevice; TerminalDevice = TERMINAL_CON_IN_DEV_FROM_THIS (This); // // Report progress code here // REPORT_STATUS_CODE_WITH_DEVICE_PATH ( EFI_PROGRESS_CODE, (EFI_PERIPHERAL_REMOTE_CONSOLE | EFI_P_PC_RESET), TerminalDevice->DevicePath ); Status = TerminalDevice->SerialIo->Reset (TerminalDevice->SerialIo); // // Make all the internal buffer empty for keys // TerminalDevice->RawFiFo->Head = TerminalDevice->RawFiFo->Tail; TerminalDevice->UnicodeFiFo->Head = TerminalDevice->UnicodeFiFo->Tail; TerminalDevice->EfiKeyFiFo->Head = TerminalDevice->EfiKeyFiFo->Tail; if (EFI_ERROR (Status)) { REPORT_STATUS_CODE_WITH_DEVICE_PATH ( EFI_ERROR_CODE | EFI_ERROR_MINOR, (EFI_PERIPHERAL_REMOTE_CONSOLE | EFI_P_EC_CONTROLLER_ERROR), TerminalDevice->DevicePath ); } return Status; }
/** Check for a pending key in the Efi Key FIFO or Serial device buffer. @param This Indicates the calling context. @retval EFI_SUCCESS There is key pending. @retval EFI_NOT_READY There is no key pending. @retval EFI_DEVICE_ERROR If Serial IO is not attached to serial device. **/ EFI_STATUS TerminalConInCheckForKey ( IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This ) { EFI_STATUS Status; TERMINAL_DEV *TerminalDevice; UINT32 Control; UINT8 Input; EFI_SERIAL_IO_MODE *Mode; EFI_SERIAL_IO_PROTOCOL *SerialIo; UINTN SerialInTimeOut; TerminalDevice = TERMINAL_CON_IN_DEV_FROM_THIS (This); SerialIo = TerminalDevice->SerialIo; if (SerialIo == NULL) { return EFI_DEVICE_ERROR; } // // if current timeout value for serial device is not identical with // the value saved in TERMINAL_DEV structure, then recalculate the // timeout value again and set serial attribute according to this value. // Mode = SerialIo->Mode; if (Mode->Timeout != TerminalDevice->SerialInTimeOut) { SerialInTimeOut = 0; if (Mode->BaudRate != 0) { // // According to BAUD rate to calculate the timeout value. // SerialInTimeOut = (1 + Mode->DataBits + Mode->StopBits) * 2 * 1000000 / (UINTN) Mode->BaudRate; } Status = SerialIo->SetAttributes ( SerialIo, Mode->BaudRate, Mode->ReceiveFifoDepth, (UINT32) SerialInTimeOut, (EFI_PARITY_TYPE) (Mode->Parity), (UINT8) Mode->DataBits, (EFI_STOP_BITS_TYPE) (Mode->StopBits) ); if (EFI_ERROR (Status)) { TerminalDevice->SerialInTimeOut = 0; } else { TerminalDevice->SerialInTimeOut = SerialInTimeOut; } } // // Check whether serial buffer is empty. // Status = SerialIo->GetControl (SerialIo, &Control); if ((Control & EFI_SERIAL_INPUT_BUFFER_EMPTY) != 0) { // // Translate all the raw data in RawFIFO into EFI Key, // according to different terminal type supported. // TranslateRawDataToEfiKey (TerminalDevice); // // if there is pre-fetched Efi Key in EfiKeyFIFO buffer, // return directly. // if (!IsEfiKeyFiFoEmpty (TerminalDevice)) { return EFI_SUCCESS; } else { return EFI_NOT_READY; } } // // Fetch all the keys in the serial buffer, // and insert the byte stream into RawFIFO. // do { Status = GetOneKeyFromSerial (TerminalDevice->SerialIo, &Input); if (EFI_ERROR (Status)) { if (Status == EFI_DEVICE_ERROR) { REPORT_STATUS_CODE_WITH_DEVICE_PATH ( EFI_ERROR_CODE | EFI_ERROR_MINOR, (EFI_PERIPHERAL_REMOTE_CONSOLE | EFI_P_EC_INPUT_ERROR), TerminalDevice->DevicePath ); } break; } RawFiFoInsertOneKey (TerminalDevice, Input); } while (TRUE); // // Translate all the raw data in RawFIFO into EFI Key, // according to different terminal type supported. // TranslateRawDataToEfiKey (TerminalDevice); if (IsEfiKeyFiFoEmpty (TerminalDevice)) { return EFI_NOT_READY; } return EFI_SUCCESS; }