From 9c2332f1376f5fb7c87f16dff77e9270eb7c91c8 Mon Sep 17 00:00:00 2001 From: Matt Porter Date: Tue, 22 Nov 2011 10:48:32 -0500 Subject: [PATCH 3/3] st7735fb: Make FB native endian on little endian platforms This is a quick unoptimized implementation of a shadow swap buffer which is engaged on little endian platforms. It's not DMA safe at this point nor is it particularly optimized during updates. This is ok atm since the point is to be compatible with all the user space code out there that assumes that all FBdevs are native endian. Now things like "cat foo.rgb565 > /dev/fb0" work as well as standard apps like fbv with no byte swapping mods. Signed-off-by: Matt Porter Signed-off-by: Koen Kooi --- drivers/video/st7735fb.c | 26 ++++++++++++++++++++------ include/video/st7735fb.h | 1 + 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/drivers/video/st7735fb.c b/drivers/video/st7735fb.c index 500cc88..69ad3d0 100644 --- drivers.old/video/st7735fb.c +++ drivers/video/st7735fb.c @@ -244,7 +244,14 @@ static void st7735fb_update_display(struct st7735fb_par *par) { int ret = 0; u8 *vmem = par->info->screen_base; +#ifdef __LITTLE_ENDIAN + int i; + u16 *vmem16 = (u16 *)vmem; + u16 *ssbuf = par->ssbuf; + for (i=0; iinfo->fix.id); @@ -417,12 +428,7 @@ static int __devinit st7735fb_probe (struct spi_device *spi) info->var.blue.length = 5; info->var.transp.offset = 0; info->var.transp.length = 0; - info->flags = FBINFO_FLAG_DEFAULT | -#ifdef __LITTLE_ENDIAN - FBINFO_FOREIGN_ENDIAN | -#endif - FBINFO_VIRTFB; - + info->flags = FBINFO_FLAG_DEFAULT | FBINFO_VIRTFB; info->fbdefio = &st7735fb_defio; fb_deferred_io_init(info); @@ -432,6 +438,14 @@ static int __devinit st7735fb_probe (struct spi_device *spi) par->rst = pdata->rst_gpio; par->dc = pdata->dc_gpio; +#ifdef __LITTLE_ENDIAN + /* Allocate swapped shadow buffer */ + vmem = vzalloc(vmem_size); + if (!vmem) + return retval; + par->ssbuf = vmem; +#endif + retval = register_framebuffer(info); if (retval < 0) goto fbreg_fail; diff --git a/include/video/st7735fb.h b/include/video/st7735fb.h index 250f036..52f5182 100644 --- include.orig/video/st7735fb.h +++ include/video/st7735fb.h @@ -34,6 +34,7 @@ enum st7735_cmd { struct st7735fb_par { struct spi_device *spi; struct fb_info *info; + u16 *ssbuf; int rst; int dc; }; -- 1.7.2.5