Changeset 7ddc2c7 in mainline
- Timestamp:
- 2014-03-17T15:00:13Z (11 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 9df6b0f
- Parents:
- e1fc679a
- Location:
- kernel
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia64/src/drivers/ski.c
re1fc679a r7ddc2c7 61 61 static outdev_operations_t skidev_ops = { 62 62 .write = ski_putchar, 63 .redraw = NULL 63 .redraw = NULL, 64 .scroll_up = NULL, 65 .scroll_down = NULL 64 66 }; 65 67 -
kernel/arch/mips32/src/mach/malta/malta.c
re1fc679a r7ddc2c7 92 92 static outdev_operations_t yamon_outdev_ops = { 93 93 .write = yamon_putchar, 94 .redraw = NULL 94 .redraw = NULL, 95 .scroll_up = NULL, 96 .scroll_down = NULL 95 97 }; 96 98 -
kernel/arch/sparc64/src/drivers/niagara.c
re1fc679a r7ddc2c7 63 63 static outdev_operations_t niagara_ops = { 64 64 .write = niagara_putchar, 65 .redraw = NULL 65 .redraw = NULL, 66 .scroll_up = NULL, 67 .scroll_down = NULL 66 68 }; 67 69 -
kernel/genarch/src/drivers/dsrln/dsrlnout.c
re1fc679a r7ddc2c7 63 63 static outdev_operations_t dsrlndev_ops = { 64 64 .write = dsrlnout_putchar, 65 .redraw = NULL 65 .redraw = NULL, 66 .scroll_up = NULL, 67 .scroll_down = NULL 66 68 }; 67 69 -
kernel/genarch/src/drivers/ega/ega.c
re1fc679a r7ddc2c7 76 76 static outdev_operations_t egadev_ops = { 77 77 .write = ega_putchar, 78 .redraw = ega_redraw 78 .redraw = ega_redraw, 79 .scroll_up = NULL, 80 .scroll_down = NULL 79 81 }; 80 82 -
kernel/genarch/src/drivers/grlib/uart.c
re1fc679a r7ddc2c7 100 100 static outdev_operations_t grlib_uart_ops = { 101 101 .write = grlib_uart_putchar, 102 .redraw = NULL 102 .redraw = NULL, 103 .scroll_up = NULL, 104 .scroll_down = NULL 103 105 }; 104 106 -
kernel/genarch/src/drivers/omap/uart.c
re1fc679a r7ddc2c7 61 61 62 62 static outdev_operations_t omap_uart_ops = { 63 .write = omap_uart_putchar, 63 64 .redraw = NULL, 64 .write = omap_uart_putchar, 65 .scroll_up = NULL, 66 .scroll_down = NULL 65 67 }; 66 68 -
kernel/genarch/src/drivers/pl011/pl011.c
re1fc679a r7ddc2c7 72 72 .write = pl011_uart_putchar, 73 73 .redraw = NULL, 74 .scroll_up = NULL, 75 .scroll_down = NULL 74 76 }; 75 77 -
kernel/genarch/src/drivers/s3c24xx/uart.c
re1fc679a r7ddc2c7 95 95 static outdev_operations_t s3c24xx_uart_ops = { 96 96 .write = s3c24xx_uart_putchar, 97 .redraw = NULL 97 .redraw = NULL, 98 .scroll_up = NULL, 99 .scroll_down = NULL 98 100 }; 99 101 -
kernel/genarch/src/fb/fb.c
re1fc679a r7ddc2c7 56 56 #define INV_COLOR 0xaaaaaa 57 57 58 #define FB_PAGES 8 59 58 60 #define RED(x, bits) (((x) >> (8 + 8 + 8 - (bits))) & ((1 << (bits)) - 1)) 59 61 #define GREEN(x, bits) (((x) >> (8 + 8 - (bits))) & ((1 << (bits)) - 1)) … … 70 72 71 73 #define BB_POS(instance, col, row) \ 72 ((row) * (instance)->cols + (col)) 74 ((((instance)->start_row + (row)) % (instance)->rows) * \ 75 (instance)->cols + (col)) 73 76 74 77 #define GLYPH_POS(instance, glyph, y) \ … … 92 95 unsigned int yres; 93 96 97 /** Number of rows that fit on framebuffer */ 94 98 unsigned int rowtrim; 95 99 … … 101 105 unsigned int bgscanbytes; 102 106 107 /** Number of columns in the backbuffer */ 103 108 unsigned int cols; 109 /** Number of rows in the backbuffer */ 104 110 unsigned int rows; 105 111 112 /** Starting row in the cyclic backbuffer */ 113 unsigned int start_row; 114 115 /** Top-most visible row (relative to start_row) */ 116 unsigned int offset_row; 117 118 /** Current backbuffer position */ 106 119 unsigned int position; 107 120 } fb_instance_t; 108 121 109 static void fb_putchar(outdev_t *dev, wchar_t ch); 110 static void fb_redraw_internal(fb_instance_t *instance); 111 static void fb_redraw(outdev_t *dev); 122 static void fb_putchar(outdev_t *, wchar_t); 123 static void fb_redraw(outdev_t *); 124 static void fb_scroll_up(outdev_t *); 125 static void fb_scroll_down(outdev_t *); 112 126 113 127 static outdev_operations_t fbdev_ops = { 114 128 .write = fb_putchar, 115 .redraw = fb_redraw 129 .redraw = fb_redraw, 130 .scroll_up = fb_scroll_up, 131 .scroll_down = fb_scroll_down 116 132 }; 117 133 … … 216 232 unsigned int col, unsigned int row, bool overlay) 217 233 { 218 unsigned int x = COL2X(col);219 unsigned int y = ROW2Y(row);220 unsigned int yd;221 222 234 if (!overlay) 223 235 instance->backbuf[BB_POS(instance, col, row)] = glyph; 224 236 237 /* Do not output if the framebuffer is used by user space */ 238 if ((instance->parea.mapped) && (!console_override)) 239 return; 240 241 /* Check whether the glyph should be visible */ 242 if (row < instance->offset_row) 243 return; 244 245 unsigned int rel_row = row - instance->offset_row; 246 if (rel_row >= instance->rowtrim) 247 return; 248 249 unsigned int x = COL2X(col); 250 unsigned int y = ROW2Y(rel_row); 251 252 for (unsigned int yd = 0; yd < FONT_SCANLINES; yd++) 253 memcpy(&instance->addr[FB_POS(instance, x, y + yd)], 254 &instance->glyphs[GLYPH_POS(instance, glyph, yd)], 255 instance->glyphscanline); 256 } 257 258 /** Scroll screen down by one row 259 * 260 */ 261 static void screen_scroll(fb_instance_t *instance) 262 { 225 263 if ((!instance->parea.mapped) || (console_override)) { 226 for (yd = 0; yd < FONT_SCANLINES; yd++) 227 memcpy(&instance->addr[FB_POS(instance, x, y + yd)], 228 &instance->glyphs[GLYPH_POS(instance, glyph, yd)], 229 instance->glyphscanline); 230 } 231 } 232 233 /** Scroll screen down by one row 234 * 235 * 236 */ 237 static void screen_scroll(fb_instance_t *instance) 238 { 239 if ((!instance->parea.mapped) || (console_override)) { 240 unsigned int row; 241 242 for (row = 0; row < instance->rows; row++) { 243 unsigned int y = ROW2Y(row); 244 unsigned int yd; 264 for (unsigned int rel_row = 0; rel_row < instance->rowtrim; rel_row++) { 265 unsigned int y = ROW2Y(rel_row); 266 unsigned int row = rel_row + instance->offset_row; 245 267 246 for ( yd = 0; yd < FONT_SCANLINES; yd++) {268 for (unsigned int yd = 0; yd < FONT_SCANLINES; yd++) { 247 269 unsigned int x; 248 270 unsigned int col; … … 269 291 } 270 292 271 memmove(instance->backbuf, &instance->backbuf[BB_POS(instance, 0, 1)], 272 instance->cols * (instance->rows - 1) * sizeof(uint16_t)); 293 /* 294 * Implement backbuffer scrolling by wrapping around 295 * the cyclic buffer. 296 */ 297 298 instance->start_row++; 299 if (instance->start_row == instance->rows) 300 instance->start_row = 0; 301 273 302 memsetw(&instance->backbuf[BB_POS(instance, 0, instance->rows - 1)], 274 303 instance->cols, 0); … … 334 363 } 335 364 336 /** Print character to screen337 *338 * Emulate basic terminal commands.339 *340 */341 static void fb_putchar(outdev_t *dev, wchar_t ch)342 {343 fb_instance_t *instance = (fb_instance_t *) dev->data;344 spinlock_lock(&instance->lock);345 346 switch (ch) {347 case '\n':348 cursor_remove(instance);349 instance->position += instance->cols;350 instance->position -= instance->position % instance->cols;351 break;352 case '\r':353 cursor_remove(instance);354 instance->position -= instance->position % instance->cols;355 break;356 case '\b':357 cursor_remove(instance);358 if (instance->position % instance->cols)359 instance->position--;360 break;361 case '\t':362 cursor_remove(instance);363 do {364 glyph_draw(instance, fb_font_glyph(' '),365 instance->position % instance->cols,366 instance->position / instance->cols, false);367 instance->position++;368 } while (((instance->position % instance->cols) % 8 != 0) &&369 (instance->position < instance->cols * instance->rows));370 break;371 default:372 glyph_draw(instance, fb_font_glyph(ch),373 instance->position % instance->cols,374 instance->position / instance->cols, false);375 instance->position++;376 }377 378 if (instance->position >= instance->cols * instance->rows) {379 instance->position -= instance->cols;380 screen_scroll(instance);381 }382 383 cursor_put(instance);384 385 spinlock_unlock(&instance->lock);386 }387 388 365 static void fb_redraw_internal(fb_instance_t *instance) 389 366 { 390 unsigned int row; 391 392 for (row = 0; row < instance->rowtrim; row++) { 393 unsigned int y = ROW2Y(row); 394 unsigned int yd; 367 for (unsigned int rel_row = 0; rel_row < instance->rowtrim; rel_row++) { 368 unsigned int y = ROW2Y(rel_row); 369 unsigned int row = rel_row + instance->offset_row; 395 370 396 for ( yd = 0; yd < FONT_SCANLINES; yd++) {371 for (unsigned int yd = 0; yd < FONT_SCANLINES; yd++) { 397 372 unsigned int x; 398 373 unsigned int col; … … 428 403 } 429 404 405 /** Print character to screen 406 * 407 * Emulate basic terminal commands. 408 * 409 */ 410 static void fb_putchar(outdev_t *dev, wchar_t ch) 411 { 412 fb_instance_t *instance = (fb_instance_t *) dev->data; 413 spinlock_lock(&instance->lock); 414 415 switch (ch) { 416 case '\n': 417 cursor_remove(instance); 418 instance->position += instance->cols; 419 instance->position -= instance->position % instance->cols; 420 break; 421 case '\r': 422 cursor_remove(instance); 423 instance->position -= instance->position % instance->cols; 424 break; 425 case '\b': 426 cursor_remove(instance); 427 if (instance->position % instance->cols) 428 instance->position--; 429 break; 430 case '\t': 431 cursor_remove(instance); 432 do { 433 glyph_draw(instance, fb_font_glyph(' '), 434 instance->position % instance->cols, 435 instance->position / instance->cols, false); 436 instance->position++; 437 } while (((instance->position % instance->cols) % 8 != 0) && 438 (instance->position < instance->cols * instance->rows)); 439 break; 440 default: 441 glyph_draw(instance, fb_font_glyph(ch), 442 instance->position % instance->cols, 443 instance->position / instance->cols, false); 444 instance->position++; 445 } 446 447 if (instance->position >= instance->cols * instance->rows) { 448 instance->position -= instance->cols; 449 screen_scroll(instance); 450 } 451 452 cursor_put(instance); 453 454 spinlock_unlock(&instance->lock); 455 } 456 457 /** Scroll the framebuffer up 458 * 459 */ 460 static void fb_scroll_up(outdev_t *dev) 461 { 462 fb_instance_t *instance = (fb_instance_t *) dev->data; 463 spinlock_lock(&instance->lock); 464 465 if (instance->offset_row >= instance->rowtrim / 2) 466 instance->offset_row -= instance->rowtrim / 2; 467 else 468 instance->offset_row = 0; 469 470 fb_redraw_internal(instance); 471 cursor_put(instance); 472 473 spinlock_unlock(&instance->lock); 474 } 475 476 /** Scroll the framebuffer down 477 * 478 */ 479 static void fb_scroll_down(outdev_t *dev) 480 { 481 fb_instance_t *instance = (fb_instance_t *) dev->data; 482 spinlock_lock(&instance->lock); 483 484 if (instance->offset_row + instance->rowtrim / 2 <= 485 instance->rows - instance->rowtrim) 486 instance->offset_row += instance->rowtrim / 2; 487 else 488 instance->offset_row = instance->rows - instance->rowtrim; 489 490 fb_redraw_internal(instance); 491 cursor_put(instance); 492 493 spinlock_unlock(&instance->lock); 494 } 495 430 496 /** Refresh the screen 431 497 * … … 523 589 instance->yres = props->y; 524 590 instance->scanline = props->scan; 525 instance->position = 0; 591 592 instance->rowtrim = Y2ROW(instance->yres); 526 593 527 594 instance->cols = X2COL(instance->xres); 528 instance->rows = Y2ROW(instance->yres); 529 530 instance->rowtrim = instance->rows; 595 instance->rows = FB_PAGES * instance->rowtrim; 596 597 instance->start_row = instance->rows - instance->rowtrim; 598 instance->offset_row = instance->start_row; 599 instance->position = instance->start_row * instance->cols; 531 600 532 601 instance->glyphscanline = FONT_WIDTH * instance->pixelbytes; -
kernel/genarch/src/kbrd/kbrd.c
re1fc679a r7ddc2c7 56 56 #include <arch.h> 57 57 #include <macros.h> 58 #include <str.h> 58 59 59 60 #define IGNORE_CODE 0x7f … … 65 66 66 67 static indev_operations_t kbrd_raw_ops = { 67 .poll = NULL 68 .poll = NULL, 69 .signal = NULL 68 70 }; 69 71 … … 104 106 bool shift; 105 107 bool capslock; 108 wchar_t ch; 106 109 107 110 spinlock_lock(&instance->keylock); … … 127 130 128 131 if (shift) 129 indev_push_character(instance->sink, sc_secondary_map[sc]);132 ch = sc_secondary_map[sc]; 130 133 else 131 indev_push_character(instance->sink, sc_primary_map[sc]); 134 ch = sc_primary_map[sc]; 135 136 switch (ch) { 137 case U_PAGE_UP: 138 indev_signal(instance->sink, INDEV_SIGNAL_SCROLL_UP); 139 break; 140 case U_PAGE_DOWN: 141 indev_signal(instance->sink, INDEV_SIGNAL_SCROLL_DOWN); 142 break; 143 default: 144 indev_push_character(instance->sink, ch); 145 } 146 132 147 break; 133 148 } -
kernel/genarch/src/srln/srln.c
re1fc679a r7ddc2c7 43 43 44 44 static indev_operations_t srln_raw_ops = { 45 .poll = NULL 45 .poll = NULL, 46 .signal = NULL 46 47 }; 47 48 -
kernel/generic/include/console/chardev.h
re1fc679a r7ddc2c7 43 43 #define INDEV_BUFLEN 512 44 44 45 /** Input character device out-of-band signal type. */ 46 typedef enum { 47 INDEV_SIGNAL_SCROLL_UP = 0, 48 INDEV_SIGNAL_SCROLL_DOWN 49 } indev_signal_t; 50 45 51 struct indev; 46 52 47 /* Input character device operations interface. */53 /** Input character device operations interface. */ 48 54 typedef struct { 49 55 /** Read character directly from device, assume interrupts disabled. */ 50 56 wchar_t (* poll)(struct indev *); 57 58 /** Signal out-of-band condition. */ 59 void (* signal)(struct indev *, indev_signal_t); 51 60 } indev_operations_t; 52 61 … … 67 76 } indev_t; 68 77 69 70 78 struct outdev; 71 79 72 /* Output character device operations interface. */80 /** Output character device operations interface. */ 73 81 typedef struct { 74 82 /** Write character to output. */ … … 77 85 /** Redraw any previously cached characters. */ 78 86 void (* redraw)(struct outdev *); 87 88 /** Scroll up in the device cache. */ 89 void (* scroll_up)(struct outdev *); 90 91 /** Scroll down in the device cache. */ 92 void (* scroll_down)(struct outdev *); 79 93 } outdev_operations_t; 80 94 … … 99 113 extern void indev_push_character(indev_t *, wchar_t); 100 114 extern wchar_t indev_pop_character(indev_t *); 115 extern void indev_signal(indev_t *, indev_signal_t); 101 116 102 117 extern void outdev_initialize(const char *, outdev_t *, -
kernel/generic/src/console/chardev.c
re1fc679a r7ddc2c7 94 94 { 95 95 if (atomic_get(&haltstate)) { 96 /* If we are here, we are hopefully on the processor that 96 /* 97 * If we are here, we are hopefully on the processor that 97 98 * issued the 'halt' command, so proceed to read the character 98 99 * directly from input … … 115 116 waitq_sleep(&indev->wq); 116 117 irq_spinlock_lock(&indev->lock, true); 117 wchar_t ch = indev->buffer[(indev->index - indev->counter) % INDEV_BUFLEN]; 118 wchar_t ch = indev->buffer[(indev->index - indev->counter) % 119 INDEV_BUFLEN]; 118 120 indev->counter--; 119 121 irq_spinlock_unlock(&indev->lock, true); 120 122 121 123 return ch; 124 } 125 126 /** Signal out-of-band condition 127 * 128 * @param indev Input character device. 129 * @param signal Out-of-band condition to signal. 130 * 131 */ 132 void indev_signal(indev_t *indev, indev_signal_t signal) 133 { 134 if ((indev != NULL) && (indev->op != NULL) && 135 (indev->op->signal != NULL)) 136 indev->op->signal(indev, signal); 122 137 } 123 138 -
kernel/generic/src/console/console.c
re1fc679a r7ddc2c7 84 84 static outdev_t stdout_source; 85 85 86 static void stdin_signal(indev_t *, indev_signal_t); 87 86 88 static indev_operations_t stdin_ops = { 87 .poll = NULL 89 .poll = NULL, 90 .signal = stdin_signal 88 91 }; 89 92 90 93 static void stdout_write(outdev_t *, wchar_t); 91 94 static void stdout_redraw(outdev_t *); 95 static void stdout_scroll_up(outdev_t *); 96 static void stdout_scroll_down(outdev_t *); 92 97 93 98 static outdev_operations_t stdout_ops = { 94 99 .write = stdout_write, 95 .redraw = stdout_redraw 100 .redraw = stdout_redraw, 101 .scroll_up = stdout_scroll_up, 102 .scroll_down = stdout_scroll_down 96 103 }; 97 104 … … 113 120 } 114 121 122 static void stdin_signal(indev_t *indev, indev_signal_t signal) 123 { 124 switch (signal) { 125 case INDEV_SIGNAL_SCROLL_UP: 126 if (stdout != NULL) 127 stdout_scroll_up(stdout); 128 break; 129 case INDEV_SIGNAL_SCROLL_DOWN: 130 if (stdout != NULL) 131 stdout_scroll_down(stdout); 132 break; 133 } 134 } 135 115 136 void stdout_wire(outdev_t *outdev) 116 137 { … … 136 157 if ((sink) && (sink->op->redraw)) 137 158 sink->op->redraw(sink); 159 } 160 } 161 162 static void stdout_scroll_up(outdev_t *dev) 163 { 164 list_foreach(dev->list, link, outdev_t, sink) { 165 if ((sink) && (sink->op->scroll_up)) 166 sink->op->scroll_up(sink); 167 } 168 } 169 170 static void stdout_scroll_down(outdev_t *dev) 171 { 172 list_foreach(dev->list, link, outdev_t, sink) { 173 if ((sink) && (sink->op->scroll_down)) 174 sink->op->scroll_down(sink); 138 175 } 139 176 } … … 229 266 } 230 267 } 268 231 269 if (chr_encode(ch, buf, &offset, buflen - 1) == EOK) { 232 270 putchar(ch); … … 264 302 265 303 /** Flush characters that are stored in the output buffer 266 * 304 * 267 305 */ 268 306 void kio_flush(void) … … 294 332 295 333 /** Put a character into the output buffer. 296 * 334 * 297 335 * The caller is required to hold kio_lock 298 336 */
Note:
See TracChangeset
for help on using the changeset viewer.