2 Main file for SerMode shell Debug1 function.
4 Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "UefiShellDebug1CommandsLib.h"
16 #include <Library/ShellLib.h>
17 #include <Protocol/SerialIo.h>
20 Display information about a serial device by it's handle.
22 If HandleValid is FALSE, do all devices.
24 @param[in] HandleIdx The handle index for the device.
25 @param[in] HandleValid TRUE if HandleIdx is valid.
27 @retval SHELL_INVALID_PARAMETER A parameter was invalid.
28 @retval SHELL_SUCCESS The operation was successful.
34 IN BOOLEAN HandleValid
37 EFI_SERIAL_IO_PROTOCOL
*SerialIo
;
44 SHELL_STATUS ShellStatus
;
49 ShellStatus
= SHELL_SUCCESS
;
51 Status
= gBS
->LocateHandleBuffer (ByProtocol
, &gEfiSerialIoProtocolGuid
, NULL
, &NoHandles
, &Handles
);
52 if (EFI_ERROR (Status
)) {
53 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_NO_FOUND
), gShellDebug1HiiHandle
);
54 return SHELL_INVALID_PARAMETER
;
57 for (Index
= 0; Index
< NoHandles
; Index
++) {
59 if (ConvertHandleIndexToHandle(HandleIdx
) != Handles
[Index
]) {
64 Status
= gBS
->HandleProtocol (Handles
[Index
], &gEfiSerialIoProtocolGuid
, (VOID
**)&SerialIo
);
65 if (!EFI_ERROR (Status
)) {
66 switch (SerialIo
->Mode
->Parity
) {
102 switch (SerialIo
->Mode
->StopBits
) {
103 case DefaultStopBits
:
105 StopBits
= L
"Default";
118 case OneFiveStopBits
:
125 StopBits
= L
"Unknown";
131 STRING_TOKEN (STR_SERMODE_DISPLAY
),
132 gShellDebug1HiiHandle
,
133 ConvertHandleToHandleIndex (Handles
[Index
]),
135 SerialIo
->Mode
->BaudRate
,
137 SerialIo
->Mode
->DataBits
,
141 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_NO_FOUND
), gShellDebug1HiiHandle
);
142 ShellStatus
= SHELL_NOT_FOUND
;
151 if (Index
== NoHandles
) {
152 if ((NoHandles
!= 0 && HandleValid
) || 0 == NoHandles
) {
153 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_NOT_FOUND
), gShellDebug1HiiHandle
);
154 ShellStatus
= SHELL_NOT_FOUND
;
162 Function for 'sermode' command.
164 @param[in] ImageHandle Handle to the Image (NULL if Internal).
165 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
169 ShellCommandRunSerMode (
170 IN EFI_HANDLE ImageHandle
,
171 IN EFI_SYSTEM_TABLE
*SystemTable
175 SHELL_STATUS ShellStatus
;
179 EFI_PARITY_TYPE Parity
;
180 EFI_STOP_BITS_TYPE StopBits
;
185 EFI_SERIAL_IO_PROTOCOL
*SerialIo
;
187 CHAR16
*ProblemParam
;
191 ShellStatus
= SHELL_SUCCESS
;
193 Parity
= DefaultParity
;
199 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
200 if (EFI_ERROR(Status
)) {
201 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
202 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, ProblemParam
);
203 FreePool(ProblemParam
);
204 ShellStatus
= SHELL_INVALID_PARAMETER
;
209 if (ShellCommandLineGetCount(Package
) < 6 && ShellCommandLineGetCount(Package
) > 2) {
210 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
);
211 ShellStatus
= SHELL_INVALID_PARAMETER
;
212 } else if (ShellCommandLineGetCount(Package
) > 6) {
213 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
214 ShellStatus
= SHELL_INVALID_PARAMETER
;
216 Temp
= ShellCommandLineGetRawValue(Package
, 1);
218 Status
= ShellConvertStringToUint64(Temp
, &Intermediate
, TRUE
, FALSE
);
219 HandleIdx
= (UINTN
)Intermediate
;
220 Temp
= ShellCommandLineGetRawValue(Package
, 2);
222 ShellStatus
= DisplaySettings (HandleIdx
, TRUE
);
226 ShellStatus
= DisplaySettings (0, FALSE
);
229 Temp
= ShellCommandLineGetRawValue(Package
, 2);
231 BaudRate
= ShellStrToUintn(Temp
);
236 Temp
= ShellCommandLineGetRawValue(Package
, 3);
237 if (Temp
== NULL
|| StrLen(Temp
)>1) {
238 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, Temp
);
239 ShellStatus
= SHELL_INVALID_PARAMETER
;
244 Parity
= DefaultParity
;
264 Parity
= SpaceParity
;
267 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, Temp
);
268 ShellStatus
= SHELL_INVALID_PARAMETER
;
272 Temp
= ShellCommandLineGetRawValue(Package
, 4);
274 DataBits
= ShellStrToUintn(Temp
);
277 // make sure this is some number not in the list below.
287 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, Temp
);
288 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_PROBLEM
), gShellDebug1HiiHandle
, Temp
);
312 ShellStatus
= SHELL_INVALID_PARAMETER
;
315 Status
= gBS
->LocateHandleBuffer(ByProtocol
, &gEfiSerialIoProtocolGuid
, NULL
, &NoHandles
, &Handles
);
316 if (EFI_ERROR (Status
)) {
317 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_NO_FOUND
), gShellDebug1HiiHandle
);
318 ShellStatus
= SHELL_INVALID_PARAMETER
;
322 for (Index
= 0; Index
< NoHandles
; Index
++) {
323 if (ConvertHandleIndexToHandle (HandleIdx
) != Handles
[Index
]) {
327 Status
= gBS
->HandleProtocol (Handles
[Index
], &gEfiSerialIoProtocolGuid
, (VOID
**)&SerialIo
);
328 if (!EFI_ERROR (Status
)) {
329 Status
= SerialIo
->SetAttributes (
332 SerialIo
->Mode
->ReceiveFifoDepth
,
333 SerialIo
->Mode
->Timeout
,
338 if (EFI_ERROR (Status
)) {
339 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_SET_FAIL
), gShellDebug1HiiHandle
, ConvertHandleToHandleIndex(Handles
[Index
]), Status
);
340 ShellStatus
= SHELL_ACCESS_DENIED
;
342 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_SET_HANDLE
), gShellDebug1HiiHandle
, ConvertHandleToHandleIndex(Handles
[Index
]));
350 if (ShellStatus
== SHELL_SUCCESS
&& Index
== NoHandles
) {
351 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_BAD_HANDLE
), gShellDebug1HiiHandle
, HandleIdx
);
352 ShellStatus
= SHELL_INVALID_PARAMETER
;
356 if (Package
!= NULL
) {
357 ShellCommandLineFreeVarList (Package
);
359 if (Handles
!= NULL
) {