2 Main file for SerMode shell Debug1 function.
4 Copyright (c) 2005 - 2010, 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>
23 IN BOOLEAN HandleValid
26 EFI_SERIAL_IO_PROTOCOL
*SerialIo
;
33 SHELL_STATUS ShellStatus
;
38 ShellStatus
= SHELL_SUCCESS
;
40 Status
= gBS
->LocateHandleBuffer (ByProtocol
, &gEfiSerialIoProtocolGuid
, NULL
, &NoHandles
, &Handles
);
41 if (EFI_ERROR (Status
)) {
42 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_NO_FOUND
), gShellDebug1HiiHandle
);
43 return SHELL_INVALID_PARAMETER
;
46 for (Index
= 0; Index
< NoHandles
; Index
++) {
48 if (ConvertHandleIndexToHandle(HandleIdx
) != Handles
[Index
]) {
53 Status
= gBS
->HandleProtocol (Handles
[Index
], &gEfiSerialIoProtocolGuid
, (VOID
**)&SerialIo
);
54 if (!EFI_ERROR (Status
)) {
55 switch (SerialIo
->Mode
->Parity
) {
91 switch (SerialIo
->Mode
->StopBits
) {
94 StopBits
= L
"Default";
107 case OneFiveStopBits
:
114 StopBits
= L
"Unknown";
120 STRING_TOKEN (STR_SERMODE_DISPLAY
),
121 gShellDebug1HiiHandle
,
122 ConvertHandleToHandleIndex (Handles
[Index
]),
124 SerialIo
->Mode
->BaudRate
,
126 SerialIo
->Mode
->DataBits
,
130 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_NO_FOUND
), gShellDebug1HiiHandle
);
131 ShellStatus
= SHELL_NOT_FOUND
;
140 if (Index
== NoHandles
) {
141 if ((NoHandles
!= 0 && HandleValid
) || 0 == NoHandles
) {
142 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_NOT_FOUND
), gShellDebug1HiiHandle
);
143 ShellStatus
= SHELL_NOT_FOUND
;
152 ShellCommandRunSerMode (
153 IN EFI_HANDLE ImageHandle
,
154 IN EFI_SYSTEM_TABLE
*SystemTable
158 SHELL_STATUS ShellStatus
;
162 EFI_PARITY_TYPE Parity
;
163 EFI_STOP_BITS_TYPE StopBits
;
168 EFI_SERIAL_IO_PROTOCOL
*SerialIo
;
170 CHAR16
*ProblemParam
;
173 ShellStatus
= SHELL_SUCCESS
;
175 Parity
= DefaultParity
;
181 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
182 if (EFI_ERROR(Status
)) {
183 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
184 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, ProblemParam
);
185 FreePool(ProblemParam
);
186 ShellStatus
= SHELL_INVALID_PARAMETER
;
191 if (ShellCommandLineGetCount(Package
) < 5 && ShellCommandLineGetCount(Package
) > 1) {
192 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
);
193 ShellStatus
= SHELL_INVALID_PARAMETER
;
194 } else if (ShellCommandLineGetCount(Package
) > 5) {
195 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
196 ShellStatus
= SHELL_INVALID_PARAMETER
;
198 Temp
= ShellCommandLineGetRawValue(Package
, 1);
200 HandleIdx
= StrHexToUintn(Temp
);
201 Temp
= ShellCommandLineGetRawValue(Package
, 2);
203 ShellStatus
= iDisplaySettings (HandleIdx
, TRUE
);
207 ShellStatus
= iDisplaySettings (0, FALSE
);
210 Temp
= ShellCommandLineGetRawValue(Package
, 2);
212 BaudRate
= StrHexToUintn(Temp
);
217 Temp
= ShellCommandLineGetRawValue(Package
, 3);
218 if (Temp
== NULL
|| StrLen(Temp
)>1) {
219 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, Temp
);
220 ShellStatus
= SHELL_INVALID_PARAMETER
;
225 Parity
= DefaultParity
;
245 Parity
= SpaceParity
;
248 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, Temp
);
249 ShellStatus
= SHELL_INVALID_PARAMETER
;
253 Temp
= ShellCommandLineGetRawValue(Package
, 4);
255 DataBits
= StrHexToUintn(Temp
);
258 // make sure this is some number not in the list below.
268 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, Temp
);
269 ShellStatus
= SHELL_INVALID_PARAMETER
;
272 Temp
= ShellCommandLineGetRawValue(Package
, 5);
273 Value
= StrHexToUintn(Temp
);
276 StopBits
= DefaultStopBits
;
280 StopBits
= OneStopBit
;
284 StopBits
= TwoStopBits
;
288 StopBits
= OneFiveStopBits
;
292 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, Temp
);
293 ShellStatus
= SHELL_INVALID_PARAMETER
;
296 Status
= gBS
->LocateHandleBuffer(ByProtocol
, &gEfiSerialIoProtocolGuid
, NULL
, &NoHandles
, &Handles
);
297 if (EFI_ERROR (Status
)) {
298 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_NO_FOUND
), gShellDebug1HiiHandle
);
299 ShellStatus
= SHELL_INVALID_PARAMETER
;
303 for (Index
= 0; Index
< NoHandles
; Index
++) {
304 if (ConvertHandleIndexToHandle (HandleIdx
) != Handles
[Index
]) {
308 Status
= gBS
->HandleProtocol (Handles
[Index
], &gEfiSerialIoProtocolGuid
, (VOID
**)&SerialIo
);
309 if (!EFI_ERROR (Status
)) {
310 Status
= SerialIo
->SetAttributes (
313 SerialIo
->Mode
->ReceiveFifoDepth
,
314 SerialIo
->Mode
->Timeout
,
319 if (EFI_ERROR (Status
)) {
320 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_SET_FAIL
), gShellDebug1HiiHandle
, ConvertHandleToHandleIndex(Handles
[Index
]), Status
);
321 ShellStatus
= SHELL_ACCESS_DENIED
;
323 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_SET_HANDLE
), gShellDebug1HiiHandle
, ConvertHandleToHandleIndex(Handles
[Index
]));
331 if (Index
== NoHandles
) {
332 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_SERMODE_BAD_HANDLE
), gShellDebug1HiiHandle
, HandleIdx
);
333 ShellStatus
= SHELL_INVALID_PARAMETER
;
337 if (Package
!= NULL
) {
338 ShellCommandLineFreeVarList (Package
);
340 if (Handles
!= NULL
) {