Changeset 39e1b9a in mainline for kernel/genarch
- Timestamp:
- 2025-04-17T15:37:05Z (8 months ago)
- Branches:
- master
- Children:
- 250a435
- Parents:
- 690ad20
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2025-04-14 16:54:54)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2025-04-17 15:37:05)
- Location:
- kernel/genarch/src
- Files:
-
- 4 edited
-
drivers/ega/ega.c (modified) (3 diffs)
-
drivers/ns16550/ns16550.c (modified) (1 diff)
-
drivers/pl011/pl011.c (modified) (2 diffs)
-
fb/fb.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/drivers/ega/ega.c
r690ad20 r39e1b9a 69 69 uint8_t *backbuf; 70 70 ioport8_t *base; 71 mbstate_t mbstate; 71 72 } ega_instance_t; 72 73 73 static void ega_ putuchar(outdev_t *, char32_t);74 static void ega_write(outdev_t *, const char *, size_t); 74 75 static void ega_redraw(outdev_t *); 75 76 76 77 static outdev_operations_t egadev_ops = { 77 .write = ega_ putuchar,78 .write = ega_write, 78 79 .redraw = ega_redraw, 79 80 .scroll_up = NULL, … … 538 539 } 539 540 540 static void ega_putuchar(outdev_t *dev, char32_t ch) 541 { 542 ega_instance_t *instance = (ega_instance_t *) dev->data; 543 544 irq_spinlock_lock(&instance->lock, true); 545 541 static void _putuchar(ega_instance_t *instance, char32_t ch) 542 { 546 543 switch (ch) { 547 544 case '\n': … … 564 561 ega_check_cursor(instance); 565 562 ega_move_cursor(instance); 563 } 564 565 static void ega_write(outdev_t *dev, const char *s, size_t n) 566 { 567 ega_instance_t *instance = (ega_instance_t *) dev->data; 568 569 irq_spinlock_lock(&instance->lock, true); 570 571 size_t offset = 0; 572 char32_t ch; 573 574 while ((ch = str_decode_r(s, &offset, n, U_SPECIAL, &instance->mbstate))) 575 _putuchar(instance, ch); 566 576 567 577 irq_spinlock_unlock(&instance->lock, true); -
kernel/genarch/src/drivers/ns16550/ns16550.c
r690ad20 r39e1b9a 112 112 } 113 113 114 static void ns16550_ putuchar(outdev_t *dev, char32_t ch)114 static void ns16550_write(outdev_t *dev, const char *s, size_t n) 115 115 { 116 116 ns16550_instance_t *instance = (ns16550_instance_t *) dev->data; 117 117 118 if ((!instance->parea.mapped) || (console_override)) { 119 if (ch == '\n') 118 if (instance->parea.mapped && !console_override) 119 return; 120 121 const char *top = s + n; 122 assert(top >= s); 123 124 for (; s < top; s++) { 125 if (*s == '\n') 120 126 ns16550_sendb(instance, '\r'); 121 127 122 if (ascii_check(ch)) 123 ns16550_sendb(instance, (uint8_t) ch); 124 else 125 ns16550_sendb(instance, U_SPECIAL); 128 ns16550_sendb(instance, (uint8_t) *s); 126 129 } 127 130 } 128 131 129 132 static outdev_operations_t ns16550_ops = { 130 .write = ns16550_ putuchar,133 .write = ns16550_write, 131 134 .redraw = NULL 132 135 }; -
kernel/genarch/src/drivers/pl011/pl011.c
r690ad20 r39e1b9a 56 56 } 57 57 58 static void pl011_uart_ putuchar(outdev_t *dev, char32_t ch)58 static void pl011_uart_write(outdev_t *dev, const char *s, size_t n) 59 59 { 60 60 pl011_uart_t *uart = dev->data; … … 64 64 return; 65 65 66 if (!ascii_check(ch)) 67 pl011_uart_sendb(uart, U_SPECIAL); 68 else { 69 if (ch == '\n') 70 pl011_uart_sendb(uart, (uint8_t) '\r'); 71 pl011_uart_sendb(uart, (uint8_t) ch); 66 const char *top = s + n; 67 assert(top >= s); 68 69 for (; s < top; s++) { 70 if (*s == '\n') 71 pl011_uart_sendb(uart, '\r'); 72 73 pl011_uart_sendb(uart, (uint8_t) *s); 72 74 } 73 75 } 74 76 75 77 static outdev_operations_t pl011_uart_ops = { 76 .write = pl011_uart_ putuchar,78 .write = pl011_uart_write, 77 79 .redraw = NULL, 78 80 .scroll_up = NULL, -
kernel/genarch/src/fb/fb.c
r690ad20 r39e1b9a 121 121 /** Current backbuffer position */ 122 122 unsigned int position; 123 124 /** Partial character between writes */ 125 mbstate_t mbstate; 123 126 } fb_instance_t; 124 127 125 static void fb_ putuchar(outdev_t *, char32_t);128 static void fb_write(outdev_t *, const char *, size_t); 126 129 static void fb_redraw(outdev_t *); 127 130 static void fb_scroll_up(outdev_t *); … … 129 132 130 133 static outdev_operations_t fbdev_ops = { 131 .write = fb_ putuchar,134 .write = fb_write, 132 135 .redraw = fb_redraw, 133 136 .scroll_up = fb_scroll_up, … … 418 421 * 419 422 */ 420 static void fb_putuchar(outdev_t *dev, char32_t ch) 421 { 422 fb_instance_t *instance = (fb_instance_t *) dev->data; 423 spinlock_lock(&instance->lock); 424 423 static void _putuchar(fb_instance_t *instance, char32_t ch) 424 { 425 425 switch (ch) { 426 426 case '\n': 427 cursor_remove(instance);428 427 instance->position += instance->cols; 429 428 instance->position -= instance->position % instance->cols; 430 429 break; 431 430 case '\r': 432 cursor_remove(instance);433 431 instance->position -= instance->position % instance->cols; 434 432 break; 435 433 case '\b': 436 cursor_remove(instance);437 434 if (instance->position % instance->cols) 438 435 instance->position--; 439 436 break; 440 437 case '\t': 441 cursor_remove(instance);442 438 do { 443 439 glyph_draw(instance, fb_font_glyph(' '), … … 459 455 screen_scroll(instance); 460 456 } 457 } 458 459 static void fb_write(outdev_t *dev, const char *s, size_t n) 460 { 461 fb_instance_t *instance = (fb_instance_t *) dev->data; 462 463 spinlock_lock(&instance->lock); 464 cursor_remove(instance); 465 466 size_t offset = 0; 467 char32_t ch; 468 469 while ((ch = str_decode_r(s, &offset, n, U_SPECIAL, &instance->mbstate))) 470 _putuchar(instance, ch); 461 471 462 472 cursor_put(instance); 463 464 473 spinlock_unlock(&instance->lock); 465 474 }
Note:
See TracChangeset
for help on using the changeset viewer.
