Changes in kernel/genarch/src/fb/fb.c [b366a6f4:ba7371f9] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/fb/fb.c
rb366a6f4 rba7371f9 82 82 SPINLOCK_DECLARE(lock); 83 83 84 parea_t parea;85 86 84 uint8_t *addr; 87 85 uint16_t *backbuf; … … 111 109 } fb_instance_t; 112 110 113 static void fb_putchar(outdev_t *dev, wchar_t ch );111 static void fb_putchar(outdev_t *dev, wchar_t ch, bool silent); 114 112 static void fb_redraw_internal(fb_instance_t *instance); 115 113 static void fb_redraw(outdev_t *dev); … … 217 215 * 218 216 */ 219 static void logo_hide(fb_instance_t *instance )217 static void logo_hide(fb_instance_t *instance, bool silent) 220 218 { 221 219 instance->ylogo = 0; … … 223 221 instance->rowtrim = instance->rows; 224 222 225 if ( (!instance->parea.mapped) || (console_override))223 if (!silent) 226 224 fb_redraw_internal(instance); 227 225 } … … 231 229 */ 232 230 static void glyph_draw(fb_instance_t *instance, uint16_t glyph, 233 unsigned int col, unsigned int row, bool overlay)231 unsigned int col, unsigned int row, bool silent, bool overlay) 234 232 { 235 233 unsigned int x = COL2X(col); … … 238 236 239 237 if (y >= instance->ytrim) 240 logo_hide(instance );238 logo_hide(instance, silent); 241 239 242 240 if (!overlay) 243 241 instance->backbuf[BB_POS(instance, col, row)] = glyph; 244 242 245 if ( (!instance->parea.mapped) || (console_override)) {243 if (!silent) { 246 244 for (yd = 0; yd < FONT_SCANLINES; yd++) 247 245 memcpy(&instance->addr[FB_POS(instance, x, y + yd + instance->ylogo)], … … 255 253 * 256 254 */ 257 static void screen_scroll(fb_instance_t *instance )255 static void screen_scroll(fb_instance_t *instance, bool silent) 258 256 { 259 257 if (instance->ylogo > 0) { 260 logo_hide(instance );258 logo_hide(instance, silent); 261 259 return; 262 260 } 263 261 264 if ( (!instance->parea.mapped) || (console_override)) {262 if (!silent) { 265 263 unsigned int row; 266 264 … … 300 298 } 301 299 302 static void cursor_put(fb_instance_t *instance )300 static void cursor_put(fb_instance_t *instance, bool silent) 303 301 { 304 302 unsigned int col = instance->position % instance->cols; 305 303 unsigned int row = instance->position / instance->cols; 306 304 307 glyph_draw(instance, fb_font_glyph(U_CURSOR), col, row, true);308 } 309 310 static void cursor_remove(fb_instance_t *instance )305 glyph_draw(instance, fb_font_glyph(U_CURSOR), col, row, silent, true); 306 } 307 308 static void cursor_remove(fb_instance_t *instance, bool silent) 311 309 { 312 310 unsigned int col = instance->position % instance->cols; … … 314 312 315 313 glyph_draw(instance, instance->backbuf[BB_POS(instance, col, row)], 316 col, row, true);314 col, row, silent, true); 317 315 } 318 316 … … 364 362 * 365 363 */ 366 static void fb_putchar(outdev_t *dev, wchar_t ch )364 static void fb_putchar(outdev_t *dev, wchar_t ch, bool silent) 367 365 { 368 366 fb_instance_t *instance = (fb_instance_t *) dev->data; … … 371 369 switch (ch) { 372 370 case '\n': 373 cursor_remove(instance );371 cursor_remove(instance, silent); 374 372 instance->position += instance->cols; 375 373 instance->position -= instance->position % instance->cols; 376 374 break; 377 375 case '\r': 378 cursor_remove(instance );376 cursor_remove(instance, silent); 379 377 instance->position -= instance->position % instance->cols; 380 378 break; 381 379 case '\b': 382 cursor_remove(instance );380 cursor_remove(instance, silent); 383 381 if (instance->position % instance->cols) 384 382 instance->position--; 385 383 break; 386 384 case '\t': 387 cursor_remove(instance );385 cursor_remove(instance, silent); 388 386 do { 389 387 glyph_draw(instance, fb_font_glyph(' '), 390 388 instance->position % instance->cols, 391 instance->position / instance->cols, false);389 instance->position / instance->cols, silent, false); 392 390 instance->position++; 393 391 } while ((instance->position % 8) … … 397 395 glyph_draw(instance, fb_font_glyph(ch), 398 396 instance->position % instance->cols, 399 instance->position / instance->cols, false);397 instance->position / instance->cols, silent, false); 400 398 instance->position++; 401 399 } … … 403 401 if (instance->position >= instance->cols * instance->rows) { 404 402 instance->position -= instance->cols; 405 screen_scroll(instance );406 } 407 408 cursor_put(instance );403 screen_scroll(instance, silent); 404 } 405 406 cursor_put(instance, silent); 409 407 410 408 spinlock_unlock(&instance->lock); … … 557 555 558 556 spinlock_initialize(&instance->lock, "*fb.instance.lock"); 559 560 557 instance->rgb_conv = rgb_conv; 561 558 instance->pixelbytes = pixelbytes; … … 626 623 glyphs_render(instance); 627 624 628 link_initialize(&instance->parea.link);629 instance->parea.pbase = props->addr;630 instance->parea.frames = SIZE2FRAMES(fbsize);631 instance->parea.unpriv = false;632 instance->parea.mapped = false;633 ddi_parea_register(&instance->parea);634 635 625 if (!fb_exported) { 636 626 /* 637 * We export the kernel framebuffer for uspace usage. 638 * This is used in the case the uspace framebuffer 639 * driver is not self-sufficient. 627 * This is the necessary evil until the userspace driver is entirely 628 * self-sufficient. 640 629 */ 641 630 sysinfo_set_item_val("fb", NULL, true);
Note:
See TracChangeset
for help on using the changeset viewer.