Subversion Repositories HelenOS

Rev

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();