]> git.proxmox.com Git - mirror_edk2.git/blame - EmbeddedPkg/SimpleTextInOutSerial/SimpleTextInOut.c
EmbeddedPkg: Fix various typos
[mirror_edk2.git] / EmbeddedPkg / SimpleTextInOutSerial / SimpleTextInOut.c
CommitLineData
2ef2b01e 1/** @file\r
3402aac7 2 Simple Console that sits on a SerialLib.\r
2ef2b01e 3\r
60274cca 4 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
3402aac7 5\r
878b807a 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
2ef2b01e
A
7\r
8**/\r
9\r
3402aac7 10/*\r
2ef2b01e
A
11 Symbols used in table below\r
12===========================\r
13 ESC = 0x1B\r
14 CSI = 0x9B\r
15 DEL = 0x7f\r
16 ^ = CTRL\r
17\r
18+=========+======+===========+==========+==========+\r
19| | EFI | UEFI 2.0 | | |\r
20| | Scan | | VT100+ | |\r
21| KEY | Code | PC ANSI | VTUTF8 | VT100 |\r
22+=========+======+===========+==========+==========+\r
23| NULL | 0x00 | | | |\r
24| UP | 0x01 | ESC [ A | ESC [ A | ESC [ A |\r
25| DOWN | 0x02 | ESC [ B | ESC [ B | ESC [ B |\r
26| RIGHT | 0x03 | ESC [ C | ESC [ C | ESC [ C |\r
27| LEFT | 0x04 | ESC [ D | ESC [ D | ESC [ D |\r
28| HOME | 0x05 | ESC [ H | ESC h | ESC [ H |\r
29| END | 0x06 | ESC [ F | ESC k | ESC [ K |\r
30| INSERT | 0x07 | ESC [ @ | ESC + | ESC [ @ |\r
31| | | ESC [ L | | ESC [ L |\r
32| DELETE | 0x08 | ESC [ X | ESC - | ESC [ P |\r
33| PG UP | 0x09 | ESC [ I | ESC ? | ESC [ V |\r
34| | | | | ESC [ ? |\r
35| PG DOWN | 0x0A | ESC [ G | ESC / | ESC [ U |\r
36| | | | | ESC [ / |\r
37| F1 | 0x0B | ESC [ M | ESC 1 | ESC O P |\r
38| F2 | 0x0C | ESC [ N | ESC 2 | ESC O Q |\r
39| F3 | 0x0D | ESC [ O | ESC 3 | ESC O w |\r
40| F4 | 0x0E | ESC [ P | ESC 4 | ESC O x |\r
41| F5 | 0x0F | ESC [ Q | ESC 5 | ESC O t |\r
42| F6 | 0x10 | ESC [ R | ESC 6 | ESC O u |\r
43| F7 | 0x11 | ESC [ S | ESC 7 | ESC O q |\r
44| F8 | 0x12 | ESC [ T | ESC 8 | ESC O r |\r
45| F9 | 0x13 | ESC [ U | ESC 9 | ESC O p |\r
46| F10 | 0x14 | ESC [ V | ESC 0 | ESC O M |\r
47| Escape | 0x17 | ESC | ESC | ESC |\r
48| F11 | 0x15 | | ESC ! | |\r
49| F12 | 0x16 | | ESC @ | |\r
50+=========+======+===========+==========+==========+\r
51\r
52*/\r
53\r
54#include <PiDxe.h>\r
55#include <Library/UefiLib.h>\r
56#include <Library/UefiBootServicesTableLib.h>\r
57#include <Library/BaseLib.h>\r
58#include <Library/MemoryAllocationLib.h>\r
59#include <Library/DebugLib.h>\r
60#include <Library/SerialPortLib.h>\r
026e30c4 61#include <Library/PcdLib.h>\r
2ef2b01e
A
62\r
63#include <Protocol/SerialIo.h>\r
64#include <Protocol/SimpleTextIn.h>\r
65#include <Protocol/SimpleTextOut.h>\r
026e30c4 66#include <Protocol/DevicePath.h>\r
2ef2b01e
A
67\r
68\r
69#define MODE0_COLUMN_COUNT 80\r
70#define MODE0_ROW_COUNT 25\r
71\r
72\r
73EFI_STATUS\r
74EFIAPI\r
75TextInReset(\r
76 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,\r
77 IN BOOLEAN ExtendedVerification\r
78 );\r
79\r
80\r
81EFI_STATUS\r
82EFIAPI\r
83ReadKeyStroke(\r
84 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,\r
85 OUT EFI_INPUT_KEY *Key\r
86 );\r
87\r
88\r
89EFI_STATUS\r
90EFIAPI\r
91TextOutReset(\r
92 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
93 IN BOOLEAN ExtendedVerification\r
94 );\r
95\r
96CHAR8 *\r
97EFIAPI\r
98SafeUnicodeStrToAsciiStr (\r
99 IN CONST CHAR16 *Source,\r
100 OUT CHAR8 *Destination\r
101 );\r
102\r
103EFI_STATUS\r
104EFIAPI\r
105OutputString (\r
106 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
107 IN CHAR16 *String\r
108 );\r
109\r
110\r
111EFI_STATUS\r
112EFIAPI\r
113TestString (\r
114 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
115 IN CHAR16 *String\r
116 );\r
117\r
118\r
119EFI_STATUS\r
120EFIAPI\r
121QueryMode (\r
122 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
123 IN UINTN ModeNumber,\r
124 OUT UINTN *Columns,\r
125 OUT UINTN *Rows\r
126 );\r
127\r
128\r
129EFI_STATUS\r
130EFIAPI\r
131SetMode(\r
132 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
133 IN UINTN ModeNumber\r
134 );\r
135\r
136\r
137EFI_STATUS\r
138EFIAPI\r
139SetAttribute(\r
140 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
141 IN UINTN Attribute\r
142 );\r
143\r
144\r
145EFI_STATUS\r
146EFIAPI\r
147ClearScreen (\r
148 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This\r
149 );\r
150\r
151\r
152EFI_STATUS\r
153EFIAPI\r
154SetCursorPosition (\r
155 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
156 IN UINTN Column,\r
157 IN UINTN Row\r
158 );\r
159\r
160\r
161EFI_STATUS\r
162EFIAPI\r
163EnableCursor (\r
164 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
165 IN BOOLEAN Enable\r
166 );\r
167\r
168\r
169 EFI_SIMPLE_TEXT_INPUT_PROTOCOL mSimpleTextIn = {\r
170 TextInReset,\r
171 ReadKeyStroke,\r
172 NULL\r
173};\r
174\r
175 EFI_SIMPLE_TEXT_OUTPUT_MODE mSimpleTextOutMode = {\r
176 1,\r
177 0,\r
178 EFI_TEXT_ATTR( EFI_LIGHTGRAY, EFI_BLACK ),\r
179 0,\r
180 0,\r
181 TRUE\r
182};\r
183\r
184EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL mSimpleTextOut = {\r
185 TextOutReset,\r
186 OutputString,\r
187 TestString,\r
188 QueryMode,\r
189 SetMode,\r
190 SetAttribute,\r
191 ClearScreen,\r
192 SetCursorPosition,\r
193 EnableCursor,\r
194 &mSimpleTextOutMode\r
195};\r
196\r
026e30c4 197EFI_HANDLE mInstallHandle = NULL;\r
198\r
199typedef struct {\r
200 VENDOR_DEVICE_PATH Guid;\r
201 UART_DEVICE_PATH Uart;\r
202 EFI_DEVICE_PATH_PROTOCOL End;\r
203} SIMPLE_TEXT_OUT_DEVICE_PATH;\r
204\r
205SIMPLE_TEXT_OUT_DEVICE_PATH mDevicePath = {\r
206 {\r
b0fdce95 207 { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH), 0} },\r
026e30c4 208 EFI_CALLER_ID_GUID\r
209 },\r
210 {\r
b0fdce95 211 { MESSAGING_DEVICE_PATH, MSG_UART_DP, { sizeof (UART_DEVICE_PATH), 0} },\r
026e30c4 212 0, // Reserved\r
213 FixedPcdGet64 (PcdUartDefaultBaudRate), // BaudRate\r
214 FixedPcdGet8 (PcdUartDefaultDataBits), // DataBits\r
215 FixedPcdGet8 (PcdUartDefaultParity), // Parity (N)\r
216 FixedPcdGet8 (PcdUartDefaultStopBits) // StopBits\r
217 },\r
b0fdce95 218 { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0} }\r
026e30c4 219};\r
220\r
2ef2b01e
A
221\r
222\r
223\r
224BOOLEAN\r
225TextOutIsValidAscii (\r
226 IN CHAR16 Ascii\r
227 )\r
228{\r
229 //\r
230 // valid ASCII code lies in the extent of 0x20 - 0x7F\r
231 //\r
232 if ((Ascii >= 0x20) && (Ascii <= 0x7F)) {\r
233 return TRUE;\r
234 }\r
235\r
236 return FALSE;\r
237}\r
238\r
239\r
240BOOLEAN\r
241TextOutIsValidEfiCntlChar (\r
242 IN CHAR16 Char\r
243 )\r
244{\r
245 //\r
246 // only support four control characters.\r
247 //\r
248 if (Char == CHAR_NULL ||\r
249 Char == CHAR_BACKSPACE ||\r
250 Char == CHAR_LINEFEED ||\r
251 Char == CHAR_CARRIAGE_RETURN ||\r
252 Char == CHAR_TAB ) {\r
253 return TRUE;\r
254 }\r
255\r
256 return FALSE;\r
257}\r
258\r
259\r
260VOID\r
261EFIAPI\r
262WaitForKeyEvent (\r
263 IN EFI_EVENT Event,\r
264 IN VOID *Context\r
265 )\r
266{\r
267 if (SerialPortPoll ()) {\r
268 gBS->SignalEvent (Event);\r
269 }\r
270}\r
271\r
272\r
273EFI_STATUS\r
274EFIAPI\r
275TextInReset (\r
276 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,\r
277 IN BOOLEAN ExtendedVerification\r
278 )\r
279{\r
280 return EFI_SUCCESS;\r
281}\r
282\r
283\r
284EFI_STATUS\r
285EFIAPI\r
286ReadKeyStroke (\r
287 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,\r
288 OUT EFI_INPUT_KEY *Key\r
289 )\r
290{\r
291 CHAR8 Char;\r
3402aac7 292\r
026e30c4 293 if (!SerialPortPoll ()) {\r
294 return EFI_NOT_READY;\r
295 }\r
3402aac7 296\r
2ef2b01e 297 SerialPortRead ((UINT8 *)&Char, 1);\r
3402aac7 298\r
2ef2b01e 299 //\r
c6a72cd7 300 // Check for ESC sequence. This code is not technically correct VT100 code.\r
2ef2b01e 301 // An illegal ESC sequence represents an ESC and the characters that follow.\r
3402aac7 302 // This code will eat one or two chars after an escape. This is done to\r
2ef2b01e
A
303 // prevent some complex FIFOing of the data. It is good enough to get\r
304 // the arrow and delete keys working\r
305 //\r
306 Key->UnicodeChar = 0;\r
307 Key->ScanCode = SCAN_NULL;\r
308 if (Char == 0x1b) {\r
309 SerialPortRead ((UINT8 *)&Char, 1);\r
310 if (Char == '[') {\r
311 SerialPortRead ((UINT8 *)&Char, 1);\r
312 switch (Char) {\r
313 case 'A':\r
314 Key->ScanCode = SCAN_UP;\r
315 break;\r
316 case 'B':\r
317 Key->ScanCode = SCAN_DOWN;\r
318 break;\r
319 case 'C':\r
320 Key->ScanCode = SCAN_RIGHT;\r
321 break;\r
322 case 'D':\r
323 Key->ScanCode = SCAN_LEFT;\r
324 break;\r
325 case 'H':\r
326 Key->ScanCode = SCAN_HOME;\r
327 break;\r
328 case 'K':\r
3402aac7 329 case 'F': // PC ANSI\r
2ef2b01e
A
330 Key->ScanCode = SCAN_END;\r
331 break;\r
332 case '@':\r
333 case 'L':\r
334 Key->ScanCode = SCAN_INSERT;\r
335 break;\r
336 case 'P':\r
3402aac7 337 case 'X': // PC ANSI\r
2ef2b01e
A
338 Key->ScanCode = SCAN_DELETE;\r
339 break;\r
340 case 'U':\r
341 case '/':\r
342 case 'G': // PC ANSI\r
343 Key->ScanCode = SCAN_PAGE_DOWN;\r
344 break;\r
345 case 'V':\r
346 case '?':\r
347 case 'I': // PC ANSI\r
348 Key->ScanCode = SCAN_PAGE_UP;\r
349 break;\r
350\r
351 // PCANSI that does not conflict with VT100\r
352 case 'M':\r
353 Key->ScanCode = SCAN_F1;\r
354 break;\r
355 case 'N':\r
356 Key->ScanCode = SCAN_F2;\r
357 break;\r
358 case 'O':\r
359 Key->ScanCode = SCAN_F3;\r
360 break;\r
361 case 'Q':\r
362 Key->ScanCode = SCAN_F5;\r
363 break;\r
364 case 'R':\r
365 Key->ScanCode = SCAN_F6;\r
366 break;\r
367 case 'S':\r
368 Key->ScanCode = SCAN_F7;\r
369 break;\r
370 case 'T':\r
371 Key->ScanCode = SCAN_F8;\r
372 break;\r
373\r
374 default:\r
375 Key->UnicodeChar = Char;\r
376 break;\r
377 }\r
378 } else if (Char == '0') {\r
379 SerialPortRead ((UINT8 *)&Char, 1);\r
380 switch (Char) {\r
381 case 'P':\r
382 Key->ScanCode = SCAN_F1;\r
383 break;\r
384 case 'Q':\r
385 Key->ScanCode = SCAN_F2;\r
386 break;\r
387 case 'w':\r
388 Key->ScanCode = SCAN_F3;\r
389 break;\r
390 case 'x':\r
391 Key->ScanCode = SCAN_F4;\r
392 break;\r
393 case 't':\r
394 Key->ScanCode = SCAN_F5;\r
395 break;\r
396 case 'u':\r
397 Key->ScanCode = SCAN_F6;\r
398 break;\r
399 case 'q':\r
400 Key->ScanCode = SCAN_F7;\r
401 break;\r
402 case 'r':\r
403 Key->ScanCode = SCAN_F8;\r
404 break;\r
405 case 'p':\r
406 Key->ScanCode = SCAN_F9;\r
407 break;\r
408 case 'm':\r
409 Key->ScanCode = SCAN_F10;\r
410 break;\r
411 default :\r
412 break;\r
413 }\r
414 }\r
415 } else if (Char < ' ') {\r
3402aac7
RC
416 if ((Char == CHAR_BACKSPACE) ||\r
417 (Char == CHAR_TAB) ||\r
418 (Char == CHAR_LINEFEED) ||\r
2ef2b01e
A
419 (Char == CHAR_CARRIAGE_RETURN)) {\r
420 // Only let through EFI required control characters\r
3402aac7 421 Key->UnicodeChar = (CHAR16)Char;\r
2ef2b01e
A
422 }\r
423 } else if (Char == 0x7f) {\r
424 Key->ScanCode = SCAN_DELETE;\r
425 } else {\r
426 Key->UnicodeChar = (CHAR16)Char;\r
427 }\r
428\r
429 return EFI_SUCCESS;\r
430}\r
431\r
432\r
433EFI_STATUS\r
434EFIAPI\r
435TextOutReset (\r
436 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
437 IN BOOLEAN ExtendedVerification\r
438 )\r
439{\r
440 EFI_STATUS Status;\r
441\r
442 This->SetAttribute(\r
443 This,\r
444 EFI_TEXT_ATTR(This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK)\r
445 );\r
446\r
447 Status = This->SetMode (This, 0);\r
448\r
449 return Status;\r
450}\r
451\r
452CHAR8 *\r
453EFIAPI\r
454SafeUnicodeStrToAsciiStr (\r
455 IN CONST CHAR16 *Source,\r
456 OUT CHAR8 *Destination\r
457 )\r
458{\r
459 CHAR8 *ReturnValue;\r
460\r
461 ASSERT (Destination != NULL);\r
462\r
463 //\r
464 // ASSERT if Source is long than PcdMaximumUnicodeStringLength.\r
465 // Length tests are performed inside StrLen().\r
466 //\r
467 ASSERT (StrSize (Source) != 0);\r
468\r
469 //\r
470 // Source and Destination should not overlap\r
471 //\r
472 ASSERT ((UINTN) ((CHAR16 *) Destination - Source) > StrLen (Source));\r
473 ASSERT ((UINTN) ((CHAR8 *) Source - Destination) > StrLen (Source));\r
474\r
475\r
476 ReturnValue = Destination;\r
477 while (*Source != '\0') {\r
478 //\r
479 // If any non-ascii characters in Source then replace it with '?'.\r
480 //\r
481 if (*Source < 0x80) {\r
482 *Destination = (CHAR8) *Source;\r
483 } else {\r
484 *Destination = '?';\r
485\r
486 //Surrogate pair check.\r
487 if ((*Source >= 0xD800) && (*Source <= 0xDFFF)) {\r
488 Source++;\r
489 }\r
490 }\r
491\r
492 Destination++;\r
493 Source++;\r
494 }\r
495\r
496 *Destination = '\0';\r
497\r
498 //\r
499 // ASSERT Original Destination is less long than PcdMaximumAsciiStringLength.\r
500 // Length tests are performed inside AsciiStrLen().\r
501 //\r
502 ASSERT (AsciiStrSize (ReturnValue) != 0);\r
503\r
504 return ReturnValue;\r
505}\r
506\r
507EFI_STATUS\r
508EFIAPI\r
509OutputString (\r
510 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
511 IN CHAR16 *String\r
512 )\r
513{\r
56226bf7 514 UINTN Size;\r
515 CHAR8* OutputString;\r
516 EFI_STATUS Status;\r
517 EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode;\r
518 UINTN MaxColumn;\r
519 UINTN MaxRow;\r
3402aac7 520\r
56226bf7 521 Size = StrLen(String) + 1;\r
522 OutputString = AllocatePool(Size);\r
523\r
2ef2b01e
A
524 //If there is any non-ascii characters in String buffer then replace it with '?'\r
525 //Eventually, UnicodeStrToAsciiStr API should be fixed.\r
3402aac7 526 SafeUnicodeStrToAsciiStr(String, OutputString);\r
2ef2b01e
A
527 SerialPortWrite ((UINT8 *)OutputString, Size - 1);\r
528\r
56226bf7 529 //\r
530 // Parse each character of the string to output\r
531 // to update the cursor position information\r
532 //\r
533 Mode = This->Mode;\r
534\r
535 Status = This->QueryMode (\r
536 This,\r
537 Mode->Mode,\r
538 &MaxColumn,\r
539 &MaxRow\r
540 );\r
541 if (EFI_ERROR (Status)) {\r
542 return Status;\r
543 }\r
544\r
545 for (; *String != CHAR_NULL; String++) {\r
546\r
547 switch (*String) {\r
548 case CHAR_BACKSPACE:\r
549 if (Mode->CursorColumn > 0) {\r
550 Mode->CursorColumn--;\r
551 }\r
552 break;\r
553\r
554 case CHAR_LINEFEED:\r
555 if (Mode->CursorRow < (INT32) (MaxRow - 1)) {\r
556 Mode->CursorRow++;\r
557 }\r
558 break;\r
559\r
560 case CHAR_CARRIAGE_RETURN:\r
561 Mode->CursorColumn = 0;\r
562 break;\r
563\r
564 default:\r
565 if (Mode->CursorColumn >= (INT32) (MaxColumn - 1)) {\r
566 // Move the cursor as if we print CHAR_CARRIAGE_RETURN & CHAR_LINE_FEED\r
567 // CHAR_LINEFEED\r
568 if (Mode->CursorRow < (INT32) (MaxRow - 1)) {\r
569 Mode->CursorRow++;\r
570 }\r
571 // CHAR_CARIAGE_RETURN\r
572 Mode->CursorColumn = 0;\r
573 } else {\r
574 Mode->CursorColumn++;\r
575 }\r
576 break;\r
577 }\r
578 }\r
579\r
2ef2b01e
A
580 FreePool(OutputString);\r
581\r
582 return EFI_SUCCESS;\r
583}\r
584\r
585\r
586EFI_STATUS\r
587EFIAPI\r
588TestString (\r
589 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
590 IN CHAR16 *String\r
591 )\r
592{\r
593 CHAR8 Character;\r
594\r
595 for ( ; *String != CHAR_NULL; String++) {\r
596 Character = (CHAR8)*String;\r
597 if (!(TextOutIsValidAscii (Character) || TextOutIsValidEfiCntlChar (Character))) {\r
598 return EFI_UNSUPPORTED;\r
599 }\r
600 }\r
601\r
602 return EFI_SUCCESS;\r
603}\r
604\r
605\r
606EFI_STATUS\r
607EFIAPI\r
608QueryMode (\r
609 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
610 IN UINTN ModeNumber,\r
611 OUT UINTN *Columns,\r
612 OUT UINTN *Rows\r
613 )\r
614{\r
615 if (This->Mode->MaxMode > 1) {\r
616 return EFI_DEVICE_ERROR;\r
617 }\r
618\r
619 if (ModeNumber == 0) {\r
620 *Columns = MODE0_COLUMN_COUNT;\r
621 *Rows = MODE0_ROW_COUNT;\r
622 return EFI_SUCCESS;\r
623 }\r
624\r
625 return EFI_UNSUPPORTED;\r
626}\r
627\r
628\r
629EFI_STATUS\r
630EFIAPI\r
631SetMode (\r
632 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
633 IN UINTN ModeNumber\r
634 )\r
635{\r
636 if (ModeNumber != 0) {\r
637 return EFI_UNSUPPORTED;\r
638 }\r
639\r
640 This->Mode->Mode = 0;\r
641 This->ClearScreen (This);\r
642 return EFI_SUCCESS;\r
643}\r
644\r
645\r
646EFI_STATUS\r
647EFIAPI\r
648SetAttribute(\r
649 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
650 IN UINTN Attribute\r
651 )\r
652{\r
653 This->Mode->Attribute = (INT32)Attribute;\r
654 return EFI_SUCCESS;\r
655}\r
656\r
657\r
658EFI_STATUS\r
659EFIAPI\r
660ClearScreen (\r
661 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This\r
662 )\r
663{\r
664 EFI_STATUS Status;\r
665\r
666 Status = This->SetCursorPosition (This, 0, 0);\r
667 return Status;\r
668}\r
669\r
670\r
671EFI_STATUS\r
672EFIAPI\r
673SetCursorPosition (\r
674 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
675 IN UINTN Column,\r
676 IN UINTN Row\r
677 )\r
678{\r
679 EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode;\r
680 EFI_STATUS Status;\r
681 UINTN MaxColumn;\r
682 UINTN MaxRow;\r
683\r
684 Mode = This->Mode;\r
685\r
686 Status = This->QueryMode(\r
687 This,\r
688 Mode->Mode,\r
689 &MaxColumn,\r
3402aac7 690 &MaxRow\r
2ef2b01e
A
691 );\r
692 if (EFI_ERROR(Status)) {\r
693 return EFI_UNSUPPORTED;\r
694 }\r
695\r
696 if ((Column >= MaxColumn) || (Row >= MaxRow)) {\r
697 return EFI_UNSUPPORTED;\r
698 }\r
699\r
700 Mode->CursorColumn = (INT32)Column;\r
701 Mode->CursorRow = (INT32)Row;\r
702\r
703 return EFI_SUCCESS;\r
704}\r
705\r
706\r
707EFI_STATUS\r
708EFIAPI\r
709EnableCursor (\r
710 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
711 IN BOOLEAN Enable\r
712 )\r
713{\r
714 if (!Enable) {\r
715 return EFI_UNSUPPORTED;\r
716 }\r
717\r
718 return EFI_SUCCESS;\r
719}\r
720\r
721\r
722EFI_STATUS\r
723EFIAPI\r
724SimpleTextInOutEntryPoint (\r
725 IN EFI_HANDLE ImageHandle,\r
726 IN EFI_SYSTEM_TABLE *SystemTable\r
727 )\r
728{\r
729 EFI_STATUS Status;\r
730\r
731 Status = gBS->CreateEvent (\r
732 EVT_NOTIFY_WAIT,\r
733 TPL_NOTIFY,\r
734 WaitForKeyEvent,\r
735 NULL,\r
736 &mSimpleTextIn.WaitForKey\r
737 );\r
738 ASSERT_EFI_ERROR (Status);\r
3402aac7 739\r
2ef2b01e
A
740 Status = gBS->InstallMultipleProtocolInterfaces(\r
741 &mInstallHandle,\r
742 &gEfiSimpleTextInProtocolGuid, &mSimpleTextIn,\r
743 &gEfiSimpleTextOutProtocolGuid, &mSimpleTextOut,\r
026e30c4 744 &gEfiDevicePathProtocolGuid, &mDevicePath,\r
745 NULL\r
2ef2b01e
A
746 );\r
747 if (!EFI_ERROR (Status)) {\r
748 gST->ConOut = &mSimpleTextOut;\r
749 gST->ConIn = &mSimpleTextIn;\r
750 }\r
3402aac7 751\r
2ef2b01e
A
752 return Status;\r
753}\r