From bd072907ae9136f36efd538f183338c729b48552 Mon Sep 17 00:00:00 2001 From: Robert Bragg Date: Thu, 22 May 2008 13:49:31 +0000 Subject: Adds support for changing the fbdev pixel format when the default (e.g. 8bpp pallet mode) isn't supported. git-svn-id: https://svn.o-hand.com/repos/poky/trunk@4544 311d38ba-8fff-0310-9ca6-ca027cbcb966 --- .../psplash/files/psplash-fbdev-pixfmt.patch | 127 +++++++++++++++++++++ meta/packages/psplash/psplash_svn.bb | 4 +- 2 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 meta/packages/psplash/files/psplash-fbdev-pixfmt.patch (limited to 'meta') diff --git a/meta/packages/psplash/files/psplash-fbdev-pixfmt.patch b/meta/packages/psplash/files/psplash-fbdev-pixfmt.patch new file mode 100644 index 000000000..5b866cb11 --- /dev/null +++ b/meta/packages/psplash/files/psplash-fbdev-pixfmt.patch @@ -0,0 +1,127 @@ +Index: psplash-fb.c +=================================================================== +--- psplash-fb.c (revision 376) ++++ psplash-fb.c (working copy) +@@ -25,6 +25,77 @@ + free(fb); + } + ++static int ++attempt_to_change_pixel_format (PSplashFB *fb, ++ struct fb_var_screeninfo *fb_var) ++{ ++ /* By default the framebuffer driver may have set an oversized ++ * yres_virtual to support VT scrolling via the panning interface. ++ * ++ * We don't try and maintain this since it's more likely that we ++ * will fail to increase the bpp if the driver's pre allocated ++ * framebuffer isn't large enough. ++ */ ++ fb_var->yres_virtual = fb_var->yres; ++ ++ /* First try setting an 8,8,8,0 pixel format so we don't have to do ++ * any conversions while drawing. */ ++ ++ fb_var->bits_per_pixel = 32; ++ ++ fb_var->red.offset = 0; ++ fb_var->red.length = 8; ++ ++ fb_var->green.offset = 8; ++ fb_var->green.length = 8; ++ ++ fb_var->blue.offset = 16; ++ fb_var->blue.length = 8; ++ ++ fb_var->transp.offset = 0; ++ fb_var->transp.length = 0; ++ ++ if (ioctl (fb->fd, FBIOPUT_VSCREENINFO, fb_var) == 0) ++ { ++ fprintf(stdout, "Switched to a 32 bpp 8,8,8 frame buffer\n"); ++ return 1; ++ } ++ else ++ { ++ fprintf(stderr, ++ "Error, failed to switch to a 32 bpp 8,8,8 frame buffer\n"); ++ } ++ ++ /* Otherwise try a 16bpp 5,6,5 format */ ++ ++ fb_var->bits_per_pixel = 16; ++ ++ fb_var->red.offset = 11; ++ fb_var->red.length = 5; ++ ++ fb_var->green.offset = 5; ++ fb_var->green.length = 6; ++ ++ fb_var->blue.offset = 0; ++ fb_var->blue.length = 5; ++ ++ fb_var->transp.offset = 0; ++ fb_var->transp.length = 0; ++ ++ if (ioctl (fb->fd, FBIOPUT_VSCREENINFO, fb_var) == 0) ++ { ++ fprintf(stdout, "Switched to a 16 bpp 5,6,5 frame buffer\n"); ++ return 1; ++ } ++ else ++ { ++ fprintf(stderr, ++ "Error, failed to switch to a 16 bpp 5,6,5 frame buffer\n"); ++ } ++ ++ return 0; ++} ++ + PSplashFB* + psplash_fb_new (int angle) + { +@@ -55,20 +126,31 @@ + goto fail; + } + +- if (ioctl (fb->fd, FBIOGET_FSCREENINFO, &fb_fix) == -1 +- || ioctl (fb->fd, FBIOGET_VSCREENINFO, &fb_var) == -1) ++ if (ioctl (fb->fd, FBIOGET_VSCREENINFO, &fb_var) == -1) + { +- perror ("Error getting framebuffer info"); ++ perror ("Error getting variable framebuffer info"); + goto fail; + } + + if (fb_var.bits_per_pixel < 16) + { + fprintf(stderr, +- "Error, no support currently for %i bpp frame buffers\n", ++ "Error, no support currently for %i bpp frame buffers\n" ++ "Trying to change pixel format...\n", + fb_var.bits_per_pixel); ++ if (!attempt_to_change_pixel_format (fb, &fb_var)) ++ goto fail; + } + ++ /* NB: It looks like the fbdev concept of fixed vs variable screen info is ++ * broken. The line_length is part of the fixed info but it can be changed ++ * if you set a new pixel format. */ ++ if (ioctl (fb->fd, FBIOGET_FSCREENINFO, &fb_fix) == -1) ++ { ++ perror ("Error getting fixed framebuffer info"); ++ goto fail; ++ } ++ + fb->real_width = fb->width = fb_var.xres; + fb->real_height = fb->height = fb_var.yres; + fb->bpp = fb_var.bits_per_pixel; +Index: psplash.c +=================================================================== +--- psplash.c (revision 376) ++++ psplash.c (working copy) +@@ -286,3 +286,4 @@ + + return 0; + } ++ diff --git a/meta/packages/psplash/psplash_svn.bb b/meta/packages/psplash/psplash_svn.bb index 825dc1dbc..30626ea95 100644 --- a/meta/packages/psplash/psplash_svn.bb +++ b/meta/packages/psplash/psplash_svn.bb @@ -2,9 +2,11 @@ DESCRIPTION = "Userspace framebuffer boot logo based on usplash." SECTION = "base" LICENSE = "GPL" PV = "0.0+svnr${SRCREV}" +PR = "r1" SRC_URI = "svn://svn.o-hand.com/repos/misc/trunk;module=psplash;proto=http \ - file://psplash-init" + file://psplash-init \ + file://psplash-fbdev-pixfmt.patch;patch=1;pnum=0" S = "${WORKDIR}/psplash" -- cgit v1.2.3