I would have liked to have the chance to send this patch in myself as I did the original work. Jonathan, in future please check with people if they want to post their patch before before doing it for them.
Back to the patch. It's pretty much the same as my original impart from the _setcolreg part in which I calculated the offsets using the data in the var structure like so (taken from my original patch):
@@ -290,8 +292,9 @@ static int _setcolreg(struct fb_info *in
if (regno < 16) { u16 pal; - pal = ((red >> 11) << 11) | ((green >> 10) << 5) | - (blue >> 11); + pal = ((red >> (16 - var->red.length)) << var->red.offset) | + ((green >> (16 - var->green.length)) << var->green.offset) | + (blue >> (16 - var->blue.length)); ((u32 *)(info->pseudo_palette))[regno] = pal; } break;
This seems a more flexible way of doing it and means that it would be easier to add extra colour depths which otherwise could end up with lots of "if else's". I'll create a updated patch which uses the method above and post it.
Mark
--- Jonathan McDowell noodles@earth.li wrote:
This patch adds support for an RGB444 mode to the OMAP FB driver; it's used by the Amstrad Delta which has a 12 bit DSTN screen setup in 444 mode.
Mark Underwood did the original work for this patch:
http://www.earth.li/pipermail/e3-hacking/2006-March/000376.html
I have simply updated to the latest git tree.
Signed-Off-By: Jonathan McDowell noodles@earth.li
diff -rupN -X linux-omap/Documentation/dontdiff linux-omap-lcd/drivers/video/omap/lcd_ams_delta.c linux-omap-lcd-444/drivers/video/omap/lcd_ams_delta.c --- linux-omap-lcd/drivers/video/omap/lcd_ams_delta.c 2006-04-02 16:53:09.881449750 +0100 +++ linux-omap-lcd-444/drivers/video/omap/lcd_ams_delta.c 2006-04-02 17:21:04.654931750 +0100 @@ -77,7 +77,7 @@ struct lcd_panel ams_delta_panel = { .name = "ams-delta", .config = 0,
- .bpp = 16,
- .bpp = 12, .data_lines = 16, .x_res = 480, .y_res = 320,
diff -rupN -X linux-omap/Documentation/dontdiff linux-omap-lcd/drivers/video/omap/lcdc.c linux-omap-lcd-444/drivers/video/omap/lcdc.c --- linux-omap-lcd/drivers/video/omap/lcdc.c 2006-04-02 16:56:46.278973750 +0100 +++ linux-omap-lcd-444/drivers/video/omap/lcdc.c 2006-04-02 17:21:47.105584750 +0100 @@ -353,6 +353,7 @@ static int omap_lcdc_setup_plane(int pla omap_lcdc.palette_size = 512; break; case OMAPFB_COLOR_RGB565:
- case OMAPFB_COLOR_RGB444: omap_lcdc.bpp = 16; omap_lcdc.palette_code = 0x4000; omap_lcdc.palette_size = 32;
@@ -720,7 +721,11 @@ static int alloc_fbmem(int req_size) int frame_size; struct lcd_panel *panel = omap_lcdc.fbdev->panel;
- frame_size = PAGE_ALIGN(panel->x_res * panel->bpp / 8 * panel->y_res);
- if (panel->bpp == 12)
frame_size = PAGE_ALIGN(panel->x_res * 16 / 8 * panel->y_res);
- else
frame_size = PAGE_ALIGN(panel->x_res * panel->bpp / 8 *
if (req_size > frame_size) frame_size = req_size; omap_lcdc.vram_size = frame_size;panel->y_res);
diff -rupN -X linux-omap/Documentation/dontdiff linux-omap-lcd/drivers/video/omap/omapfb_main.c linux-omap-lcd-444/drivers/video/omap/omapfb_main.c --- linux-omap-lcd/drivers/video/omap/omapfb_main.c 2006-04-02 15:52:24.524659500 +0100 +++ linux-omap-lcd-444/drivers/video/omap/omapfb_main.c 2006-04-02 17:25:23.947136500 +0100 @@ -239,6 +239,7 @@ static int _setcolreg(struct fb_info *in transp, update_hw_pal); /* Fallthrough */ case OMAPFB_COLOR_RGB565:
- case OMAPFB_COLOR_RGB444: if (r != 0) break;
@@ -249,8 +250,14 @@ static int _setcolreg(struct fb_info *in
if (regno < 16) { u16 pal;
pal = ((red >> 11) << 11) | ((green >> 10) << 5) |
(blue >> 11);
if (fbdev->color_mode == OMAPFB_COLOR_RGB444)
pal = ((red >> 12) << 8) |
((green >> 12) << 4) |
(blue >> 12);
else
pal = ((red >> 11) << 11) |
((green >> 10) << 5) |
} break;(blue >> 11); ((u32 *)(info->pseudo_palette))[regno] = pal;
@@ -402,12 +409,19 @@ static int set_fb_var(struct omapfb_devi unsigned long line_size; struct lcd_panel *panel = fbdev->panel;
- bpp = var->bits_per_pixel = panel->bpp;
- if (panel->bpp == 12)
/* 12-bpp mode stores colours in 16 bits and ignores top 4 */
bpp = var->bits_per_pixel = 16;
- else
bpp = var->bits_per_pixel = panel->bpp;
- switch (bpp) {
- switch (panel->bpp) { case 16: fbdev->color_mode = OMAPFB_COLOR_RGB565; break;
- case 12:
fbdev->color_mode = OMAPFB_COLOR_RGB444;
case 8: fbdev->color_mode = OMAPFB_COLOR_CLUT_8BPP; break;break;
@@ -453,9 +467,21 @@ static int set_fb_var(struct omapfb_devi var->yoffset = var->yres_virtual - var->yres; line_size = var->xres * bpp / 8;
- var->red.offset = 11; var->red.length = 5; var->red.msb_right = 0;
- var->green.offset= 5; var->green.length = 6; var->green.msb_right = 0;
- var->blue.offset = 0; var->blue.length = 5; var->blue.msb_right = 0;
if (fbdev->color_mode == OMAPFB_COLOR_RGB444) {
var->red.offset = 8; var->red.length = 4;
var->red.msb_right = 0;
var->green.offset= 4; var->green.length = 4;
var->green.msb_right = 0;
var->blue.offset = 0; var->blue.length = 4;
var->blue.msb_right = 0;
} else {
var->red.offset = 11; var->red.length = 5;
var->red.msb_right = 0;
var->green.offset= 5; var->green.length = 6;
var->green.msb_right = 0;
var->blue.offset = 0; var->blue.length = 5;
var->blue.msb_right = 0;
}
var->height = -1; var->width = -1;
diff -rupN -X linux-omap/Documentation/dontdiff linux-omap-lcd/include/asm-arm/arch/omapfb.h linux-omap-lcd-444/include/asm-arm/arch/omapfb.h --- linux-omap-lcd/include/asm-arm/arch/omapfb.h 2006-04-02 15:51:02.303521000 +0100 +++ linux-omap-lcd-444/include/asm-arm/arch/omapfb.h 2006-04-02 17:20:38.957325750 +0100 @@ -64,6 +64,7 @@ enum omapfb_color_format { OMAPFB_COLOR_CLUT_4BPP, OMAPFB_COLOR_CLUT_2BPP, OMAPFB_COLOR_CLUT_1BPP,
- OMAPFB_COLOR_RGB444,
};
struct omapfb_update_window { diff -rupN -X linux-omap/Documentation/dontdiff linux-omap-lcd/include/asm-arm/arch-omap/omapfb.h linux-omap-lcd-444/include/asm-arm/arch-omap/omapfb.h --- linux-omap-lcd/include/asm-arm/arch-omap/omapfb.h 2006-04-02 15:51:02.303521000 +0100 +++ linux-omap-lcd-444/include/asm-arm/arch-omap/omapfb.h 2006-04-02 17:20:38.957325750 +0100 @@ -64,6 +64,7 @@ enum omapfb_color_format { OMAPFB_COLOR_CLUT_4BPP, OMAPFB_COLOR_CLUT_2BPP, OMAPFB_COLOR_CLUT_1BPP,
- OMAPFB_COLOR_RGB444,
};
struct omapfb_update_window {
e3-hacking mailing list e3-hacking@earth.li http://www.earth.li/cgi-bin/mailman/listinfo/e3-hacking
___________________________________________________________ To help you stay safe and secure online, we've developed the all new Yahoo! Security Centre. http://uk.security.yahoo.com