2 Main file for SerMode shell Debug1 function.
4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
5 Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
10 #include "UefiShellDebug1CommandsLib.h"
11 #include <Library/ShellLib.h>
12 #include <Protocol/SerialIo.h>
15 Display information about a serial device by it's handle.
17 If HandleValid is FALSE, do all devices.
19 @param[in] HandleIdx The handle index for the device.
20 @param[in] HandleValid TRUE if HandleIdx is valid.
22 @retval SHELL_INVALID_PARAMETER A parameter was invalid.
23 @retval SHELL_SUCCESS The operation was successful.
28 IN BOOLEAN HandleValid
31 EFI_SERIAL_IO_PROTOCOL
*SerialIo
;
38 SHELL_STATUS ShellStatus
;
43 ShellStatus
= SHELL_SUCCESS
;
45 Status
= gBS
->LocateHandleBuffer (ByProtocol
, &gEfiSerialIoProtocolGuid
, NULL
, &NoHandles
, &Handles
);
46 if (EFI_ERROR (Status
)) {
47 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_NO_FOUND
), gShellDebug1HiiHandle
, L
"sermode");
48 return SHELL_INVALID_PARAMETER
;
51 for (Index
= 0; Index
< NoHandles
; Index
++) {
53 if (ConvertHandleIndexToHandle (HandleIdx
) != Handles
[Index
]) {
58 Status
= gBS
->HandleProtocol (Handles
[Index
], &gEfiSerialIoProtocolGuid
, (VOID
**)&SerialIo
);
59 if (!EFI_ERROR (Status
)) {
60 switch (SerialIo
->Mode
->Parity
) {
96 switch (SerialIo
->Mode
->StopBits
) {
99 StopBits
= L
"Default";
112 case OneFiveStopBits
:
119 StopBits
= L
"Unknown";
126 STRING_TOKEN (STR_SERMODE_DISPLAY
),
127 gShellDebug1HiiHandle
,
128 ConvertHandleToHandleIndex (Handles
[Index
]),
130 SerialIo
->Mode
->BaudRate
,
132 SerialIo
->Mode
->DataBits
,
136 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_NO_FOUND
), gShellDebug1HiiHandle
, L
"sermode");
137 ShellStatus
= SHELL_NOT_FOUND
;
146 if (Index
== NoHandles
) {
147 if (((NoHandles
!= 0) && HandleValid
) || (0 == NoHandles
)) {
148 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_NOT_FOUND
), gShellDebug1HiiHandle
, L
"sermode");
149 ShellStatus
= SHELL_NOT_FOUND
;
157 Function for 'sermode' command.
159 @param[in] ImageHandle Handle to the Image (NULL if Internal).
160 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
164 ShellCommandRunSerMode (
165 IN EFI_HANDLE ImageHandle
,
166 IN EFI_SYSTEM_TABLE
*SystemTable
170 SHELL_STATUS ShellStatus
;
174 EFI_PARITY_TYPE Parity
;
175 EFI_STOP_BITS_TYPE StopBits
;
180 EFI_SERIAL_IO_PROTOCOL
*SerialIo
;
182 CHAR16
*ProblemParam
;
186 ShellStatus
= SHELL_SUCCESS
;
188 Parity
= DefaultParity
;
194 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
195 if (EFI_ERROR (Status
)) {
196 if ((Status
== EFI_VOLUME_CORRUPTED
) && (ProblemParam
!= NULL
)) {
197 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, L
"sermode", ProblemParam
);
198 FreePool (ProblemParam
);
199 ShellStatus
= SHELL_INVALID_PARAMETER
;
204 if ((ShellCommandLineGetCount (Package
) < 6) && (ShellCommandLineGetCount (Package
) > 2)) {
205 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
, L
"sermode");
206 ShellStatus
= SHELL_INVALID_PARAMETER
;
207 } else if (ShellCommandLineGetCount (Package
) > 6) {
208 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
, L
"sermode");
209 ShellStatus
= SHELL_INVALID_PARAMETER
;
211 Temp
= ShellCommandLineGetRawValue (Package
, 1);
213 Status
= ShellConvertStringToUint64 (Temp
, &Intermediate
, TRUE
, FALSE
);
214 HandleIdx
= (UINTN
)Intermediate
;
215 Temp
= ShellCommandLineGetRawValue (Package
, 2);
217 ShellStatus
= DisplaySettings (HandleIdx
, TRUE
);
221 ShellStatus
= DisplaySettings (0, FALSE
);
225 Temp
= ShellCommandLineGetRawValue (Package
, 2);
227 BaudRate
= ShellStrToUintn (Temp
);
233 Temp
= ShellCommandLineGetRawValue (Package
, 3);
234 if ((Temp
== NULL
) || (StrLen (Temp
) > 1)) {
235 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDebug1HiiHandle
, L
"sermode", Temp
);
236 ShellStatus
= SHELL_INVALID_PARAMETER
;
241 Parity
= DefaultParity
;
261 Parity
= SpaceParity
;
264 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDebug1HiiHandle
, L
"sermode", Temp
);
265 ShellStatus
= SHELL_INVALID_PARAMETER
;
270 Temp
= ShellCommandLineGetRawValue (Package
, 4);
272 DataBits
= ShellStrToUintn (Temp
);
275 // make sure this is some number not in the list below.
286 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDebug1HiiHandle
, L
"sermode", Temp
);
287 ShellStatus
= SHELL_INVALID_PARAMETER
;
291 Temp
= ShellCommandLineGetRawValue (Package
, 5);
292 Value
= ShellStrToUintn (Temp
);
295 StopBits
= DefaultStopBits
;
299 StopBits
= OneStopBit
;
303 StopBits
= TwoStopBits
;
307 StopBits
= OneFiveStopBits
;
311 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDebug1HiiHandle
, L
"sermode", Temp
);
312 ShellStatus
= SHELL_INVALID_PARAMETER
;
316 Status
= gBS
->LocateHandleBuffer (ByProtocol
, &gEfiSerialIoProtocolGuid
, NULL
, &NoHandles
, &Handles
);
317 if (EFI_ERROR (Status
)) {
318 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_NO_FOUND
), gShellDebug1HiiHandle
, L
"sermode");
319 ShellStatus
= SHELL_INVALID_PARAMETER
;
323 for (Index
= 0; Index
< NoHandles
; Index
++) {
324 if (ConvertHandleIndexToHandle (HandleIdx
) != Handles
[Index
]) {
328 Status
= gBS
->HandleProtocol (Handles
[Index
], &gEfiSerialIoProtocolGuid
, (VOID
**)&SerialIo
);
329 if (!EFI_ERROR (Status
)) {
330 Status
= SerialIo
->SetAttributes (
333 SerialIo
->Mode
->ReceiveFifoDepth
,
334 SerialIo
->Mode
->Timeout
,
339 if (EFI_ERROR (Status
)) {
340 if (Status
== EFI_INVALID_PARAMETER
) {
341 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_SET_UNSUPPORTED
), gShellDebug1HiiHandle
, L
"sermode", ConvertHandleToHandleIndex (Handles
[Index
]));
342 ShellStatus
= SHELL_UNSUPPORTED
;
343 } else if (Status
== EFI_DEVICE_ERROR
) {
344 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_SET_DEV_ERROR
), gShellDebug1HiiHandle
, L
"sermode", ConvertHandleToHandleIndex (Handles
[Index
]));
345 ShellStatus
= SHELL_ACCESS_DENIED
;
347 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_SET_FAIL
), gShellDebug1HiiHandle
, L
"sermode", ConvertHandleToHandleIndex (Handles
[Index
]));
348 ShellStatus
= SHELL_ACCESS_DENIED
;
351 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_SET_HANDLE
), gShellDebug1HiiHandle
, ConvertHandleToHandleIndex (Handles
[Index
]));
360 if ((ShellStatus
== SHELL_SUCCESS
) && (Index
== NoHandles
)) {
361 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_BAD_HANDLE
), gShellDebug1HiiHandle
, L
"sermode", HandleIdx
);
362 ShellStatus
= SHELL_INVALID_PARAMETER
;
366 if (Package
!= NULL
) {
367 ShellCommandLineFreeVarList (Package
);
370 if (Handles
!= NULL
) {