]> git.proxmox.com Git - mirror_edk2.git/blob - UnixPkg/UnixConsoleDxe/ConsoleOut.c
Update the copyright notice format
[mirror_edk2.git] / UnixPkg / UnixConsoleDxe / ConsoleOut.c
1 /*++
2
3 Copyright (c) 2004, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12 Module Name:
13
14 ConsoleOut.c
15
16 Abstract:
17
18 Console based on Posix APIs.
19
20 This file creates an Posix window and attaches a SimpleTextOut protocol.
21
22 --*/
23
24 #include "Console.h"
25 //
26 // Private worker functions.
27 //
28
29 #if 0
30 VOID
31 UnixSimpleTextOutScrollScreen (
32 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console
33 );
34
35 #endif
36 VOID
37 UnixSimpleTextOutPutChar (
38 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console,
39 IN CHAR16 Char
40 );
41
42 EFI_STATUS
43 EFIAPI
44 UnixSimpleTextOutSetAttribute (
45 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
46 IN UINTN Attribute
47 );
48 EFI_STATUS
49 EFIAPI
50 UnixSimpleTextOutSetMode (
51 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
52 IN UINTN ModeNumber
53 );
54
55 //
56 // Modeule Global for Simple Text Out Mode.
57 //
58 #define MAX_SIMPLE_TEXT_OUT_MODE \
59 (sizeof(mUnixSimpleTextOutSupportedModes)/sizeof(UNIX_SIMPLE_TEXT_OUT_MODE))
60
61 UNIX_SIMPLE_TEXT_OUT_MODE mUnixSimpleTextOutSupportedModes[] = {
62 { 80, 25 },
63 #if 0
64 { 80, 50 },
65 { 80, 43 },
66 { 100, 100 },
67 { 100, 999 }
68 #endif
69 };
70
71 EFI_STATUS
72 EFIAPI
73 UnixSimpleTextOutReset (
74 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
75 IN BOOLEAN ExtendedVerification
76 )
77 /*++
78
79 Routine Description:
80
81 TODO: Add function description
82
83 Arguments:
84
85 This - TODO: add argument description
86 ExtendedVerification - TODO: add argument description
87
88 Returns:
89
90 EFI_SUCCESS - TODO: Add description for return value
91
92 --*/
93 {
94 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;
95
96 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);
97
98 UnixSimpleTextOutSetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK));
99
100 UnixSimpleTextOutSetMode (This, 0);
101 return EFI_SUCCESS;
102 }
103
104 EFI_STATUS
105 EFIAPI
106 UnixSimpleTextOutOutputString (
107 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
108 IN CHAR16 *String
109 )
110 /*++
111
112 Routine Description:
113
114 TODO: Add function description
115
116 Arguments:
117
118 This - TODO: add argument description
119 String - TODO: add argument description
120
121 Returns:
122
123 EFI_SUCCESS - TODO: Add description for return value
124
125 --*/
126 {
127 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;
128 CHAR16 *Str;
129
130 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);
131
132 for (Str = String; *Str != '\0'; Str++) {
133 switch (*Str) {
134 #if 0
135 case '\n':
136 if (Private->Position.Y == (Private->MaxScreenSize.Y - 1)) {
137 UnixSimpleTextOutScrollScreen (Private);
138 }
139
140 if (Private->Position.Y < (Private->MaxScreenSize.Y - 1)) {
141 Private->Position.Y++;
142 This->Mode->CursorRow++;
143 }
144 break;
145
146 case '\r':
147 Private->Position.X = 0;
148 This->Mode->CursorColumn = 0;
149 break;
150
151 case '\b':
152 if (Private->Position.X > 0) {
153 Private->Position.X--;
154 This->Mode->CursorColumn--;
155 }
156 break;
157
158 #endif
159 default:
160 UnixSimpleTextOutPutChar (Private, *Str);
161 }
162 }
163
164 return EFI_SUCCESS;
165 }
166
167 VOID
168 UnixSimpleTextOutPutChar (
169 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console,
170 IN CHAR16 Char
171 )
172 /*++
173
174 Routine Description:
175
176 TODO: Add function description
177
178 Arguments:
179
180 Console - TODO: add argument description
181 Char - TODO: add argument description
182
183 Returns:
184
185 TODO: add return values
186
187 --*/
188 {
189 char c = Char;
190 Console->UnixThunk->Write (1, &c, 1);
191 }
192
193 #if 0
194 VOID
195 UnixSimpleTextOutScrollScreen (
196 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console
197 )
198 /*++
199
200 Routine Description:
201
202 TODO: Add function description
203
204 Arguments:
205
206 Console - TODO: add argument description
207
208 Returns:
209
210 TODO: add return values
211
212 --*/
213 {
214 }
215 #endif
216
217
218 EFI_STATUS
219 EFIAPI
220 UnixSimpleTextOutTestString (
221 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
222 IN CHAR16 *String
223 )
224 /*++
225
226 Routine Description:
227
228 TODO: Add function description
229
230 Arguments:
231
232 This - TODO: add argument description
233 String - TODO: add argument description
234
235 Returns:
236
237 EFI_SUCCESS - TODO: Add description for return value
238
239 --*/
240 {
241 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;
242
243 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);
244
245 //
246 // BugBug: The correct answer would be a function of what code pages
247 // are currently loaded? For now we will just return success.
248 //
249 return EFI_SUCCESS;
250 }
251
252 EFI_STATUS
253 EFIAPI
254 UnixSimpleTextOutQueryMode (
255 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
256 IN UINTN ModeNumber,
257 OUT UINTN *Columns,
258 OUT UINTN *Rows
259 )
260 /*++
261
262 Routine Description:
263
264 TODO: Add function description
265
266 Arguments:
267
268 This - TODO: add argument description
269 ModeNumber - TODO: add argument description
270 Columns - TODO: add argument description
271 Rows - TODO: add argument description
272
273 Returns:
274
275 EFI_INVALID_PARAMETER - TODO: Add description for return value
276 EFI_SUCCESS - TODO: Add description for return value
277
278 --*/
279 {
280 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;
281
282 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);
283
284 if (ModeNumber > MAX_SIMPLE_TEXT_OUT_MODE) {
285 return EFI_INVALID_PARAMETER;
286 }
287
288 *Columns = mUnixSimpleTextOutSupportedModes[ModeNumber].ColumnsX;
289 *Rows = mUnixSimpleTextOutSupportedModes[ModeNumber].RowsY;
290
291 return EFI_SUCCESS;
292 }
293
294 EFI_STATUS
295 EFIAPI
296 UnixSimpleTextOutSetMode (
297 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
298 IN UINTN ModeNumber
299 )
300 /*++
301
302 Routine Description:
303
304 TODO: Add function description
305
306 Arguments:
307
308 This - TODO: add argument description
309 ModeNumber - TODO: add argument description
310
311 Returns:
312
313 EFI_INVALID_PARAMETER - TODO: Add description for return value
314 EFI_SUCCESS - TODO: Add description for return value
315
316 --*/
317 {
318 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;
319
320 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);
321
322 if (ModeNumber > MAX_SIMPLE_TEXT_OUT_MODE) {
323 return EFI_INVALID_PARAMETER;
324 }
325
326
327 This->Mode->Mode = (INT32) ModeNumber;
328
329 This->EnableCursor (This, TRUE);
330 This->ClearScreen (This);
331 return EFI_SUCCESS;
332 }
333
334 EFI_STATUS
335 EFIAPI
336 UnixSimpleTextOutSetAttribute (
337 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
338 IN UINTN Attribute
339 )
340 /*++
341
342 Routine Description:
343
344 TODO: Add function description
345
346 Arguments:
347
348 This - TODO: add argument description
349 Attribute - TODO: add argument description
350
351 Returns:
352
353 EFI_SUCCESS - TODO: Add description for return value
354
355 --*/
356 {
357 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;
358
359 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);
360
361 #if 0
362 Private->Attribute = (WORD) Attribute;
363 #endif
364 This->Mode->Attribute = (INT32) Attribute;
365
366 return EFI_SUCCESS;
367 }
368
369 EFI_STATUS
370 EFIAPI
371 UnixSimpleTextOutClearScreen (
372 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This
373 )
374 /*++
375
376 Routine Description:
377
378 TODO: Add function description
379
380 Arguments:
381
382 This - TODO: add argument description
383
384 Returns:
385
386 EFI_SUCCESS - TODO: Add description for return value
387
388 --*/
389 {
390 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;
391 // DWORD ConsoleWindow;
392
393 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);
394
395 This->SetCursorPosition (This, 0, 0);
396 Private->UnixThunk->Write (1, "\e[2J", 4);
397
398
399 #if 0
400 Private->UnixThunk->FillConsoleOutputCharacter (
401 Private->NtOutHandle,
402 ' ',
403 Private->MaxScreenSize.X * Private->MaxScreenSize.Y,
404 Private->Possition,
405 &ConsoleWindow
406 );
407 Private->UnixThunk->FillConsoleOutputAttribute (
408 Private->NtOutHandle,
409 Private->Attribute,
410 Private->MaxScreenSize.X * Private->MaxScreenSize.Y,
411 Private->Possition,
412 &ConsoleWindow
413 );
414 #endif
415
416 return EFI_SUCCESS;
417 }
418
419 EFI_STATUS
420 EFIAPI
421 UnixSimpleTextOutSetCursorPosition (
422 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
423 IN UINTN Column,
424 IN UINTN Row
425 )
426 /*++
427
428 Routine Description:
429
430 TODO: Add function description
431
432 Arguments:
433
434 This - TODO: add argument description
435 Column - TODO: add argument description
436 Row - TODO: add argument description
437
438 Returns:
439
440 EFI_SUCCESS - TODO: Add description for return value
441
442 --*/
443 {
444 char buf[12];
445 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;
446
447 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);
448
449 #if 0
450 Private->Position.X = (WORD) Column;
451 #endif
452 This->Mode->CursorColumn = (INT32) Column;
453
454 #if 0
455 Private->Position.Y = (WORD) Row;
456 #endif
457 This->Mode->CursorRow = (INT32) Row;
458 #if 0
459 Private->UnixThunk->SetConsoleCursorPosition (Private->NtOutHandle, Private->Possition);
460 #endif
461
462 buf[0] = '\e';
463 buf[1] = '[';
464 buf[2] = '0' + ((Row / 100) % 10);
465 buf[3] = '0' + ((Row / 10) % 10);
466 buf[4] = '0' + ((Row / 1) % 10);
467 buf[5] = ';';
468 buf[6] = '0' + ((Column / 100) % 10);
469 buf[7] = '0' + ((Column / 10) % 10);
470 buf[8] = '0' + ((Column / 1) % 10);
471 buf[9] = 'H';
472 Private->UnixThunk->Write (1, buf, 10);
473
474 return EFI_SUCCESS;
475 }
476
477 EFI_STATUS
478 EFIAPI
479 UnixSimpleTextOutEnableCursor (
480 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
481 IN BOOLEAN Enable
482 )
483 /*++
484
485 Routine Description:
486
487 TODO: Add function description
488
489 Arguments:
490
491 This - TODO: add argument description
492 Enable - TODO: add argument description
493
494 Returns:
495
496 EFI_SUCCESS - TODO: Add description for return value
497
498 --*/
499 {
500 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;
501 #if 0
502 CONSOLE_CURSOR_INFO Info;
503 #endif
504
505 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);
506 Private->CursorEnable = Enable;
507 This->Mode->CursorVisible = Enable;
508
509 #if 0
510 Private->UnixThunk->GetConsoleCursorInfo (Private->NtOutHandle, &Info);
511 Info.bVisible = Enable;
512 Private->UnixThunk->SetConsoleCursorInfo (Private->NtOutHandle, &Info);
513 #endif
514
515 return EFI_SUCCESS;
516 }
517
518 EFI_STATUS
519 UnixSimpleTextOutOpenWindow (
520 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private
521 )
522 /*++
523
524 Routine Description:
525
526 TODO: Add function description
527
528 Arguments:
529
530 Private - TODO: add argument description
531
532 Returns:
533
534 TODO: add return values
535
536 --*/
537 {
538 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;
539 CHAR16 *WindowName;
540
541 //WindowName = Private->UnixIo->EnvString;
542 #if 0
543 Private->Attribute = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY;
544 if (*WindowName == '?') {
545 Private->Attribute = BACKGROUND_RED | FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN;
546 WindowName = L"EFI Emulator Error Console";
547 }
548 #endif
549 WindowName = L"EFI Emulator Error Console";
550
551 AddUnicodeString (
552 "eng",
553 gUnixConsoleComponentName.SupportedLanguages,
554 &Private->ControllerNameTable,
555 WindowName
556 );
557
558 //
559 // Fill in protocol member functions
560 //
561 SimpleTextOut = &Private->SimpleTextOut;
562 SimpleTextOut->Reset = UnixSimpleTextOutReset;
563 SimpleTextOut->OutputString = UnixSimpleTextOutOutputString;
564 SimpleTextOut->TestString = UnixSimpleTextOutTestString;
565 SimpleTextOut->QueryMode = UnixSimpleTextOutQueryMode;
566 SimpleTextOut->SetMode = UnixSimpleTextOutSetMode;
567 SimpleTextOut->SetAttribute = UnixSimpleTextOutSetAttribute;
568 SimpleTextOut->ClearScreen = UnixSimpleTextOutClearScreen;
569 SimpleTextOut->SetCursorPosition = UnixSimpleTextOutSetCursorPosition;
570 SimpleTextOut->EnableCursor = UnixSimpleTextOutEnableCursor;
571
572 //
573 // Initialize SimpleTextOut protocol mode structure
574 //
575 SimpleTextOut->Mode = &Private->SimpleTextOutMode;
576 SimpleTextOut->Mode->MaxMode = MAX_SIMPLE_TEXT_OUT_MODE;
577 SimpleTextOut->Mode->Attribute = 0; //FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY;
578
579 #if 0
580 //
581 // Open the window an initialize it!
582 //
583 Private->NtOutHandle = Private->UnixThunk->CreateConsoleScreenBuffer (
584 GENERIC_WRITE | GENERIC_READ,
585 FILE_SHARE_WRITE | FILE_SHARE_READ,
586 NULL,
587 CONSOLE_TEXTMODE_BUFFER,
588 NULL
589 );
590 Private->UnixThunk->SetConsoleTitle (WindowName);
591 #endif
592
593 return SimpleTextOut->SetMode (SimpleTextOut, 0);
594 }
595
596 EFI_STATUS
597 UnixSimpleTextOutCloseWindow (
598 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console
599 )
600 /*++
601
602 Routine Description:
603
604 TODO: Add function description
605
606 Arguments:
607
608 Console - TODO: add argument description
609
610 Returns:
611
612 EFI_SUCCESS - TODO: Add description for return value
613
614 --*/
615 {
616 #if 0
617 Console->UnixThunk->CloseHandle (Console->NtOutHandle);
618 #endif
619 return EFI_SUCCESS;
620 }