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