Rev 2787 | Rev 3684 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2787 | Rev 3675 | ||
|---|---|---|---|
| Line 189... | Line 189... | ||
| 189 | { |
189 | { |
| 190 | *((uint8_t *) dst) = RED(rgb, 3) << 5 | GREEN(rgb, 2) << 3 | |
190 | *((uint8_t *) dst) = RED(rgb, 3) << 5 | GREEN(rgb, 2) << 3 | |
| 191 | BLUE(rgb, 3); |
191 | BLUE(rgb, 3); |
| 192 | } |
192 | } |
| 193 | 193 | ||
| - | 194 | static void sb1500rgb_byte8(void *dst, int rgb) |
|
| - | 195 | { |
|
| - | 196 | if (RED(rgb, 1) && GREEN(rgb, 1) && BLUE(rgb, 1)) |
|
| - | 197 | *((uint8_t *) dst) = 255; |
|
| - | 198 | else if (RED(rgb, 1) && GREEN(rgb, 1)) |
|
| - | 199 | *((uint8_t *) dst) = 150; |
|
| - | 200 | else if (GREEN(rgb, 1) && BLUE(rgb, 1)) |
|
| - | 201 | *((uint8_t *) dst) = 47; |
|
| - | 202 | else if (RED(rgb, 1) && BLUE(rgb, 1)) |
|
| - | 203 | *((uint8_t *) dst) = 48; |
|
| - | 204 | else if (RED(rgb, 1)) |
|
| - | 205 | *((uint8_t *) dst) = 32; |
|
| - | 206 | else if (GREEN(rgb, 1)) |
|
| - | 207 | *((uint8_t *) dst) = 47; |
|
| - | 208 | else if (BLUE(rgb, 1)) |
|
| - | 209 | *((uint8_t *) dst) = 2; |
|
| - | 210 | else |
|
| - | 211 | *((uint8_t *) dst) = 1; |
|
| - | 212 | } |
|
| - | 213 | ||
| 194 | /** Return pixel color - 8-bit depth (color palette/3:2:3) |
214 | /** Return pixel color - 8-bit depth (color palette/3:2:3) |
| 195 | * |
215 | * |
| 196 | * See the comment for rgb_byte(). |
216 | * See the comment for rgb_byte(). |
| 197 | */ |
217 | */ |
| 198 | static int byte8_rgb(void *src) |
218 | static int byte8_rgb(void *src) |
| Line 434... | Line 454... | ||
| 434 | }; |
454 | }; |
| 435 | 455 | ||
| 436 | 456 | ||
| 437 | /** Initialize framebuffer as a chardev output device |
457 | /** Initialize framebuffer as a chardev output device |
| 438 | * |
458 | * |
| 439 | * @param addr Physical address of the framebuffer |
459 | * @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 | * |
- | |
| 445 | */ |
460 | */ |
| 446 | void fb_init(uintptr_t addr, unsigned int x, unsigned int y, unsigned int scan, |
- | |
| 447 | unsigned int visual) |
461 | void fb_init(fb_properties_t *props) |
| 448 | { |
462 | { |
| 449 | switch (visual) { |
463 | switch (props->visual) { |
| 450 | case VISUAL_INDIRECT_8: |
464 | case VISUAL_INDIRECT_8: |
| 451 | rgb2scr = rgb_byte8; |
465 | rgb2scr = rgb_byte8; |
| 452 | scr2rgb = byte8_rgb; |
466 | scr2rgb = byte8_rgb; |
| 453 | pixelbytes = 1; |
467 | pixelbytes = 1; |
| 454 | break; |
468 | break; |
| - | 469 | case VISUAL_SB1500_PALETTE: |
|
| - | 470 | rgb2scr = sb1500rgb_byte8; |
|
| - | 471 | scr2rgb = byte8_rgb; |
|
| - | 472 | pixelbytes = 1; |
|
| - | 473 | break; |
|
| 455 | case VISUAL_RGB_5_5_5: |
474 | case VISUAL_RGB_5_5_5: |
| 456 | rgb2scr = rgb_byte555; |
475 | rgb2scr = rgb_byte555; |
| 457 | scr2rgb = byte555_rgb; |
476 | scr2rgb = byte555_rgb; |
| 458 | pixelbytes = 2; |
477 | pixelbytes = 2; |
| 459 | break; |
478 | break; |
| Line 484... | Line 503... | ||
| 484 | break; |
503 | break; |
| 485 | default: |
504 | default: |
| 486 | panic("Unsupported visual.\n"); |
505 | panic("Unsupported visual.\n"); |
| 487 | } |
506 | } |
| 488 | 507 | ||
| 489 | unsigned int fbsize = scan * y; |
508 | unsigned int fbsize = props->scan * props->y + props->offset; |
| 490 | 509 | ||
| 491 | /* Map the framebuffer */ |
510 | /* Map the framebuffer */ |
| 492 | fbaddress = (uint8_t *) hw_map((uintptr_t) addr, fbsize); |
511 | fbaddress = (uint8_t *) hw_map((uintptr_t) props->addr, fbsize); |
| - | 512 | fbaddress += props->offset; |
|
| 493 | 513 | ||
| 494 | xres = x; |
514 | xres = props->x; |
| 495 | yres = y; |
515 | yres = props->y; |
| 496 | scanline = scan; |
516 | scanline = props->scan; |
| 497 | 517 | ||
| 498 | rows = y / FONT_SCANLINES; |
518 | rows = props->y / FONT_SCANLINES; |
| 499 | columns = x / COL_WIDTH; |
519 | columns = props->x / COL_WIDTH; |
| 500 | 520 | ||
| 501 | fb_parea.pbase = (uintptr_t) addr; |
521 | fb_parea.pbase = (uintptr_t) props->addr; |
| 502 | fb_parea.vbase = (uintptr_t) fbaddress; |
522 | fb_parea.vbase = (uintptr_t) fbaddress; |
| 503 | fb_parea.frames = SIZE2FRAMES(fbsize); |
523 | fb_parea.frames = SIZE2FRAMES(fbsize); |
| 504 | fb_parea.cacheable = false; |
524 | fb_parea.cacheable = false; |
| 505 | ddi_parea_register(&fb_parea); |
525 | ddi_parea_register(&fb_parea); |
| 506 | 526 | ||
| 507 | sysinfo_set_item_val("fb", NULL, true); |
527 | sysinfo_set_item_val("fb", NULL, true); |
| 508 | sysinfo_set_item_val("fb.kind", NULL, 1); |
528 | sysinfo_set_item_val("fb.kind", NULL, 1); |
| 509 | sysinfo_set_item_val("fb.width", NULL, xres); |
529 | sysinfo_set_item_val("fb.width", NULL, xres); |
| 510 | sysinfo_set_item_val("fb.height", NULL, yres); |
530 | sysinfo_set_item_val("fb.height", NULL, yres); |
| 511 | sysinfo_set_item_val("fb.scanline", NULL, scan); |
531 | sysinfo_set_item_val("fb.scanline", NULL, props->scan); |
| 512 | sysinfo_set_item_val("fb.visual", NULL, visual); |
532 | sysinfo_set_item_val("fb.visual", NULL, props->visual); |
| 513 | sysinfo_set_item_val("fb.address.physical", NULL, addr); |
533 | sysinfo_set_item_val("fb.address.physical", NULL, props->addr); |
| 514 | sysinfo_set_item_val("fb.invert-colors", NULL, invert_colors); |
534 | sysinfo_set_item_val("fb.invert-colors", NULL, invert_colors); |
| 515 | 535 | ||
| 516 | /* Allocate double buffer */ |
536 | /* Allocate double buffer */ |
| 517 | unsigned int order = fnzb(SIZE2FRAMES(fbsize) - 1) + 1; |
537 | unsigned int order = fnzb(SIZE2FRAMES(fbsize) - 1) + 1; |
| 518 | dbbuffer = (uint8_t *) frame_alloc(order, FRAME_ATOMIC | FRAME_KA); |
538 | dbbuffer = (uint8_t *) frame_alloc(order, FRAME_ATOMIC | FRAME_KA); |
| Line 522... | Line 542... | ||
| 522 | 542 | ||
| 523 | /* Initialized blank line */ |
543 | /* Initialized blank line */ |
| 524 | blankline = (uint8_t *) malloc(ROW_BYTES, FRAME_ATOMIC); |
544 | blankline = (uint8_t *) malloc(ROW_BYTES, FRAME_ATOMIC); |
| 525 | if (!blankline) |
545 | if (!blankline) |
| 526 | panic("Failed to allocate blank line for framebuffer."); |
546 | panic("Failed to allocate blank line for framebuffer."); |
| - | 547 | unsigned int x, y; |
|
| 527 | for (y = 0; y < FONT_SCANLINES; y++) |
548 | for (y = 0; y < FONT_SCANLINES; y++) |
| 528 | for (x = 0; x < xres; x++) |
549 | for (x = 0; x < xres; x++) |
| 529 | (*rgb2scr)(&blankline[POINTPOS(x, y)], COLOR(BGCOLOR)); |
550 | (*rgb2scr)(&blankline[POINTPOS(x, y)], COLOR(BGCOLOR)); |
| 530 | 551 | ||
| 531 | clear_screen(); |
552 | clear_screen(); |