Rev 3343 | Rev 3664 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3343 | Rev 3618 | ||
---|---|---|---|
Line 434... | Line 434... | ||
434 | }; |
434 | }; |
435 | 435 | ||
436 | 436 | ||
437 | /** Initialize framebuffer as a chardev output device |
437 | /** Initialize framebuffer as a chardev output device |
438 | * |
438 | * |
439 | * @param addr Physical address of the framebuffer |
439 | * @param props properties of the framebuffer device |
440 | * @param x Screen width in pixels |
- | |
441 | * @param y Screen height in pixels |
- | |
442 | * @param scan Bytes per one scanline |
- | |
443 | * @param visual Color model |
- | |
444 | * |
440 | * |
445 | */ |
441 | */ |
446 | void fb_init(uintptr_t addr, unsigned int x, unsigned int y, unsigned int scan, |
- | |
447 | unsigned int visual) |
442 | void fb_init(fb_properties_t *props) |
448 | { |
443 | { |
449 | switch (visual) { |
444 | switch (props->visual) { |
450 | case VISUAL_INDIRECT_8: |
445 | case VISUAL_INDIRECT_8: |
451 | rgb2scr = rgb_byte8; |
446 | rgb2scr = rgb_byte8; |
452 | scr2rgb = byte8_rgb; |
447 | scr2rgb = byte8_rgb; |
453 | pixelbytes = 1; |
448 | pixelbytes = 1; |
454 | break; |
449 | break; |
Line 484... | Line 479... | ||
484 | break; |
479 | break; |
485 | default: |
480 | default: |
486 | panic("Unsupported visual.\n"); |
481 | panic("Unsupported visual.\n"); |
487 | } |
482 | } |
488 | 483 | ||
489 | unsigned int fbsize = scan * y; |
484 | unsigned int fbsize = (props->scan) * (props->y) + (props->fb_start); |
490 | 485 | ||
491 | /* Map the framebuffer */ |
486 | /* Map the framebuffer */ |
492 | fbaddress = (uint8_t *) hw_map((uintptr_t) addr, fbsize); |
487 | fbaddress = (uint8_t *) hw_map((uintptr_t) (props->addr), fbsize); |
- | 488 | fbaddress += props->fb_start; |
|
493 | 489 | ||
494 | xres = x; |
490 | xres = props->x; |
495 | yres = y; |
491 | yres = props->y; |
496 | scanline = scan; |
492 | scanline = props->scan; |
497 | 493 | ||
498 | rows = y / FONT_SCANLINES; |
494 | rows = (props->y) / FONT_SCANLINES; |
499 | columns = x / COL_WIDTH; |
495 | columns = (props->x) / COL_WIDTH; |
500 | 496 | ||
501 | fb_parea.pbase = (uintptr_t) addr; |
497 | fb_parea.pbase = (uintptr_t) (props->addr); |
502 | fb_parea.vbase = (uintptr_t) fbaddress; |
498 | fb_parea.vbase = (uintptr_t) fbaddress; |
503 | fb_parea.frames = SIZE2FRAMES(fbsize); |
499 | fb_parea.frames = SIZE2FRAMES(fbsize); |
504 | fb_parea.cacheable = false; |
500 | fb_parea.cacheable = false; |
505 | ddi_parea_register(&fb_parea); |
501 | ddi_parea_register(&fb_parea); |
506 | 502 | ||
507 | sysinfo_set_item_val("fb", NULL, true); |
503 | sysinfo_set_item_val("fb", NULL, true); |
508 | sysinfo_set_item_val("fb.kind", NULL, 1); |
504 | sysinfo_set_item_val("fb.kind", NULL, 1); |
509 | sysinfo_set_item_val("fb.width", NULL, xres); |
505 | sysinfo_set_item_val("fb.width", NULL, xres); |
510 | sysinfo_set_item_val("fb.height", NULL, yres); |
506 | sysinfo_set_item_val("fb.height", NULL, yres); |
511 | sysinfo_set_item_val("fb.scanline", NULL, scan); |
507 | sysinfo_set_item_val("fb.scanline", NULL, (props->scan)); |
512 | sysinfo_set_item_val("fb.visual", NULL, visual); |
508 | sysinfo_set_item_val("fb.visual", NULL, (props->visual)); |
513 | sysinfo_set_item_val("fb.address.physical", NULL, addr); |
509 | sysinfo_set_item_val("fb.address.physical", NULL, (props->addr)); |
514 | sysinfo_set_item_val("fb.invert-colors", NULL, invert_colors); |
510 | sysinfo_set_item_val("fb.invert-colors", NULL, invert_colors); |
515 | 511 | ||
516 | /* Allocate double buffer */ |
512 | /* Allocate double buffer */ |
517 | unsigned int order = fnzb(SIZE2FRAMES(fbsize) - 1) + 1; |
513 | unsigned int order = fnzb(SIZE2FRAMES(fbsize) - 1) + 1; |
518 | dbbuffer = (uint8_t *) frame_alloc(order, FRAME_ATOMIC | FRAME_KA); |
514 | dbbuffer = (uint8_t *) frame_alloc(order, FRAME_ATOMIC | FRAME_KA); |
Line 522... | Line 518... | ||
522 | 518 | ||
523 | /* Initialized blank line */ |
519 | /* Initialized blank line */ |
524 | blankline = (uint8_t *) malloc(ROW_BYTES, FRAME_ATOMIC); |
520 | blankline = (uint8_t *) malloc(ROW_BYTES, FRAME_ATOMIC); |
525 | if (!blankline) |
521 | if (!blankline) |
526 | panic("Failed to allocate blank line for framebuffer."); |
522 | panic("Failed to allocate blank line for framebuffer."); |
- | 523 | unsigned int x, y; |
|
527 | for (y = 0; y < FONT_SCANLINES; y++) |
524 | for (y = 0; y < FONT_SCANLINES; y++) |
528 | for (x = 0; x < xres; x++) |
525 | for (x = 0; x < xres; x++) |
529 | (*rgb2scr)(&blankline[POINTPOS(x, y)], COLOR(BGCOLOR)); |
526 | (*rgb2scr)(&blankline[POINTPOS(x, y)], COLOR(BGCOLOR)); |
530 | 527 | ||
531 | clear_screen(); |
528 | clear_screen(); |