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