2 Main file for SerMode shell Debug1 function.
4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
5 Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include "UefiShellDebug1CommandsLib.h"
17 #include <Library/ShellLib.h>
18 #include <Protocol/SerialIo.h>
21 Display information about a serial device by it's handle.
23 If HandleValid is FALSE, do all devices.
25 @param[in] HandleIdx The handle index for the device.
26 @param[in] HandleValid TRUE if HandleIdx is valid.
28 @retval SHELL_INVALID_PARAMETER A parameter was invalid.
29 @retval SHELL_SUCCESS The operation was successful.
35 IN BOOLEAN HandleValid
38 EFI_SERIAL_IO_PROTOCOL
*SerialIo
;
45 SHELL_STATUS ShellStatus
;
50 ShellStatus
= SHELL_SUCCESS
;
52 Status
= gBS
->LocateHandleBuffer (ByProtocol
, &gEfiSerialIoProtocolGuid
, NULL
, &NoHandles
, &Handles
);
53 if (EFI_ERROR (Status
)) {
54 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_NO_FOUND
), gShellDebug1HiiHandle
, L
"sermode");
55 return SHELL_INVALID_PARAMETER
;
58 for (Index
= 0; Index
< NoHandles
; Index
++) {
60 if (ConvertHandleIndexToHandle(HandleIdx
) != Handles
[Index
]) {
65 Status
= gBS
->HandleProtocol (Handles
[Index
], &gEfiSerialIoProtocolGuid
, (VOID
**)&SerialIo
);
66 if (!EFI_ERROR (Status
)) {
67 switch (SerialIo
->Mode
->Parity
) {
103 switch (SerialIo
->Mode
->StopBits
) {
104 case DefaultStopBits
:
106 StopBits
= L
"Default";
119 case OneFiveStopBits
:
126 StopBits
= L
"Unknown";
132 STRING_TOKEN (STR_SERMODE_DISPLAY
),
133 gShellDebug1HiiHandle
,
134 ConvertHandleToHandleIndex (Handles
[Index
]),
136 SerialIo
->Mode
->BaudRate
,
138 SerialIo
->Mode
->DataBits
,
142 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_NO_FOUND
), gShellDebug1HiiHandle
, L
"sermode");
143 ShellStatus
= SHELL_NOT_FOUND
;
152 if (Index
== NoHandles
) {
153 if ((NoHandles
!= 0 && HandleValid
) || 0 == NoHandles
) {
154 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_NOT_FOUND
), gShellDebug1HiiHandle
, L
"sermode");
155 ShellStatus
= SHELL_NOT_FOUND
;
163 Function for 'sermode' command.
165 @param[in] ImageHandle Handle to the Image (NULL if Internal).
166 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
170 ShellCommandRunSerMode (
171 IN EFI_HANDLE ImageHandle
,
172 IN EFI_SYSTEM_TABLE
*SystemTable
176 SHELL_STATUS ShellStatus
;
180 EFI_PARITY_TYPE Parity
;
181 EFI_STOP_BITS_TYPE StopBits
;
186 EFI_SERIAL_IO_PROTOCOL
*SerialIo
;
188 CHAR16
*ProblemParam
;
192 ShellStatus
= SHELL_SUCCESS
;
194 Parity
= DefaultParity
;
200 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
201 if (EFI_ERROR(Status
)) {
202 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
203 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, L
"sermode", ProblemParam
);
204 FreePool(ProblemParam
);
205 ShellStatus
= SHELL_INVALID_PARAMETER
;
210 if (ShellCommandLineGetCount(Package
) < 6 && ShellCommandLineGetCount(Package
) > 2) {
211 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
, L
"sermode");
212 ShellStatus
= SHELL_INVALID_PARAMETER
;
213 } else if (ShellCommandLineGetCount(Package
) > 6) {
214 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
, L
"sermode");
215 ShellStatus
= SHELL_INVALID_PARAMETER
;
217 Temp
= ShellCommandLineGetRawValue(Package
, 1);
219 Status
= ShellConvertStringToUint64(Temp
, &Intermediate
, TRUE
, FALSE
);
220 HandleIdx
= (UINTN
)Intermediate
;
221 Temp
= ShellCommandLineGetRawValue(Package
, 2);
223 ShellStatus
= DisplaySettings (HandleIdx
, TRUE
);
227 ShellStatus
= DisplaySettings (0, FALSE
);
230 Temp
= ShellCommandLineGetRawValue(Package
, 2);
232 BaudRate
= ShellStrToUintn(Temp
);
237 Temp
= ShellCommandLineGetRawValue(Package
, 3);
238 if (Temp
== NULL
|| StrLen(Temp
)>1) {
239 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDebug1HiiHandle
, L
"sermode", Temp
);
240 ShellStatus
= SHELL_INVALID_PARAMETER
;
245 Parity
= DefaultParity
;
265 Parity
= SpaceParity
;
268 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDebug1HiiHandle
, L
"sermode", Temp
);
269 ShellStatus
= SHELL_INVALID_PARAMETER
;
273 Temp
= ShellCommandLineGetRawValue(Package
, 4);
275 DataBits
= ShellStrToUintn(Temp
);
278 // make sure this is some number not in the list below.
288 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDebug1HiiHandle
, L
"sermode", Temp
);
289 ShellStatus
= SHELL_INVALID_PARAMETER
;
292 Temp
= ShellCommandLineGetRawValue(Package
, 5);
293 Value
= ShellStrToUintn(Temp
);
296 StopBits
= DefaultStopBits
;
300 StopBits
= OneStopBit
;
304 StopBits
= TwoStopBits
;
308 StopBits
= OneFiveStopBits
;
312 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDebug1HiiHandle
, L
"sermode", Temp
);
313 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
]));
359 if (ShellStatus
== SHELL_SUCCESS
&& Index
== NoHandles
) {
360 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_BAD_HANDLE
), gShellDebug1HiiHandle
, L
"sermode", HandleIdx
);
361 ShellStatus
= SHELL_INVALID_PARAMETER
;
365 if (Package
!= NULL
) {
366 ShellCommandLineFreeVarList (Package
);
368 if (Handles
!= NULL
) {