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