]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDebug1CommandsLib/SerMode.c
ShellPkg: Clean up source files
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / SerMode.c
CommitLineData
5d73d92f 1/** @file\r
2 Main file for SerMode shell Debug1 function.\r
3\r
c011b6c9 4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
ba0014b9 5 Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>\r
5d73d92f 6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include "UefiShellDebug1CommandsLib.h"\r
17#include <Library/ShellLib.h>\r
18#include <Protocol/SerialIo.h>\r
19\r
3737ac2b 20/**\r
21 Display information about a serial device by it's handle.\r
22\r
23 If HandleValid is FALSE, do all devices.\r
24\r
25 @param[in] HandleIdx The handle index for the device.\r
26 @param[in] HandleValid TRUE if HandleIdx is valid.\r
27\r
28 @retval SHELL_INVALID_PARAMETER A parameter was invalid.\r
29 @retval SHELL_SUCCESS The operation was successful.\r
30**/\r
5d73d92f 31SHELL_STATUS\r
3737ac2b 32DisplaySettings (\r
5d73d92f 33 IN UINTN HandleIdx,\r
34 IN BOOLEAN HandleValid\r
35 )\r
36{\r
37 EFI_SERIAL_IO_PROTOCOL *SerialIo;\r
38 UINTN NoHandles;\r
39 EFI_HANDLE *Handles;\r
40 EFI_STATUS Status;\r
41 UINTN Index;\r
42 CHAR16 *StopBits;\r
43 CHAR16 Parity;\r
44 SHELL_STATUS ShellStatus;\r
45\r
46 Handles = NULL;\r
47 StopBits = NULL;\r
48\r
49 ShellStatus = SHELL_SUCCESS;\r
50\r
51 Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiSerialIoProtocolGuid, NULL, &NoHandles, &Handles);\r
52 if (EFI_ERROR (Status)) {\r
ba0014b9 53 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle, L"sermode");\r
5d73d92f 54 return SHELL_INVALID_PARAMETER;\r
55 }\r
56\r
57 for (Index = 0; Index < NoHandles; Index++) {\r
58 if (HandleValid) {\r
59 if (ConvertHandleIndexToHandle(HandleIdx) != Handles[Index]) {\r
60 continue;\r
61 }\r
62 }\r
63\r
64 Status = gBS->HandleProtocol (Handles[Index], &gEfiSerialIoProtocolGuid, (VOID**)&SerialIo);\r
65 if (!EFI_ERROR (Status)) {\r
66 switch (SerialIo->Mode->Parity) {\r
67 case DefaultParity:\r
68\r
69 Parity = 'D';\r
70 break;\r
71\r
72 case NoParity:\r
73\r
74 Parity = 'N';\r
75 break;\r
76\r
77 case EvenParity:\r
78\r
79 Parity = 'E';\r
80 break;\r
81\r
82 case OddParity:\r
83\r
84 Parity = 'O';\r
85 break;\r
86\r
87 case MarkParity:\r
88\r
89 Parity = 'M';\r
90 break;\r
91\r
92 case SpaceParity:\r
93\r
94 Parity = 'S';\r
95 break;\r
96\r
97 default:\r
98\r
99 Parity = 'U';\r
100 }\r
101\r
102 switch (SerialIo->Mode->StopBits) {\r
103 case DefaultStopBits:\r
104\r
105 StopBits = L"Default";\r
106 break;\r
107\r
108 case OneStopBit:\r
109\r
110 StopBits = L"1";\r
111 break;\r
112\r
113 case TwoStopBits:\r
114\r
115 StopBits = L"2";\r
116 break;\r
117\r
118 case OneFiveStopBits:\r
119\r
120 StopBits = L"1.5";\r
121 break;\r
122\r
123 default:\r
124\r
125 StopBits = L"Unknown";\r
126 }\r
127 ShellPrintHiiEx(\r
128 -1,\r
129 -1,\r
130 NULL,\r
131 STRING_TOKEN (STR_SERMODE_DISPLAY),\r
132 gShellDebug1HiiHandle,\r
133 ConvertHandleToHandleIndex (Handles[Index]),\r
134 Handles[Index],\r
135 SerialIo->Mode->BaudRate,\r
136 Parity,\r
137 SerialIo->Mode->DataBits,\r
138 StopBits\r
139 );\r
140 } else {\r
ba0014b9 141 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle, L"sermode");\r
5d73d92f 142 ShellStatus = SHELL_NOT_FOUND;\r
143 break;\r
144 }\r
145\r
146 if (HandleValid) {\r
147 break;\r
148 }\r
149 }\r
150\r
151 if (Index == NoHandles) {\r
152 if ((NoHandles != 0 && HandleValid) || 0 == NoHandles) {\r
ba0014b9 153 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NOT_FOUND), gShellDebug1HiiHandle, L"sermode");\r
5d73d92f 154 ShellStatus = SHELL_NOT_FOUND;\r
155 }\r
156 }\r
157\r
158 return ShellStatus;\r
159}\r
160\r
3737ac2b 161/**\r
162 Function for 'sermode' command.\r
163\r
164 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
165 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
166**/\r
5d73d92f 167SHELL_STATUS\r
168EFIAPI\r
169ShellCommandRunSerMode (\r
170 IN EFI_HANDLE ImageHandle,\r
171 IN EFI_SYSTEM_TABLE *SystemTable\r
172 )\r
173{\r
174 EFI_STATUS Status;\r
175 SHELL_STATUS ShellStatus;\r
176 UINTN Index;\r
177 UINTN NoHandles;\r
178 EFI_HANDLE *Handles;\r
179 EFI_PARITY_TYPE Parity;\r
180 EFI_STOP_BITS_TYPE StopBits;\r
181 UINTN HandleIdx;\r
182 UINTN BaudRate;\r
183 UINTN DataBits;\r
184 UINTN Value;\r
185 EFI_SERIAL_IO_PROTOCOL *SerialIo;\r
186 LIST_ENTRY *Package;\r
187 CHAR16 *ProblemParam;\r
188 CONST CHAR16 *Temp;\r
3737ac2b 189 UINT64 Intermediate;\r
5d73d92f 190\r
191 ShellStatus = SHELL_SUCCESS;\r
192 HandleIdx = 0;\r
193 Parity = DefaultParity;\r
194 Handles = NULL;\r
195 NoHandles = 0;\r
196 Index = 0;\r
197 Package = NULL;\r
198\r
199 Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);\r
200 if (EFI_ERROR(Status)) {\r
201 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
ba0014b9 202 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"sermode", ProblemParam);\r
5d73d92f 203 FreePool(ProblemParam);\r
204 ShellStatus = SHELL_INVALID_PARAMETER;\r
205 } else {\r
206 ASSERT(FALSE);\r
207 }\r
208 } else {\r
3737ac2b 209 if (ShellCommandLineGetCount(Package) < 6 && ShellCommandLineGetCount(Package) > 2) {\r
ba0014b9 210 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"sermode");\r
5d73d92f 211 ShellStatus = SHELL_INVALID_PARAMETER;\r
3737ac2b 212 } else if (ShellCommandLineGetCount(Package) > 6) {\r
ba0014b9 213 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"sermode");\r
5d73d92f 214 ShellStatus = SHELL_INVALID_PARAMETER;\r
215 } else {\r
216 Temp = ShellCommandLineGetRawValue(Package, 1);\r
217 if (Temp != NULL) {\r
3737ac2b 218 Status = ShellConvertStringToUint64(Temp, &Intermediate, TRUE, FALSE);\r
219 HandleIdx = (UINTN)Intermediate;\r
5d73d92f 220 Temp = ShellCommandLineGetRawValue(Package, 2);\r
221 if (Temp == NULL) {\r
3737ac2b 222 ShellStatus = DisplaySettings (HandleIdx, TRUE);\r
5d73d92f 223 goto Done;\r
224 }\r
225 } else {\r
3737ac2b 226 ShellStatus = DisplaySettings (0, FALSE);\r
5d73d92f 227 goto Done;\r
228 }\r
229 Temp = ShellCommandLineGetRawValue(Package, 2);\r
230 if (Temp != NULL) {\r
3737ac2b 231 BaudRate = ShellStrToUintn(Temp);\r
5d73d92f 232 } else {\r
233 ASSERT(FALSE);\r
234 BaudRate = 0;\r
235 }\r
236 Temp = ShellCommandLineGetRawValue(Package, 3);\r
237 if (Temp == NULL || StrLen(Temp)>1) {\r
ba0014b9 238 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp);\r
5d73d92f 239 ShellStatus = SHELL_INVALID_PARAMETER;\r
240 } else {\r
241 switch(Temp[0]){\r
242 case 'd':\r
243 case 'D':\r
244 Parity = DefaultParity;\r
245 break;\r
246 case 'n':\r
247 case 'N':\r
248 Parity = NoParity;\r
249 break;\r
250 case 'e':\r
251 case 'E':\r
252 Parity = EvenParity;\r
253 break;\r
254 case 'o':\r
255 case 'O':\r
256 Parity = OddParity;\r
257 break;\r
258 case 'm':\r
259 case 'M':\r
260 Parity = MarkParity;\r
261 break;\r
262 case 's':\r
263 case 'S':\r
264 Parity = SpaceParity;\r
265 break;\r
266 default:\r
ba0014b9 267 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp);\r
5d73d92f 268 ShellStatus = SHELL_INVALID_PARAMETER;\r
269 goto Done;\r
270 }\r
271 }\r
272 Temp = ShellCommandLineGetRawValue(Package, 4);\r
273 if (Temp != NULL) {\r
3737ac2b 274 DataBits = ShellStrToUintn(Temp);\r
5d73d92f 275 } else {\r
276 //\r
277 // make sure this is some number not in the list below.\r
278 //\r
279 DataBits = 0;\r
280 }\r
281 switch (DataBits) {\r
282 case 4:\r
283 case 7:\r
284 case 8:\r
285 break;\r
286 default:\r
ba0014b9 287 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp);\r
5d73d92f 288 ShellStatus = SHELL_INVALID_PARAMETER;\r
289 goto Done;\r
290 }\r
291 Temp = ShellCommandLineGetRawValue(Package, 5);\r
3737ac2b 292 Value = ShellStrToUintn(Temp);\r
5d73d92f 293 switch (Value) {\r
294 case 0:\r
295 StopBits = DefaultStopBits;\r
296 break;\r
297\r
298 case 1:\r
299 StopBits = OneStopBit;\r
300 break;\r
301\r
302 case 2:\r
303 StopBits = TwoStopBits;\r
304 break;\r
305\r
306 case 15:\r
307 StopBits = OneFiveStopBits;\r
308 break;\r
309\r
310 default:\r
ba0014b9 311 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp);\r
5d73d92f 312 ShellStatus = SHELL_INVALID_PARAMETER;\r
313 goto Done;\r
314 }\r
315 Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiSerialIoProtocolGuid, NULL, &NoHandles, &Handles);\r
316 if (EFI_ERROR (Status)) {\r
ba0014b9 317 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle, L"sermode");\r
5d73d92f 318 ShellStatus = SHELL_INVALID_PARAMETER;\r
319 goto Done;\r
320 }\r
321\r
322 for (Index = 0; Index < NoHandles; Index++) {\r
323 if (ConvertHandleIndexToHandle (HandleIdx) != Handles[Index]) {\r
324 continue;\r
325 }\r
326\r
327 Status = gBS->HandleProtocol (Handles[Index], &gEfiSerialIoProtocolGuid, (VOID**)&SerialIo);\r
328 if (!EFI_ERROR (Status)) {\r
329 Status = SerialIo->SetAttributes (\r
330 SerialIo,\r
331 (UINT64) BaudRate,\r
332 SerialIo->Mode->ReceiveFifoDepth,\r
333 SerialIo->Mode->Timeout,\r
334 Parity,\r
335 (UINT8) DataBits,\r
336 StopBits\r
337 );\r
338 if (EFI_ERROR (Status)) {\r
68227ac3 339 if (Status == EFI_INVALID_PARAMETER) {\r
ba0014b9 340 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_UNSUPPORTED), gShellDebug1HiiHandle, L"sermode", ConvertHandleToHandleIndex(Handles[Index]));\r
68227ac3
TS
341 ShellStatus = SHELL_UNSUPPORTED;\r
342 } else if (Status == EFI_DEVICE_ERROR) {\r
ba0014b9 343 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_DEV_ERROR), gShellDebug1HiiHandle, L"sermode", ConvertHandleToHandleIndex(Handles[Index]));\r
68227ac3
TS
344 ShellStatus = SHELL_ACCESS_DENIED;\r
345 } else {\r
ba0014b9 346 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_FAIL), gShellDebug1HiiHandle, L"sermode", ConvertHandleToHandleIndex(Handles[Index]));\r
68227ac3
TS
347 ShellStatus = SHELL_ACCESS_DENIED;\r
348 }\r
5d73d92f 349 } else {\r
350 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_HANDLE), gShellDebug1HiiHandle, ConvertHandleToHandleIndex(Handles[Index]));\r
351 }\r
352 break;\r
353 }\r
354 }\r
355 }\r
356 }\r
357\r
3737ac2b 358 if (ShellStatus == SHELL_SUCCESS && Index == NoHandles) {\r
ba0014b9 359 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_BAD_HANDLE), gShellDebug1HiiHandle, L"sermode", HandleIdx);\r
5d73d92f 360 ShellStatus = SHELL_INVALID_PARAMETER;\r
361 }\r
362\r
363Done:\r
364 if (Package != NULL) {\r
365 ShellCommandLineFreeVarList (Package);\r
366 }\r
367 if (Handles != NULL) {\r
368 FreePool (Handles);\r
369 }\r
370 return ShellStatus;\r
371}\r