diff options
-rw-r--r-- | fbdev.c | 200 |
1 files changed, 104 insertions, 96 deletions
@@ -43,6 +43,10 @@ struct device { struct fb_fix_screeninfo fix_info; struct fb_var_screeninfo var_info; + + struct fb_bitfield red; + struct fb_bitfield green; + struct fb_bitfield blue; }; enum fb_fill_mode { @@ -332,6 +336,10 @@ static int fb_update_info(struct device *dev) return ret; } + dev->red = dev->var_info.red; + dev->green = dev->var_info.green; + dev->blue = dev->var_info.blue; + return 0; } @@ -606,42 +614,42 @@ static int fb_pan(struct device *dev, unsigned int x, unsigned int y) * Test pattern */ -#define FB_MAKE_COLOR(var, r, g, b) \ - ((((r) >> (8 - (var)->red.length)) << (var)->red.offset) | \ - (((g) >> (8 - (var)->green.length)) << (var)->green.offset) | \ - (((b) >> (8 - (var)->blue.length)) << (var)->blue.offset)) +#define FB_MAKE_COLOR(dev, r, g, b) \ + ((((r) >> (8 - (dev)->red.length)) << (dev)->red.offset) | \ + (((g) >> (8 - (dev)->green.length)) << (dev)->green.offset) | \ + (((b) >> (8 - (dev)->blue.length)) << (dev)->blue.offset)) static void fb_fill_smpte_rgb16(struct device *dev, unsigned int xoffset, unsigned int yoffset, unsigned int xres, unsigned int yres) { const uint16_t colors_top[] = { - FB_MAKE_COLOR(&dev->var_info, 192, 192, 192), /* grey */ - FB_MAKE_COLOR(&dev->var_info, 192, 192, 0), /* yellow */ - FB_MAKE_COLOR(&dev->var_info, 0, 192, 192), /* cyan */ - FB_MAKE_COLOR(&dev->var_info, 0, 192, 0), /* green */ - FB_MAKE_COLOR(&dev->var_info, 192, 0, 192), /* magenta */ - FB_MAKE_COLOR(&dev->var_info, 192, 0, 0), /* red */ - FB_MAKE_COLOR(&dev->var_info, 0, 0, 192), /* blue */ + FB_MAKE_COLOR(dev, 192, 192, 192), /* grey */ + FB_MAKE_COLOR(dev, 192, 192, 0), /* yellow */ + FB_MAKE_COLOR(dev, 0, 192, 192), /* cyan */ + FB_MAKE_COLOR(dev, 0, 192, 0), /* green */ + FB_MAKE_COLOR(dev, 192, 0, 192), /* magenta */ + FB_MAKE_COLOR(dev, 192, 0, 0), /* red */ + FB_MAKE_COLOR(dev, 0, 0, 192), /* blue */ }; const uint16_t colors_middle[] = { - FB_MAKE_COLOR(&dev->var_info, 0, 0, 192), /* blue */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR(&dev->var_info, 192, 0, 192), /* magenta */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR(&dev->var_info, 0, 192, 192), /* cyan */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR(&dev->var_info, 192, 192, 192), /* grey */ + FB_MAKE_COLOR(dev, 0, 0, 192), /* blue */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR(dev, 192, 0, 192), /* magenta */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR(dev, 0, 192, 192), /* cyan */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR(dev, 192, 192, 192), /* grey */ }; const uint16_t colors_bottom[] = { - FB_MAKE_COLOR(&dev->var_info, 0, 33, 76), /* in-phase */ - FB_MAKE_COLOR(&dev->var_info, 255, 255, 255), /* super white */ - FB_MAKE_COLOR(&dev->var_info, 50, 0, 106), /* quadrature */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR(&dev->var_info, 9, 9, 9), /* 3.5% */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* 7.5% */ - FB_MAKE_COLOR(&dev->var_info, 29, 29, 29), /* 11.5% */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* black */ + FB_MAKE_COLOR(dev, 0, 33, 76), /* in-phase */ + FB_MAKE_COLOR(dev, 255, 255, 255), /* super white */ + FB_MAKE_COLOR(dev, 50, 0, 106), /* quadrature */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR(dev, 9, 9, 9), /* 3.5% */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* 7.5% */ + FB_MAKE_COLOR(dev, 29, 29, 29), /* 11.5% */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* black */ }; void *mem = dev->mem + dev->fix_info.line_length * yoffset + xoffset * dev->var_info.bits_per_pixel / 8; @@ -678,40 +686,40 @@ struct fb_color24 { unsigned int value:24; } __attribute__((__packed__)); -#define FB_MAKE_COLOR24(var, r, g, b) \ - { .value = FB_MAKE_COLOR(var, r, g, b) } +#define FB_MAKE_COLOR24(dev, r, g, b) \ + { .value = FB_MAKE_COLOR(dev, r, g, b) } static void fb_fill_smpte_rgb24(struct device *dev, unsigned int xoffset, unsigned int yoffset, unsigned int xres, unsigned int yres) { const struct fb_color24 colors_top[] = { - FB_MAKE_COLOR24(&dev->var_info, 192, 192, 192), /* grey */ - FB_MAKE_COLOR24(&dev->var_info, 192, 192, 0), /* yellow */ - FB_MAKE_COLOR24(&dev->var_info, 0, 192, 192), /* cyan */ - FB_MAKE_COLOR24(&dev->var_info, 0, 192, 0), /* green */ - FB_MAKE_COLOR24(&dev->var_info, 192, 0, 192), /* magenta */ - FB_MAKE_COLOR24(&dev->var_info, 192, 0, 0), /* red */ - FB_MAKE_COLOR24(&dev->var_info, 0, 0, 192), /* blue */ + FB_MAKE_COLOR24(dev, 192, 192, 192), /* grey */ + FB_MAKE_COLOR24(dev, 192, 192, 0), /* yellow */ + FB_MAKE_COLOR24(dev, 0, 192, 192), /* cyan */ + FB_MAKE_COLOR24(dev, 0, 192, 0), /* green */ + FB_MAKE_COLOR24(dev, 192, 0, 192), /* magenta */ + FB_MAKE_COLOR24(dev, 192, 0, 0), /* red */ + FB_MAKE_COLOR24(dev, 0, 0, 192), /* blue */ }; const struct fb_color24 colors_middle[] = { - FB_MAKE_COLOR24(&dev->var_info, 0, 0, 192), /* blue */ - FB_MAKE_COLOR24(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR24(&dev->var_info, 192, 0, 192), /* magenta */ - FB_MAKE_COLOR24(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR24(&dev->var_info, 0, 192, 192), /* cyan */ - FB_MAKE_COLOR24(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR24(&dev->var_info, 192, 192, 192), /* grey */ + FB_MAKE_COLOR24(dev, 0, 0, 192), /* blue */ + FB_MAKE_COLOR24(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR24(dev, 192, 0, 192), /* magenta */ + FB_MAKE_COLOR24(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR24(dev, 0, 192, 192), /* cyan */ + FB_MAKE_COLOR24(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR24(dev, 192, 192, 192), /* grey */ }; const struct fb_color24 colors_bottom[] = { - FB_MAKE_COLOR24(&dev->var_info, 0, 33, 76), /* in-phase */ - FB_MAKE_COLOR24(&dev->var_info, 255, 255, 255), /* super white */ - FB_MAKE_COLOR24(&dev->var_info, 50, 0, 106), /* quadrature */ - FB_MAKE_COLOR24(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR24(&dev->var_info, 9, 9, 9), /* 3.5% */ - FB_MAKE_COLOR24(&dev->var_info, 19, 19, 19), /* 7.5% */ - FB_MAKE_COLOR24(&dev->var_info, 29, 29, 29), /* 11.5% */ - FB_MAKE_COLOR24(&dev->var_info, 19, 19, 19), /* black */ + FB_MAKE_COLOR24(dev, 0, 33, 76), /* in-phase */ + FB_MAKE_COLOR24(dev, 255, 255, 255), /* super white */ + FB_MAKE_COLOR24(dev, 50, 0, 106), /* quadrature */ + FB_MAKE_COLOR24(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR24(dev, 9, 9, 9), /* 3.5% */ + FB_MAKE_COLOR24(dev, 19, 19, 19), /* 7.5% */ + FB_MAKE_COLOR24(dev, 29, 29, 29), /* 11.5% */ + FB_MAKE_COLOR24(dev, 19, 19, 19), /* black */ }; void *mem = dev->mem + dev->fix_info.line_length * yoffset + xoffset * dev->var_info.bits_per_pixel / 8; @@ -751,32 +759,32 @@ fb_fill_smpte_rgb32(struct device *dev, unsigned int xoffset, unsigned int yoffset, unsigned int xres, unsigned int yres) { const uint32_t colors_top[] = { - FB_MAKE_COLOR(&dev->var_info, 192, 192, 192), /* grey */ - FB_MAKE_COLOR(&dev->var_info, 192, 192, 0), /* yellow */ - FB_MAKE_COLOR(&dev->var_info, 0, 192, 192), /* cyan */ - FB_MAKE_COLOR(&dev->var_info, 0, 192, 0), /* green */ - FB_MAKE_COLOR(&dev->var_info, 192, 0, 192), /* magenta */ - FB_MAKE_COLOR(&dev->var_info, 192, 0, 0), /* red */ - FB_MAKE_COLOR(&dev->var_info, 0, 0, 192), /* blue */ + FB_MAKE_COLOR(dev, 192, 192, 192), /* grey */ + FB_MAKE_COLOR(dev, 192, 192, 0), /* yellow */ + FB_MAKE_COLOR(dev, 0, 192, 192), /* cyan */ + FB_MAKE_COLOR(dev, 0, 192, 0), /* green */ + FB_MAKE_COLOR(dev, 192, 0, 192), /* magenta */ + FB_MAKE_COLOR(dev, 192, 0, 0), /* red */ + FB_MAKE_COLOR(dev, 0, 0, 192), /* blue */ }; const uint32_t colors_middle[] = { - FB_MAKE_COLOR(&dev->var_info, 0, 0, 192), /* blue */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR(&dev->var_info, 192, 0, 192), /* magenta */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR(&dev->var_info, 0, 192, 192), /* cyan */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR(&dev->var_info, 192, 192, 192), /* grey */ + FB_MAKE_COLOR(dev, 0, 0, 192), /* blue */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR(dev, 192, 0, 192), /* magenta */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR(dev, 0, 192, 192), /* cyan */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR(dev, 192, 192, 192), /* grey */ }; const uint32_t colors_bottom[] = { - FB_MAKE_COLOR(&dev->var_info, 0, 33, 76), /* in-phase */ - FB_MAKE_COLOR(&dev->var_info, 255, 255, 255), /* super white */ - FB_MAKE_COLOR(&dev->var_info, 50, 0, 106), /* quadrature */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR(&dev->var_info, 9, 9, 9), /* 3.5% */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* 7.5% */ - FB_MAKE_COLOR(&dev->var_info, 29, 29, 29), /* 11.5% */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* black */ + FB_MAKE_COLOR(dev, 0, 33, 76), /* in-phase */ + FB_MAKE_COLOR(dev, 255, 255, 255), /* super white */ + FB_MAKE_COLOR(dev, 50, 0, 106), /* quadrature */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR(dev, 9, 9, 9), /* 3.5% */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* 7.5% */ + FB_MAKE_COLOR(dev, 29, 29, 29), /* 11.5% */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* black */ }; void *mem = dev->mem + dev->fix_info.line_length * yoffset + xoffset * dev->var_info.bits_per_pixel / 8; @@ -839,14 +847,14 @@ fb_fill_lines_rgb16(struct device *dev, unsigned int xoffset, unsigned int yoffset, unsigned int xres, unsigned int yres) { const uint16_t colors[] = { - FB_MAKE_COLOR(&dev->var_info, 192, 192, 0), /* yellow */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR(&dev->var_info, 0, 192, 0), /* green */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR(&dev->var_info, 192, 0, 0), /* red */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR(&dev->var_info, 0, 0, 192), /* blue */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* black */ + FB_MAKE_COLOR(dev, 192, 192, 0), /* yellow */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR(dev, 0, 192, 0), /* green */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR(dev, 192, 0, 0), /* red */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR(dev, 0, 0, 192), /* blue */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* black */ }; void *mem = dev->mem + dev->fix_info.line_length * yoffset + xoffset * dev->var_info.bits_per_pixel / 8; @@ -871,14 +879,14 @@ fb_fill_lines_rgb24(struct device *dev, unsigned int xoffset, unsigned int yoffset, unsigned int xres, unsigned int yres) { const struct fb_color24 colors[] = { - FB_MAKE_COLOR24(&dev->var_info, 192, 192, 0), /* yellow */ - FB_MAKE_COLOR24(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR24(&dev->var_info, 0, 192, 0), /* green */ - FB_MAKE_COLOR24(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR24(&dev->var_info, 192, 0, 0), /* red */ - FB_MAKE_COLOR24(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR24(&dev->var_info, 0, 0, 192), /* blue */ - FB_MAKE_COLOR24(&dev->var_info, 19, 19, 19), /* black */ + FB_MAKE_COLOR24(dev, 192, 192, 0), /* yellow */ + FB_MAKE_COLOR24(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR24(dev, 0, 192, 0), /* green */ + FB_MAKE_COLOR24(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR24(dev, 192, 0, 0), /* red */ + FB_MAKE_COLOR24(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR24(dev, 0, 0, 192), /* blue */ + FB_MAKE_COLOR24(dev, 19, 19, 19), /* black */ }; void *mem = dev->mem + dev->fix_info.line_length * yoffset + xoffset * dev->var_info.bits_per_pixel / 8; @@ -903,14 +911,14 @@ fb_fill_lines_rgb32(struct device *dev, unsigned int xoffset, unsigned int yoffset, unsigned int xres, unsigned int yres) { const uint32_t colors[] = { - FB_MAKE_COLOR(&dev->var_info, 192, 192, 0), /* yellow */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR(&dev->var_info, 0, 192, 0), /* green */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR(&dev->var_info, 192, 0, 0), /* red */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* black */ - FB_MAKE_COLOR(&dev->var_info, 0, 0, 192), /* blue */ - FB_MAKE_COLOR(&dev->var_info, 19, 19, 19), /* black */ + FB_MAKE_COLOR(dev, 192, 192, 0), /* yellow */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR(dev, 0, 192, 0), /* green */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR(dev, 192, 0, 0), /* red */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* black */ + FB_MAKE_COLOR(dev, 0, 0, 192), /* blue */ + FB_MAKE_COLOR(dev, 19, 19, 19), /* black */ }; void *mem = dev->mem + dev->fix_info.line_length * yoffset + xoffset * dev->var_info.bits_per_pixel / 8; |