Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/fb/kfb/port.c

    r8d2dd7f2 rf4665bdc  
    6666
    6767typedef struct {
     68        sysarg_t paddr;
    6869        sysarg_t width;
    6970        sysarg_t height;
     
    8586static vslmode_list_element_t pixel_mode;
    8687
    87 static pixel_t color_table[16] = {
    88         [COLOR_BLACK]       = 0x000000,
    89         [COLOR_BLUE]        = 0x0000f0,
    90         [COLOR_GREEN]       = 0x00f000,
    91         [COLOR_CYAN]        = 0x00f0f0,
    92         [COLOR_RED]         = 0xf00000,
    93         [COLOR_MAGENTA]     = 0xf000f0,
    94         [COLOR_YELLOW]      = 0xf0f000,
    95         [COLOR_WHITE]       = 0xf0f0f0,
    96 
    97         [COLOR_BLACK + 8]   = 0x000000,
    98         [COLOR_BLUE + 8]    = 0x0000ff,
    99         [COLOR_GREEN + 8]   = 0x00ff00,
    100         [COLOR_CYAN + 8]    = 0x00ffff,
    101         [COLOR_RED + 8]     = 0xff0000,
    102         [COLOR_MAGENTA + 8] = 0xff00ff,
    103         [COLOR_YELLOW + 8]  = 0xffff00,
    104         [COLOR_WHITE + 8]   = 0xffffff,
    105 };
    106 
    107 static inline void attrs_rgb(char_attrs_t attrs, pixel_t *bgcolor, pixel_t *fgcolor)
    108 {
    109         switch (attrs.type) {
    110         case CHAR_ATTR_STYLE:
    111                 switch (attrs.val.style) {
    112                 case STYLE_NORMAL:
    113                         *bgcolor = color_table[COLOR_WHITE];
    114                         *fgcolor = color_table[COLOR_BLACK];
    115                         break;
    116                 case STYLE_EMPHASIS:
    117                         *bgcolor = color_table[COLOR_WHITE];
    118                         *fgcolor = color_table[COLOR_RED];
    119                         break;
    120                 case STYLE_INVERTED:
    121                         *bgcolor = color_table[COLOR_BLACK];
    122                         *fgcolor = color_table[COLOR_WHITE];
    123                         break;
    124                 case STYLE_SELECTED:
    125                         *bgcolor = color_table[COLOR_RED];
    126                         *fgcolor = color_table[COLOR_WHITE];
    127                         break;
    128                 }
    129                 break;
    130         case CHAR_ATTR_INDEX:
    131                 *bgcolor = color_table[(attrs.val.index.bgcolor & 7) |
    132                     ((attrs.val.index.attr & CATTR_BRIGHT) ? 8 : 0)];
    133                 *fgcolor = color_table[(attrs.val.index.fgcolor & 7) |
    134                     ((attrs.val.index.attr & CATTR_BRIGHT) ? 8 : 0)];
    135                 break;
    136         case CHAR_ATTR_RGB:
    137                 *bgcolor = attrs.val.rgb.bgcolor;
    138                 *fgcolor = attrs.val.rgb.fgcolor;
    139                 break;
    140         }
    141 }
    142 
    14388static int kfb_claim(visualizer_t *vs)
    14489{
    145         return EOK;
     90        return physmem_map(kfb.paddr + kfb.offset,
     91            ALIGN_UP(kfb.size, PAGE_SIZE) >> PAGE_WIDTH,
     92            AS_AREA_READ | AS_AREA_WRITE, (void *) &kfb.addr);
    14693}
    14794
    14895static int kfb_yield(visualizer_t *vs)
    14996{
     97        int rc;
     98
    15099        if (vs->mode_set) {
    151100                vs->ops.handle_damage = NULL;
    152101        }
    153102
     103        rc = physmem_unmap(kfb.addr);
     104        if (rc != EOK)
     105                return rc;
     106
     107        kfb.addr = NULL;
    154108        return EOK;
    155109}
     
    211165{
    212166        visualizer_t *vsl;
     167        int rc;
    213168
    214169        vsl = (visualizer_t *) ddf_fun_data_get((ddf_fun_t *)arg);
    215170        graph_visualizer_connection(vsl, iid, icall, NULL);
     171
     172        if (kfb.addr != NULL) {
     173                rc = physmem_unmap(kfb.addr);
     174                if (rc == EOK)
     175                        kfb.addr = NULL;
     176        }
    216177}
    217178
     
    266227        kfb.width = width;
    267228        kfb.height = height;
     229        kfb.paddr = paddr;
    268230        kfb.offset = offset;
    269231        kfb.scanline = scanline;
     
    343305        kfb.size = scanline * height;
    344306        kfb.addr = AS_AREA_ANY;
    345        
    346         rc = physmem_map(paddr + offset,
    347             ALIGN_UP(kfb.size, PAGE_SIZE) >> PAGE_WIDTH,
    348             AS_AREA_READ | AS_AREA_WRITE, (void *) &kfb.addr);
    349         if (rc != EOK)
    350                 return rc;
    351307       
    352308        ddf_fun_t *fun_vs = ddf_fun_create(dev, fun_exposed, "vsl0");
Note: See TracChangeset for help on using the changeset viewer.