Changeset 2bc137c2 in mainline


Ignore:
Timestamp:
2006-11-22T12:36:59Z (18 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
ccb0cbc
Parents:
33dc0ad
Message:

make framebuffer code more generic

Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia32/src/drivers/vesa.c

    r33dc0ad r2bc137c2  
    3838
    3939#include <genarch/fb/fb.h>
     40#include <genarch/fb/visuals.h>
    4041#include <arch/drivers/vesa.h>
    4142#include <putchar.h>
     
    6869void vesa_init(void)
    6970{
    70         fb_init(vesa_ph_addr, vesa_width, vesa_height, vesa_bpp, vesa_scanline, false);
     71        unsigned int visual;
     72       
     73        switch (vesa_bpp) {
     74        case 8:
     75                visual = VISUAL_INDIRECT_8;
     76                break;
     77        case 16:
     78                visual = VISUAL_RGB_5_6_5;
     79                break;
     80        case 24:
     81                visual = VISUAL_RGB_8_8_8;
     82                break;
     83        case 32:
     84                visual = VISUAL_RGB_0_8_8_8;
     85                break;
     86        default:
     87                panic("Unsupported bits per pixel");
     88        }
     89       
     90        fb_init(vesa_ph_addr, vesa_width, vesa_height, vesa_scanline, visual);
    7191}
    7292
  • kernel/arch/mips32/src/mips32.c

    r33dc0ad r2bc137c2  
    5454#include <arch/debugger.h>
    5555#include <genarch/fb/fb.h>
     56#include <genarch/fb/visuals.h>
    5657#include <macros.h>
    5758#include <ddi/device.h>
     
    123124        console_init(device_assign_devno());
    124125#ifdef CONFIG_FB
    125         fb_init(0x12000000, 640, 480, 24, 1920, false); // gxemul framebuffer
     126        fb_init(0x12000000, 640, 480, 1920, VISUAL_RGB_8_8_8); // gxemul framebuffer
    126127#endif
    127128        sysinfo_set_item_val("machine." STRING(MACHINE), NULL, 1);
  • kernel/arch/ppc32/src/ppc32.c

    r33dc0ad r2bc137c2  
    3939#include <arch/interrupt.h>
    4040#include <genarch/fb/fb.h>
     41#include <genarch/fb/visuals.h>
    4142#include <userspace.h>
    4243#include <proc/uarg.h>
     
    7677        if (config.cpu_active == 1) {
    7778                /* Initialize framebuffer */
    78                 fb_init(bootinfo.screen.addr, bootinfo.screen.width, bootinfo.screen.height, bootinfo.screen.bpp, bootinfo.screen.scanline, false);
     79                unsigned int visual;
     80               
     81                switch (bootinfo.screen.bpp) {
     82                case 8:
     83                        visual = VISUAL_INDIRECT_8;
     84                        break;
     85                case 16:
     86                        visual = VISUAL_RGB_5_5_5;
     87                        break;
     88                case 24:
     89                        visual = VISUAL_RGB_8_8_8;
     90                        break;
     91                case 32:
     92                        visual = VISUAL_RGB_0_8_8_8;
     93                        break;
     94                default:
     95                        panic("Unsupported bits per pixel");
     96                }
     97                fb_init(bootinfo.screen.addr, bootinfo.screen.width, bootinfo.screen.height, bootinfo.screen.scanline, visual);
    7998               
    8099                /* Initialize IRQ routing */
  • kernel/arch/ppc64/src/ppc64.c

    r33dc0ad r2bc137c2  
    3838#include <arch/interrupt.h>
    3939#include <genarch/fb/fb.h>
     40#include <genarch/fb/visuals.h>
    4041#include <userspace.h>
    4142#include <proc/uarg.h>
     
    6970{
    7071        if (config.cpu_active == 1) {
    71                 fb_init(bootinfo.screen.addr, bootinfo.screen.width, bootinfo.screen.height, bootinfo.screen.bpp, bootinfo.screen.scanline, false);
     72                /* Initialize framebuffer */
     73                unsigned int visual;
     74               
     75                switch (bootinfo.screen.bpp) {
     76                case 8:
     77                        visual = VISUAL_INDIRECT_8;
     78                        break;
     79                case 16:
     80                        visual = VISUAL_RGB_5_5_5;
     81                        break;
     82                case 24:
     83                        visual = VISUAL_RGB_8_8_8;
     84                        break;
     85                case 32:
     86                        visual = VISUAL_RGB_0_8_8_8;
     87                        break;
     88                default:
     89                        panic("Unsupported bits per pixel");
     90                }
     91                fb_init(bootinfo.screen.addr, bootinfo.screen.width, bootinfo.screen.height, bootinfo.screen.scanline, visual);
     92               
    7293       
    7394                /* Merge all zones to 1 big zone */
  • kernel/arch/sparc64/src/drivers/scr.c

    r33dc0ad r2bc137c2  
    3636#include <genarch/ofw/ofw_tree.h>
    3737#include <genarch/fb/fb.h>
     38#include <genarch/fb/visuals.h>
    3839#include <arch/types.h>
    3940#include <typedefs.h>
     
    7677        uint32_t fb_linebytes = 0;
    7778        uint32_t fb_scanline = 0;
     79        unsigned int visual;
    7880
    7981        prop = ofw_tree_getprop(node, "width");
     
    116118                        return;
    117119                }
    118 
    119                 if (fb_depth == 24)
     120               
     121                switch (fb_depth) {
     122                case 8:
     123                        fb_scanline = fb_linebytes * (fb_depth >> 3);
     124                        visual = VISUAL_INDIRECT_8;
     125                        break;
     126                case 16:
     127                        fb_scanline = fb_linebytes * (fb_depth >> 3);
     128                        visual = VISUAL_RGB_5_6_5;
     129                        break;
     130                case 24:
    120131                        fb_scanline = fb_linebytes * 4;
    121                 else
     132                        visual = VISUAL_RGB_8_8_8_0;
     133                        break;
     134                case 32:
    122135                        fb_scanline = fb_linebytes * (fb_depth >> 3);
     136                        visual = VISUAL_RGB_0_8_8_8;
     137                        break;
     138                default:
     139                        printf("Unsupported bits per pixel.\n");
     140                        return;
     141                }
    123142               
    124143                break;
    125144        case SCR_FFB:   
    126                 fb_depth = 32;
    127145                fb_scanline = 8192;
     146                visual = VISUAL_RGB_0_8_8_8;
    128147
    129148                ofw_upa_reg_t *reg = &((ofw_upa_reg_t *) prop->value)[FFB_REG_24BPP];
     
    138157        }
    139158
    140         fb_init(fb_addr, fb_width, fb_height, fb_depth, fb_scanline, true);
     159        fb_init(fb_addr, fb_width, fb_height, fb_scanline, visual);
    141160}
    142161
  • kernel/genarch/include/fb/fb.h

    r33dc0ad r2bc137c2  
    4040
    4141extern spinlock_t fb_lock;
    42 void fb_init(uintptr_t addr, unsigned int x, unsigned int y, unsigned int bpp, unsigned int scan, bool align);
     42void fb_init(uintptr_t addr, unsigned int x, unsigned int y, unsigned int scan, unsigned int visual);
    4343
    4444#endif
  • kernel/genarch/src/fb/fb.c

    r33dc0ad r2bc137c2  
    3434
    3535#include <genarch/fb/font-8x16.h>
     36#include <genarch/fb/visuals.h>
    3637#include <genarch/fb/fb.h>
    3738#include <console/chardev.h>
     
    5960static unsigned int yres = 0;
    6061static unsigned int scanline = 0;
    61 static unsigned int bitspp = 0;
    6262static unsigned int pixelbytes = 0;
    6363#ifdef FB_INVERT_COLORS
     
    9696
    9797/* Conversion routines between different color representations */
    98 static void rgb_4byte(void *dst, int rgb)
     98static void rgb_byte0888(void *dst, int rgb)
    9999{
    100100        *((int *) dst) = rgb;
    101101}
    102102
    103 static int byte4_rgb(void *src)
     103static int byte0888_rgb(void *src)
    104104{
    105105        return (*((int *) src)) & 0xffffff;
    106106}
    107107
    108 static void rgb_3byte(void *dst, int rgb)
     108static void rgb_byte888(void *dst, int rgb)
    109109{
    110110        uint8_t *scr = dst;
     
    120120}
    121121
    122 static int byte3_rgb(void *src)
     122static int byte888_rgb(void *src)
    123123{
    124124        uint8_t *scr = src;
     
    130130}
    131131
     132/**  16-bit depth (5:5:5) */
     133static void rgb_byte555(void *dst, int rgb)
     134{
     135        /* 5-bit, 5-bits, 5-bits */
     136        *((uint16_t *) dst) = RED(rgb, 5) << 10 | GREEN(rgb, 5) << 5 | BLUE(rgb, 5);
     137}
     138
     139/** 16-bit depth (5:5:5) */
     140static int byte555_rgb(void *src)
     141{
     142        int color = *(uint16_t *)(src);
     143        return (((color >> 10) & 0x1f) << (16 + 3)) | (((color >> 5) & 0x1f) << (8 + 3)) | ((color & 0x1f) << 3);
     144}
     145
    132146/**  16-bit depth (5:6:5) */
    133 static void rgb_2byte(void *dst, int rgb)
     147static void rgb_byte565(void *dst, int rgb)
    134148{
    135149        /* 5-bit, 6-bits, 5-bits */
     
    138152
    139153/** 16-bit depth (5:6:5) */
    140 static int byte2_rgb(void *src)
     154static int byte565_rgb(void *src)
    141155{
    142156        int color = *(uint16_t *)(src);
     
    152166 * and setting it to simulate the 8-bit truecolor.
    153167 */
    154 static void rgb_1byte(void *dst, int rgb)
     168static void rgb_byte8(void *dst, int rgb)
    155169{
    156170        *((uint8_t *) dst) = RED(rgb, 3) << 5 | GREEN(rgb, 2) << 3 | BLUE(rgb, 3);
     
    159173/** Return pixel color - 8-bit depth (color palette/3:2:3)
    160174 *
    161  * See the comment for rgb_1byte().
    162  */
    163 static int byte1_rgb(void *src)
     175 * See the comment for rgb_byte().
     176 */
     177static int byte8_rgb(void *src)
    164178{
    165179        int color = *(uint8_t *)src;
     
    208222
    209223        if (dbbuffer) {
    210                 memcpy(&dbbuffer[dboffset * scanline], blankline, FONT_SCANLINES * scanline);
     224                memcpy(&dbbuffer[dboffset * scanline], blankline, ROW_BYTES);
    211225               
    212226                dboffset = (dboffset + FONT_SCANLINES) % yres;
     
    349363/** Initialize framebuffer as a chardev output device
    350364 *
    351  * @param addr  Physical address of the framebuffer
    352  * @param x     Screen width in pixels
    353  * @param y     Screen height in pixels
    354  * @param bpp   Bits per pixel (8, 16, 24, 32)
    355  * @param scan  Bytes per one scanline
    356  * @param align Request alignment for 24bpp mode.
    357  */
    358 void fb_init(uintptr_t addr, unsigned int x, unsigned int y, unsigned int bpp, unsigned int scan, bool align)
    359 {
    360         switch (bpp) {
    361         case 8:
    362                 rgb2scr = rgb_1byte;
    363                 scr2rgb = byte1_rgb;
     365 * @param addr   Physical address of the framebuffer
     366 * @param x      Screen width in pixels
     367 * @param y      Screen height in pixels
     368 * @param scan   Bytes per one scanline
     369 * @param visual Color model
     370 *
     371 */
     372void fb_init(uintptr_t addr, unsigned int x, unsigned int y, unsigned int scan, unsigned int visual)
     373{
     374        switch (visual) {
     375        case VISUAL_INDIRECT_8:
     376                rgb2scr = rgb_byte8;
     377                scr2rgb = byte8_rgb;
    364378                pixelbytes = 1;
    365379                break;
    366         case 16:
    367                 rgb2scr = rgb_2byte;
    368                 scr2rgb = byte2_rgb;
     380        case VISUAL_RGB_5_5_5:
     381                rgb2scr = rgb_byte555;
     382                scr2rgb = byte555_rgb;
    369383                pixelbytes = 2;
    370384                break;
    371         case 24:
    372                 rgb2scr = rgb_3byte;
    373                 scr2rgb = byte3_rgb;
    374                 if (align)
    375                         pixelbytes = 4;
    376                 else
    377                         pixelbytes = 3;
    378                 break;
    379         case 32:
    380                 rgb2scr = rgb_4byte;
    381                 scr2rgb = byte4_rgb;
     385        case VISUAL_RGB_5_6_5:
     386                rgb2scr = rgb_byte565;
     387                scr2rgb = byte565_rgb;
     388                pixelbytes = 2;
     389                break;
     390        case VISUAL_RGB_8_8_8:
     391                rgb2scr = rgb_byte888;
     392                scr2rgb = byte888_rgb;
     393                pixelbytes = 3;
     394                break;
     395        case VISUAL_RGB_8_8_8_0:
     396                rgb2scr = rgb_byte888;
     397                scr2rgb = byte888_rgb;
    382398                pixelbytes = 4;
    383399                break;
     400        case VISUAL_RGB_0_8_8_8:
     401                rgb2scr = rgb_byte0888;
     402                scr2rgb = byte0888_rgb;
     403                pixelbytes = 4;
     404                break;
    384405        default:
    385                 panic("Unsupported bpp.\n");
     406                panic("Unsupported visual.\n");
    386407        }
    387408       
     
    393414        xres = x;
    394415        yres = y;
    395         bitspp = bpp;
    396416        scanline = scan;
    397417       
     
    403423        sysinfo_set_item_val("fb.width", NULL, xres);
    404424        sysinfo_set_item_val("fb.height", NULL, yres);
    405         sysinfo_set_item_val("fb.bpp", NULL, bpp);
    406         sysinfo_set_item_val("fb.bpp-align", NULL, align);
    407425        sysinfo_set_item_val("fb.scanline", NULL, scan);
     426        sysinfo_set_item_val("fb.visual", NULL, visual);
    408427        sysinfo_set_item_val("fb.address.physical", NULL, addr);
    409428        sysinfo_set_item_val("fb.invert-colors", NULL, invert_colors);
  • uspace/fb/fb.c

    r33dc0ad r2bc137c2  
    5050#include <ipc/services.h>
    5151#include <kernel/errno.h>
     52#include <kernel/genarch/fb/visuals.h>
    5253#include <async.h>
     54#include <bool.h>
    5355
    5456#include "font-8x16.h"
     
    148150
    149151/* Conversion routines between different color representations */
    150 static void rgb_4byte(void *dst, int rgb)
     152static void rgb_byte0888(void *dst, int rgb)
    151153{
    152154        *(int *)dst = rgb;
    153155}
    154156
    155 static int byte4_rgb(void *src)
     157static int byte0888_rgb(void *src)
    156158{
    157159        return (*(int *)src) & 0xffffff;
    158160}
    159161
    160 static void rgb_3byte(void *dst, int rgb)
     162static void rgb_byte888(void *dst, int rgb)
    161163{
    162164        uint8_t *scr = dst;
     
    172174}
    173175
    174 static int byte3_rgb(void *src)
     176static int byte888_rgb(void *src)
    175177{
    176178        uint8_t *scr = src;
     
    182184}
    183185
     186/**  16-bit depth (5:5:5) */
     187static void rgb_byte555(void *dst, int rgb)
     188{
     189        /* 5-bit, 5-bits, 5-bits */
     190        *((uint16_t *)(dst)) = RED(rgb, 5) << 10 | GREEN(rgb, 5) << 5 | BLUE(rgb, 5);
     191}
     192
     193/** 16-bit depth (5:5:5) */
     194static int byte555_rgb(void *src)
     195{
     196        int color = *(uint16_t *)(src);
     197        return (((color >> 10) & 0x1f) << (16 + 3)) | (((color >> 5) & 0x1f) << (8 + 3)) | ((color & 0x1f) << 3);
     198}
     199
    184200/**  16-bit depth (5:6:5) */
    185 static void rgb_2byte(void *dst, int rgb)
     201static void rgb_byte565(void *dst, int rgb)
    186202{
    187203        /* 5-bit, 6-bits, 5-bits */
     
    190206
    191207/** 16-bit depth (5:6:5) */
    192 static int byte2_rgb(void *src)
     208static int byte565_rgb(void *src)
    193209{
    194210        int color = *(uint16_t *)(src);
     
    197213
    198214/** Put pixel - 8-bit depth (3:2:3) */
    199 static void rgb_1byte(void *dst, int rgb)
     215static void rgb_byte8(void *dst, int rgb)
    200216{
    201217        *(uint8_t *)dst = RED(rgb, 3) << 5 | GREEN(rgb, 2) << 3 | BLUE(rgb, 3);
     
    203219
    204220/** Return pixel color - 8-bit depth (3:2:3) */
    205 static int byte1_rgb(void *src)
     221static int byte8_rgb(void *src)
    206222{
    207223        int color = *(uint8_t *)src;
     
    453469/** Initialize framebuffer as a chardev output device
    454470 *
    455  * @param addr Address of theframebuffer
    456  * @param xres Screen width in pixels
    457  * @param yres Screen height in pixels
    458  * @param bpp  Bits per pixel (8, 16, 24, 32)
    459  * @param scan Bytes per one scanline
    460  * @param align Alignment for 24bpp mode.
     471 * @param addr          Address of theframebuffer
     472 * @param xres          Screen width in pixels
     473 * @param yres          Screen height in pixels
     474 * @param visual        Bits per pixel (8, 16, 24, 32)
     475 * @param scan          Bytes per one scanline
    461476 * @param invert_colors Inverted colors.
    462477 *
    463478 */
    464 static void
    465 screen_init(void *addr, unsigned int xres, unsigned int yres, unsigned int bpp, unsigned int scan,
    466         int align, int invert_colors)
    467 {
    468         switch (bpp) {
    469         case 8:
    470                 screen.rgb2scr = rgb_1byte;
    471                 screen.scr2rgb = byte1_rgb;
     479static bool screen_init(void *addr, unsigned int xres, unsigned int yres, unsigned int scan, unsigned int visual, bool invert_colors)
     480{
     481        switch (visual) {
     482        case VISUAL_INDIRECT_8:
     483                screen.rgb2scr = rgb_byte8;
     484                screen.scr2rgb = byte8_rgb;
    472485                screen.pixelbytes = 1;
    473486                break;
    474         case 16:
    475                 screen.rgb2scr = rgb_2byte;
    476                 screen.scr2rgb = byte2_rgb;
     487        case VISUAL_RGB_5_5_5:
     488                screen.rgb2scr = rgb_byte555;
     489                screen.scr2rgb = byte555_rgb;
    477490                screen.pixelbytes = 2;
    478491                break;
    479         case 24:
    480                 screen.rgb2scr = rgb_3byte;
    481                 screen.scr2rgb = byte3_rgb;
    482                 if (!align)
    483                         screen.pixelbytes = 3;
    484                 else
    485                         screen.pixelbytes = 4;
    486                 break;
    487         case 32:
    488                 screen.rgb2scr = rgb_4byte;
    489                 screen.scr2rgb = byte4_rgb;
     492        case VISUAL_RGB_5_6_5:
     493                screen.rgb2scr = rgb_byte565;
     494                screen.scr2rgb = byte565_rgb;
     495                screen.pixelbytes = 2;
     496                break;
     497        case VISUAL_RGB_8_8_8:
     498                screen.rgb2scr = rgb_byte888;
     499                screen.scr2rgb = byte888_rgb;
     500                screen.pixelbytes = 3;
     501                break;
     502        case VISUAL_RGB_8_8_8_0:
     503                screen.rgb2scr = rgb_byte888;
     504                screen.scr2rgb = byte888_rgb;
    490505                screen.pixelbytes = 4;
    491506                break;
     507        case VISUAL_RGB_0_8_8_8:
     508                screen.rgb2scr = rgb_byte0888;
     509                screen.scr2rgb = byte0888_rgb;
     510                screen.pixelbytes = 4;
     511                break;
     512        default:
     513                return false;
    492514        }
    493515
     
    499521       
    500522        /* Create first viewport */
    501         viewport_create(0,0,xres,yres);
     523        viewport_create(0, 0, xres, yres);
     524       
     525        return true;
    502526}
    503527
     
    12271251        unsigned int fb_width;
    12281252        unsigned int fb_height;
    1229         unsigned int fb_bpp;
    1230         unsigned int fb_bpp_align;
    12311253        unsigned int fb_scanline;
    1232         unsigned int fb_invert_colors;
     1254        unsigned int fb_visual;
     1255        bool fb_invert_colors;
    12331256        void *fb_addr;
    12341257        size_t asz;
     
    12391262        fb_width = sysinfo_value("fb.width");
    12401263        fb_height = sysinfo_value("fb.height");
    1241         fb_bpp = sysinfo_value("fb.bpp");
    1242         fb_bpp_align = sysinfo_value("fb.bpp-align");
    12431264        fb_scanline = sysinfo_value("fb.scanline");
     1265        fb_visual = sysinfo_value("fb.visual");
    12441266        fb_invert_colors = sysinfo_value("fb.invert-colors");
    12451267
    1246         asz = fb_scanline*fb_height;
     1268        asz = fb_scanline * fb_height;
    12471269        fb_addr = as_get_mappable_page(asz);
    12481270       
     
    12501272                    AS_AREA_READ | AS_AREA_WRITE);
    12511273
    1252         screen_init(fb_addr, fb_width, fb_height, fb_bpp, fb_scanline, fb_bpp_align, fb_invert_colors);
    1253         return 0;
     1274        if (screen_init(fb_addr, fb_width, fb_height, fb_scanline, fb_visual, fb_invert_colors))
     1275                return 0;
     1276       
     1277        return -1;
    12541278}
    12551279
Note: See TracChangeset for help on using the changeset viewer.