]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
Add a Notification GUID for the implementation of EFI_SIMPLE_INPUT_EX protocol for...
[mirror_edk2.git] / MdeModulePkg / Universal / Console / TerminalDxe / Terminal.h
CommitLineData
95276127 1/*++\r
2\r
3Copyright (c) 2006, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 terminal.h\r
15\r
16Abstract:\r
17\r
18 \r
19Revision History\r
20\r
21--*/\r
22\r
23#ifndef _TERMINAL_H\r
24#define _TERMINAL_H\r
25\r
97a079ed
A
26\r
27#include <PiDxe.h>\r
28#include <Protocol/SimpleTextOut.h>\r
29#include <Protocol/SerialIo.h>\r
30#include <Guid/GlobalVariable.h>\r
31#include <Protocol/DevicePath.h>\r
32#include <Protocol/SimpleTextIn.h>\r
33#include <Guid/HotPlugDevice.h>\r
34#include <Guid/PcAnsi.h>\r
35#include <Library/DebugLib.h>\r
36#include <Library/UefiDriverEntryPoint.h>\r
37#include <Library/UefiLib.h>\r
38#include <Library/ReportStatusCodeLib.h>\r
39#include <Library/BaseMemoryLib.h>\r
40#include <Library/MemoryAllocationLib.h>\r
41#include <Library/UefiBootServicesTableLib.h>\r
42#include <Library/UefiRuntimeServicesTableLib.h>\r
43#include <Library/DevicePathLib.h>\r
44#include <Library/PcdLib.h>\r
45\r
46\r
95276127 47\r
48#define RAW_FIFO_MAX_NUMBER 256\r
49#define FIFO_MAX_NUMBER 128\r
50\r
51typedef struct {\r
52 UINT8 Head;\r
53 UINT8 Tail;\r
54 UINT8 Data[RAW_FIFO_MAX_NUMBER + 1];\r
55} RAW_DATA_FIFO;\r
56\r
57typedef struct {\r
58 UINT8 Head;\r
59 UINT8 Tail;\r
60 UINT16 Data[FIFO_MAX_NUMBER + 1];\r
61} UNICODE_FIFO;\r
62\r
63typedef struct {\r
64 UINT8 Head;\r
65 UINT8 Tail;\r
66 EFI_INPUT_KEY Data[FIFO_MAX_NUMBER + 1];\r
67} EFI_KEY_FIFO;\r
68\r
69#define TERMINAL_DEV_SIGNATURE EFI_SIGNATURE_32 ('t', 'm', 'n', 'l')\r
70\r
71typedef struct {\r
72 UINTN Signature;\r
73 EFI_HANDLE Handle;\r
74 UINT8 TerminalType;\r
75 EFI_SERIAL_IO_PROTOCOL *SerialIo;\r
76 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
95276127 77 EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleInput;\r
78 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL SimpleTextOutput;\r
79 EFI_SIMPLE_TEXT_OUTPUT_MODE SimpleTextOutputMode;\r
80 UINTN SerialInTimeOut;\r
81 RAW_DATA_FIFO RawFiFo;\r
82 UNICODE_FIFO UnicodeFiFo;\r
83 EFI_KEY_FIFO EfiKeyFiFo;\r
84 EFI_UNICODE_STRING_TABLE *ControllerNameTable;\r
85 EFI_EVENT TwoSecondTimeOut;\r
86 UINT32 InputState;\r
6b88ceec 87 UINT32 ResetState;\r
95276127 88\r
89 //\r
90 // Esc could not be output to the screen by user,\r
91 // but the terminal driver need to output it to\r
92 // the terminal emulation software to send control sequence.\r
93 // This boolean is used by the terminal driver only\r
94 // to indicate whether the Esc could be sent or not.\r
95 //\r
6b88ceec 96 BOOLEAN OutputEscChar;\r
95276127 97} TERMINAL_DEV;\r
98\r
99#define INPUT_STATE_DEFAULT 0x00\r
100#define INPUT_STATE_ESC 0x01\r
101#define INPUT_STATE_CSI 0x02\r
102#define INPUT_STATE_LEFTOPENBRACKET 0x04\r
103#define INPUT_STATE_O 0x08\r
104#define INPUT_STATE_2 0x10\r
105\r
106#define RESET_STATE_DEFAULT 0x00\r
107#define RESET_STATE_ESC_R 0x01\r
108#define RESET_STATE_ESC_R_ESC_r 0x02\r
109\r
110#define TERMINAL_CON_IN_DEV_FROM_THIS(a) CR (a, TERMINAL_DEV, SimpleInput, TERMINAL_DEV_SIGNATURE)\r
111#define TERMINAL_CON_OUT_DEV_FROM_THIS(a) CR (a, TERMINAL_DEV, SimpleTextOutput, TERMINAL_DEV_SIGNATURE)\r
112\r
113typedef union {\r
114 UINT8 Utf8_1;\r
115 UINT8 Utf8_2[2];\r
116 UINT8 Utf8_3[3];\r
117} UTF8_CHAR;\r
118\r
119#define PcAnsiType 0\r
120#define VT100Type 1\r
121#define VT100PlusType 2\r
122#define VTUTF8Type 3\r
123\r
124#define LEFTOPENBRACKET 0x5b // '['\r
125#define ACAP 0x41\r
126#define BCAP 0x42\r
127#define CCAP 0x43\r
128#define DCAP 0x44\r
129\r
130#define MODE0_COLUMN_COUNT 80\r
131#define MODE0_ROW_COUNT 25\r
132\r
133#define BACKSPACE 8\r
134#define ESC 27\r
135#define CSI 0x9B\r
136#define DEL 127\r
137#define BRIGHT_CONTROL_OFFSET 2\r
138#define FOREGROUND_CONTROL_OFFSET 6\r
139#define BACKGROUND_CONTROL_OFFSET 11\r
140#define ROW_OFFSET 2\r
141#define COLUMN_OFFSET 5\r
142\r
143typedef struct {\r
144 UINT16 Unicode;\r
145 CHAR8 PcAnsi;\r
146 CHAR8 Ascii;\r
147} UNICODE_TO_CHAR;\r
148\r
95276127 149//\r
150// Global Variables\r
151//\r
5bca971e 152extern EFI_DRIVER_BINDING_PROTOCOL gTerminalDriverBinding;\r
153extern EFI_COMPONENT_NAME_PROTOCOL gTerminalComponentName;\r
154extern EFI_COMPONENT_NAME2_PROTOCOL gTerminalComponentName2;\r
95276127 155\r
156//\r
157// Prototypes\r
158//\r
159EFI_STATUS\r
160EFIAPI\r
161InitializeTerminal (\r
162 IN EFI_HANDLE ImageHandle,\r
163 IN EFI_SYSTEM_TABLE *SystemTable\r
164 )\r
165;\r
166\r
167EFI_STATUS\r
168EFIAPI\r
169TerminalConInReset (\r
170 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,\r
171 IN BOOLEAN ExtendedVerification\r
172 )\r
173;\r
174\r
175EFI_STATUS\r
176EFIAPI\r
177TerminalConInReadKeyStroke (\r
178 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,\r
179 OUT EFI_INPUT_KEY *Key\r
180 )\r
181;\r
182\r
183VOID\r
184EFIAPI\r
185TerminalConInWaitForKey (\r
186 IN EFI_EVENT Event,\r
187 IN VOID *Context\r
188 )\r
189;\r
190\r
191EFI_STATUS\r
192EFIAPI\r
193TerminalConOutReset (\r
194 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
195 IN BOOLEAN ExtendedVerification\r
196 )\r
197;\r
198\r
199EFI_STATUS\r
200EFIAPI\r
201TerminalConOutOutputString (\r
202 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
203 IN CHAR16 *WString\r
204 )\r
205;\r
206\r
207EFI_STATUS\r
208EFIAPI\r
209TerminalConOutTestString (\r
210 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
211 IN CHAR16 *WString\r
212 )\r
213;\r
214\r
215EFI_STATUS\r
216EFIAPI\r
217TerminalConOutQueryMode (\r
218 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
219 IN UINTN ModeNumber,\r
220 OUT UINTN *Columns,\r
221 OUT UINTN *Rows\r
222 )\r
223;\r
224\r
225EFI_STATUS\r
226EFIAPI\r
227TerminalConOutSetMode (\r
228 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
229 IN UINTN ModeNumber\r
230 )\r
231;\r
232\r
233EFI_STATUS\r
234EFIAPI\r
235TerminalConOutSetAttribute (\r
236 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
237 IN UINTN Attribute\r
238 )\r
239;\r
240\r
241EFI_STATUS\r
242EFIAPI\r
243TerminalConOutClearScreen (\r
244 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This\r
245 )\r
246;\r
247\r
248EFI_STATUS\r
249EFIAPI\r
250TerminalConOutSetCursorPosition (\r
251 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
252 IN UINTN Column,\r
253 IN UINTN Row\r
254 )\r
255;\r
256\r
257EFI_STATUS\r
258EFIAPI\r
259TerminalConOutEnableCursor (\r
260 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
261 IN BOOLEAN Visible\r
262 )\r
263;\r
264\r
265EFI_STATUS\r
266EFIAPI\r
267TerminalDriverBindingSupported (\r
268 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
269 IN EFI_HANDLE Controller,\r
270 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
271 );\r
272\r
273EFI_STATUS\r
274EFIAPI\r
275TerminalDriverBindingStart (\r
276 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
277 IN EFI_HANDLE Controller,\r
278 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
279 );\r
280\r
281EFI_STATUS\r
282EFIAPI\r
283TerminalDriverBindingStop (\r
284 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
285 IN EFI_HANDLE Controller,\r
286 IN UINTN NumberOfChildren,\r
287 IN EFI_HANDLE *ChildHandleBuffer\r
288 );\r
289\r
5bca971e 290/**\r
291 Retrieves a Unicode string that is the user readable name of the driver.\r
292\r
293 This function retrieves the user readable name of a driver in the form of a\r
294 Unicode string. If the driver specified by This has a user readable name in\r
295 the language specified by Language, then a pointer to the driver name is\r
296 returned in DriverName, and EFI_SUCCESS is returned. If the driver specified\r
297 by This does not support the language specified by Language,\r
298 then EFI_UNSUPPORTED is returned.\r
299\r
300 @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
301 EFI_COMPONENT_NAME_PROTOCOL instance.\r
302\r
303 @param Language[in] A pointer to a Null-terminated ASCII string\r
304 array indicating the language. This is the\r
305 language of the driver name that the caller is\r
306 requesting, and it must match one of the\r
307 languages specified in SupportedLanguages. The\r
308 number of languages supported by a driver is up\r
309 to the driver writer. Language is specified\r
310 in RFC 3066 or ISO 639-2 language code format.\r
311\r
312 @param DriverName[out] A pointer to the Unicode string to return.\r
313 This Unicode string is the name of the\r
314 driver specified by This in the language\r
315 specified by Language.\r
316\r
317 @retval EFI_SUCCESS The Unicode string for the Driver specified by\r
318 This and the language specified by Language was\r
319 returned in DriverName.\r
320\r
321 @retval EFI_INVALID_PARAMETER Language is NULL.\r
322\r
323 @retval EFI_INVALID_PARAMETER DriverName is NULL.\r
324\r
325 @retval EFI_UNSUPPORTED The driver specified by This does not support\r
326 the language specified by Language.\r
327\r
328**/\r
95276127 329EFI_STATUS\r
330EFIAPI\r
331TerminalComponentNameGetDriverName (\r
332 IN EFI_COMPONENT_NAME_PROTOCOL *This,\r
333 IN CHAR8 *Language,\r
334 OUT CHAR16 **DriverName\r
335 );\r
336\r
5bca971e 337\r
338/**\r
339 Retrieves a Unicode string that is the user readable name of the controller\r
340 that is being managed by a driver.\r
341\r
342 This function retrieves the user readable name of the controller specified by\r
343 ControllerHandle and ChildHandle in the form of a Unicode string. If the\r
344 driver specified by This has a user readable name in the language specified by\r
345 Language, then a pointer to the controller name is returned in ControllerName,\r
346 and EFI_SUCCESS is returned. If the driver specified by This is not currently\r
347 managing the controller specified by ControllerHandle and ChildHandle,\r
348 then EFI_UNSUPPORTED is returned. If the driver specified by This does not\r
349 support the language specified by Language, then EFI_UNSUPPORTED is returned.\r
350\r
351 @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
352 EFI_COMPONENT_NAME_PROTOCOL instance.\r
353\r
354 @param ControllerHandle[in] The handle of a controller that the driver\r
355 specified by This is managing. This handle\r
356 specifies the controller whose name is to be\r
357 returned.\r
358\r
359 @param ChildHandle[in] The handle of the child controller to retrieve\r
360 the name of. This is an optional parameter that\r
361 may be NULL. It will be NULL for device\r
362 drivers. It will also be NULL for a bus drivers\r
363 that wish to retrieve the name of the bus\r
364 controller. It will not be NULL for a bus\r
365 driver that wishes to retrieve the name of a\r
366 child controller.\r
367\r
368 @param Language[in] A pointer to a Null-terminated ASCII string\r
369 array indicating the language. This is the\r
370 language of the driver name that the caller is\r
371 requesting, and it must match one of the\r
372 languages specified in SupportedLanguages. The\r
373 number of languages supported by a driver is up\r
374 to the driver writer. Language is specified in\r
375 RFC 3066 or ISO 639-2 language code format.\r
376\r
377 @param ControllerName[out] A pointer to the Unicode string to return.\r
378 This Unicode string is the name of the\r
379 controller specified by ControllerHandle and\r
380 ChildHandle in the language specified by\r
381 Language from the point of view of the driver\r
382 specified by This.\r
383\r
384 @retval EFI_SUCCESS The Unicode string for the user readable name in\r
385 the language specified by Language for the\r
386 driver specified by This was returned in\r
387 DriverName.\r
388\r
389 @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.\r
390\r
391 @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid\r
392 EFI_HANDLE.\r
393\r
394 @retval EFI_INVALID_PARAMETER Language is NULL.\r
395\r
396 @retval EFI_INVALID_PARAMETER ControllerName is NULL.\r
397\r
398 @retval EFI_UNSUPPORTED The driver specified by This is not currently\r
399 managing the controller specified by\r
400 ControllerHandle and ChildHandle.\r
401\r
402 @retval EFI_UNSUPPORTED The driver specified by This does not support\r
403 the language specified by Language.\r
404\r
405**/\r
95276127 406EFI_STATUS\r
407EFIAPI\r
408TerminalComponentNameGetControllerName (\r
409 IN EFI_COMPONENT_NAME_PROTOCOL *This,\r
410 IN EFI_HANDLE ControllerHandle,\r
411 IN EFI_HANDLE ChildHandle OPTIONAL,\r
412 IN CHAR8 *Language,\r
413 OUT CHAR16 **ControllerName\r
414 );\r
415\r
5bca971e 416\r
95276127 417//\r
418// internal functions\r
419//\r
420EFI_STATUS\r
421TerminalConInCheckForKey (\r
422 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This\r
423 )\r
424;\r
425\r
426VOID\r
427TerminalUpdateConsoleDevVariable (\r
428 IN CHAR16 *VariableName,\r
429 IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath\r
430 )\r
431;\r
432\r
433VOID\r
434TerminalRemoveConsoleDevVariable (\r
435 IN CHAR16 *VariableName,\r
436 IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath\r
437 )\r
438;\r
439\r
440VOID *\r
441TerminalGetVariableAndSize (\r
442 IN CHAR16 *Name,\r
443 IN EFI_GUID *VendorGuid,\r
444 OUT UINTN *VariableSize\r
445 )\r
446;\r
447\r
448EFI_STATUS\r
449SetTerminalDevicePath (\r
450 IN UINT8 TerminalType,\r
451 IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath,\r
452 OUT EFI_DEVICE_PATH_PROTOCOL **TerminalDevicePath\r
453 )\r
454;\r
455\r
456VOID\r
457InitializeRawFiFo (\r
458 IN TERMINAL_DEV *TerminalDevice\r
459 )\r
460;\r
461\r
462VOID\r
463InitializeUnicodeFiFo (\r
464 IN TERMINAL_DEV *TerminalDevice\r
465 )\r
466;\r
467\r
468VOID\r
469InitializeEfiKeyFiFo (\r
470 IN TERMINAL_DEV *TerminalDevice\r
471 )\r
472;\r
473\r
474EFI_STATUS\r
475GetOneKeyFromSerial (\r
476 EFI_SERIAL_IO_PROTOCOL *SerialIo,\r
477 UINT8 *Input\r
478 )\r
479;\r
480\r
481BOOLEAN\r
482RawFiFoInsertOneKey (\r
483 TERMINAL_DEV *TerminalDevice,\r
484 UINT8 Input\r
485 )\r
486;\r
487\r
488BOOLEAN\r
489RawFiFoRemoveOneKey (\r
490 TERMINAL_DEV *TerminalDevice,\r
491 UINT8 *Output\r
492 )\r
493;\r
494\r
495BOOLEAN\r
496IsRawFiFoEmpty (\r
497 TERMINAL_DEV *TerminalDevice\r
498 )\r
499;\r
500\r
501BOOLEAN\r
502IsRawFiFoFull (\r
503 TERMINAL_DEV *TerminalDevice\r
504 )\r
505;\r
506\r
507BOOLEAN\r
508EfiKeyFiFoInsertOneKey (\r
509 TERMINAL_DEV *TerminalDevice,\r
510 EFI_INPUT_KEY Key\r
511 )\r
512;\r
513\r
514BOOLEAN\r
515EfiKeyFiFoRemoveOneKey (\r
516 TERMINAL_DEV *TerminalDevice,\r
517 EFI_INPUT_KEY *Output\r
518 )\r
519;\r
520\r
521BOOLEAN\r
522IsEfiKeyFiFoEmpty (\r
523 TERMINAL_DEV *TerminalDevice\r
524 )\r
525;\r
526\r
527BOOLEAN\r
528IsEfiKeyFiFoFull (\r
529 TERMINAL_DEV *TerminalDevice\r
530 )\r
531;\r
532\r
533BOOLEAN\r
534UnicodeFiFoInsertOneKey (\r
535 TERMINAL_DEV *TerminalDevice,\r
536 UINT16 Input\r
537 )\r
538;\r
539\r
540BOOLEAN\r
541UnicodeFiFoRemoveOneKey (\r
542 TERMINAL_DEV *TerminalDevice,\r
543 UINT16 *Output\r
544 )\r
545;\r
546\r
547BOOLEAN\r
548IsUnicodeFiFoEmpty (\r
549 TERMINAL_DEV *TerminalDevice\r
550 )\r
551;\r
552\r
553BOOLEAN\r
554IsUnicodeFiFoFull (\r
555 TERMINAL_DEV *TerminalDevice\r
556 )\r
557;\r
558\r
559UINT8\r
560UnicodeFiFoGetKeyCount (\r
561 TERMINAL_DEV *TerminalDevice\r
562 )\r
563;\r
564\r
565VOID\r
566TranslateRawDataToEfiKey (\r
567 IN TERMINAL_DEV *TerminalDevice\r
568 )\r
569;\r
570\r
571//\r
572// internal functions for PC ANSI\r
573//\r
574VOID\r
575AnsiRawDataToUnicode (\r
576 IN TERMINAL_DEV *PcAnsiDevice\r
577 )\r
578;\r
579\r
580VOID\r
581UnicodeToEfiKey (\r
582 IN TERMINAL_DEV *PcAnsiDevice\r
583 )\r
584;\r
585\r
586EFI_STATUS\r
587AnsiTestString (\r
588 IN TERMINAL_DEV *TerminalDevice,\r
589 IN CHAR16 *WString\r
590 )\r
591;\r
592\r
593//\r
594// internal functions for VT100\r
595//\r
596EFI_STATUS\r
597VT100TestString (\r
598 IN TERMINAL_DEV *VT100Device,\r
599 IN CHAR16 *WString\r
600 )\r
601;\r
602\r
603//\r
604// internal functions for VT100Plus\r
605//\r
606EFI_STATUS\r
607VT100PlusTestString (\r
608 IN TERMINAL_DEV *TerminalDevice,\r
609 IN CHAR16 *WString\r
610 )\r
611;\r
612\r
613//\r
614// internal functions for VTUTF8\r
615//\r
616VOID\r
617VTUTF8RawDataToUnicode (\r
618 IN TERMINAL_DEV *VtUtf8Device\r
619 )\r
620;\r
621\r
622EFI_STATUS\r
623VTUTF8TestString (\r
624 IN TERMINAL_DEV *TerminalDevice,\r
625 IN CHAR16 *WString\r
626 )\r
627;\r
628\r
629VOID\r
630UnicodeToUtf8 (\r
631 IN CHAR16 Unicode,\r
632 OUT UTF8_CHAR *Utf8Char,\r
633 OUT UINT8 *ValidBytes\r
634 )\r
635;\r
636\r
637VOID\r
638GetOneValidUtf8Char (\r
639 IN TERMINAL_DEV *Utf8Device,\r
640 OUT UTF8_CHAR *Utf8Char,\r
641 OUT UINT8 *ValidBytes\r
642 )\r
643;\r
644\r
645VOID\r
646Utf8ToUnicode (\r
647 IN UTF8_CHAR Utf8Char,\r
648 IN UINT8 ValidBytes,\r
649 OUT CHAR16 *UnicodeChar\r
650 )\r
651;\r
652\r
653//\r
654// functions for boxdraw unicode\r
655//\r
656BOOLEAN\r
657TerminalIsValidTextGraphics (\r
658 IN CHAR16 Graphic,\r
659 OUT CHAR8 *PcAnsi, OPTIONAL\r
660 OUT CHAR8 *Ascii OPTIONAL\r
661 )\r
662;\r
663\r
664BOOLEAN\r
665TerminalIsValidAscii (\r
666 IN CHAR16 Ascii\r
667 )\r
668;\r
669\r
670BOOLEAN\r
671TerminalIsValidEfiCntlChar (\r
672 IN CHAR16 CharC\r
673 )\r
674;\r
675\r
676#endif\r