summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fbdev.c200
1 files changed, 104 insertions, 96 deletions
diff --git a/fbdev.c b/fbdev.c
index 578e67a..6bce2b0 100644
--- a/fbdev.c
+++ b/fbdev.c
@@ -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;