]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Library/UefiShellDebug1CommandsLib/SerMode.c
d8856770657e24b85a25458502fe94d5e976e573
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / SerMode.c
1 /** @file
2 Main file for SerMode shell Debug1 function.
3
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
10
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.
13
14 **/
15
16 #include "UefiShellDebug1CommandsLib.h"
17 #include <Library/ShellLib.h>
18 #include <Protocol/SerialIo.h>
19
20 /**
21 Display information about a serial device by it's handle.
22
23 If HandleValid is FALSE, do all devices.
24
25 @param[in] HandleIdx The handle index for the device.
26 @param[in] HandleValid TRUE if HandleIdx is valid.
27
28 @retval SHELL_INVALID_PARAMETER A parameter was invalid.
29 @retval SHELL_SUCCESS The operation was successful.
30 **/
31 SHELL_STATUS
32 EFIAPI
33 DisplaySettings (
34 IN UINTN HandleIdx,
35 IN BOOLEAN HandleValid
36 )
37 {
38 EFI_SERIAL_IO_PROTOCOL *SerialIo;
39 UINTN NoHandles;
40 EFI_HANDLE *Handles;
41 EFI_STATUS Status;
42 UINTN Index;
43 CHAR16 *StopBits;
44 CHAR16 Parity;
45 SHELL_STATUS ShellStatus;
46
47 Handles = NULL;
48 StopBits = NULL;
49
50 ShellStatus = SHELL_SUCCESS;
51
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;
56 }
57
58 for (Index = 0; Index < NoHandles; Index++) {
59 if (HandleValid) {
60 if (ConvertHandleIndexToHandle(HandleIdx) != Handles[Index]) {
61 continue;
62 }
63 }
64
65 Status = gBS->HandleProtocol (Handles[Index], &gEfiSerialIoProtocolGuid, (VOID**)&SerialIo);
66 if (!EFI_ERROR (Status)) {
67 switch (SerialIo->Mode->Parity) {
68 case DefaultParity:
69
70 Parity = 'D';
71 break;
72
73 case NoParity:
74
75 Parity = 'N';
76 break;
77
78 case EvenParity:
79
80 Parity = 'E';
81 break;
82
83 case OddParity:
84
85 Parity = 'O';
86 break;
87
88 case MarkParity:
89
90 Parity = 'M';
91 break;
92
93 case SpaceParity:
94
95 Parity = 'S';
96 break;
97
98 default:
99
100 Parity = 'U';
101 }
102
103 switch (SerialIo->Mode->StopBits) {
104 case DefaultStopBits:
105
106 StopBits = L"Default";
107 break;
108
109 case OneStopBit:
110
111 StopBits = L"1";
112 break;
113
114 case TwoStopBits:
115
116 StopBits = L"2";
117 break;
118
119 case OneFiveStopBits:
120
121 StopBits = L"1.5";
122 break;
123
124 default:
125
126 StopBits = L"Unknown";
127 }
128 ShellPrintHiiEx(
129 -1,
130 -1,
131 NULL,
132 STRING_TOKEN (STR_SERMODE_DISPLAY),
133 gShellDebug1HiiHandle,
134 ConvertHandleToHandleIndex (Handles[Index]),
135 Handles[Index],
136 SerialIo->Mode->BaudRate,
137 Parity,
138 SerialIo->Mode->DataBits,
139 StopBits
140 );
141 } else {
142 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle, L"sermode");
143 ShellStatus = SHELL_NOT_FOUND;
144 break;
145 }
146
147 if (HandleValid) {
148 break;
149 }
150 }
151
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;
156 }
157 }
158
159 return ShellStatus;
160 }
161
162 /**
163 Function for 'sermode' command.
164
165 @param[in] ImageHandle Handle to the Image (NULL if Internal).
166 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
167 **/
168 SHELL_STATUS
169 EFIAPI
170 ShellCommandRunSerMode (
171 IN EFI_HANDLE ImageHandle,
172 IN EFI_SYSTEM_TABLE *SystemTable
173 )
174 {
175 EFI_STATUS Status;
176 SHELL_STATUS ShellStatus;
177 UINTN Index;
178 UINTN NoHandles;
179 EFI_HANDLE *Handles;
180 EFI_PARITY_TYPE Parity;
181 EFI_STOP_BITS_TYPE StopBits;
182 UINTN HandleIdx;
183 UINTN BaudRate;
184 UINTN DataBits;
185 UINTN Value;
186 EFI_SERIAL_IO_PROTOCOL *SerialIo;
187 LIST_ENTRY *Package;
188 CHAR16 *ProblemParam;
189 CONST CHAR16 *Temp;
190 UINT64 Intermediate;
191
192 ShellStatus = SHELL_SUCCESS;
193 HandleIdx = 0;
194 Parity = DefaultParity;
195 Handles = NULL;
196 NoHandles = 0;
197 Index = 0;
198 Package = NULL;
199
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;
206 } else {
207 ASSERT(FALSE);
208 }
209 } else {
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;
216 } else {
217 Temp = ShellCommandLineGetRawValue(Package, 1);
218 if (Temp != NULL) {
219 Status = ShellConvertStringToUint64(Temp, &Intermediate, TRUE, FALSE);
220 HandleIdx = (UINTN)Intermediate;
221 Temp = ShellCommandLineGetRawValue(Package, 2);
222 if (Temp == NULL) {
223 ShellStatus = DisplaySettings (HandleIdx, TRUE);
224 goto Done;
225 }
226 } else {
227 ShellStatus = DisplaySettings (0, FALSE);
228 goto Done;
229 }
230 Temp = ShellCommandLineGetRawValue(Package, 2);
231 if (Temp != NULL) {
232 BaudRate = ShellStrToUintn(Temp);
233 } else {
234 ASSERT(FALSE);
235 BaudRate = 0;
236 }
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;
241 } else {
242 switch(Temp[0]){
243 case 'd':
244 case 'D':
245 Parity = DefaultParity;
246 break;
247 case 'n':
248 case 'N':
249 Parity = NoParity;
250 break;
251 case 'e':
252 case 'E':
253 Parity = EvenParity;
254 break;
255 case 'o':
256 case 'O':
257 Parity = OddParity;
258 break;
259 case 'm':
260 case 'M':
261 Parity = MarkParity;
262 break;
263 case 's':
264 case 'S':
265 Parity = SpaceParity;
266 break;
267 default:
268 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp);
269 ShellStatus = SHELL_INVALID_PARAMETER;
270 goto Done;
271 }
272 }
273 Temp = ShellCommandLineGetRawValue(Package, 4);
274 if (Temp != NULL) {
275 DataBits = ShellStrToUintn(Temp);
276 } else {
277 //
278 // make sure this is some number not in the list below.
279 //
280 DataBits = 0;
281 }
282 switch (DataBits) {
283 case 4:
284 case 7:
285 case 8:
286 break;
287 default:
288 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp);
289 ShellStatus = SHELL_INVALID_PARAMETER;
290 goto Done;
291 }
292 Temp = ShellCommandLineGetRawValue(Package, 5);
293 Value = ShellStrToUintn(Temp);
294 switch (Value) {
295 case 0:
296 StopBits = DefaultStopBits;
297 break;
298
299 case 1:
300 StopBits = OneStopBit;
301 break;
302
303 case 2:
304 StopBits = TwoStopBits;
305 break;
306
307 case 15:
308 StopBits = OneFiveStopBits;
309 break;
310
311 default:
312 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp);
313 ShellStatus = SHELL_INVALID_PARAMETER;
314 goto Done;
315 }
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;
320 goto Done;
321 }
322
323 for (Index = 0; Index < NoHandles; Index++) {
324 if (ConvertHandleIndexToHandle (HandleIdx) != Handles[Index]) {
325 continue;
326 }
327
328 Status = gBS->HandleProtocol (Handles[Index], &gEfiSerialIoProtocolGuid, (VOID**)&SerialIo);
329 if (!EFI_ERROR (Status)) {
330 Status = SerialIo->SetAttributes (
331 SerialIo,
332 (UINT64) BaudRate,
333 SerialIo->Mode->ReceiveFifoDepth,
334 SerialIo->Mode->Timeout,
335 Parity,
336 (UINT8) DataBits,
337 StopBits
338 );
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;
346 } else {
347 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_FAIL), gShellDebug1HiiHandle, L"sermode", ConvertHandleToHandleIndex(Handles[Index]));
348 ShellStatus = SHELL_ACCESS_DENIED;
349 }
350 } else {
351 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_HANDLE), gShellDebug1HiiHandle, ConvertHandleToHandleIndex(Handles[Index]));
352 }
353 break;
354 }
355 }
356 }
357 }
358
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;
362 }
363
364 Done:
365 if (Package != NULL) {
366 ShellCommandLineFreeVarList (Package);
367 }
368 if (Handles != NULL) {
369 FreePool (Handles);
370 }
371 return ShellStatus;
372 }