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