Skip to content

Instantly share code, notes, and snippets.

@nicklaslof
Created July 22, 2012 18:45
Show Gist options
  • Select an option

  • Save nicklaslof/3160669 to your computer and use it in GitHub Desktop.

Select an option

Save nicklaslof/3160669 to your computer and use it in GitHub Desktop.
ugly hacks to get gralloc to work on Xperia HDPI devices (atleast mk16i)
don't use.
https://gist.github.com/3194208 and https://gist.github.com/3194307 are better workarounds.
diff --git a/libgralloc/framebuffer.cpp b/libgralloc/framebuffer.cpp
index 1e03a88..a8d3b0a 100644
--- a/libgralloc/framebuffer.cpp
+++ b/libgralloc/framebuffer.cpp
@@ -679,7 +679,7 @@ int mapFrameBufferLocked(struct private_module_t* module)
float ydpi = (info.yres * 25.4f) / info.height;
//The reserved[4] field is used to store FPS by the driver.
float fps = info.reserved[4];
-
+ info.yres_virtual = 1708;
// can probably be info.yres_virtual = inf.yres*2;
ALOGI("using (fd=%d)\n"
"id = %s\n"
"xres = %d px\n"
diff --git a/drivers/video/msm/msm_fb.c b/drivers/video/msm/msm_fb.c
index 6ab377e..dcfe0df 100644
--- a/drivers/video/msm/msm_fb.c
+++ b/drivers/video/msm/msm_fb.c
@@ -925,16 +925,16 @@ static int msm_fb_register(struct msm_fb_data_type *mfd)
fix->xpanstep = 1;
fix->ypanstep = 1;
var->vmode = FB_VMODE_NONINTERLACED;
- var->blue.offset = 24;
- var->green.offset = 16;
- var->red.offset = 8;
+ var->blue.offset = 0;
+ var->green.offset = 8;
+ var->red.offset = 16;
var->blue.length = 8;
var->green.length = 8;
var->red.length = 8;
var->blue.msb_right = 0;
var->green.msb_right = 0;
var->red.msb_right = 0;
- var->transp.offset = 0;
+ var->transp.offset = 24;
var->transp.length = 8;
bpp = 4;
break;
@@ -944,16 +944,16 @@ static int msm_fb_register(struct msm_fb_data_type *mfd)
fix->xpanstep = 1;
fix->ypanstep = 1;
var->vmode = FB_VMODE_NONINTERLACED;
- var->blue.offset = 16;
- var->green.offset = 8;
- var->red.offset = 0;
+ var->blue.offset = 8;
+ var->green.offset = 16;
+ var->red.offset = 24;
var->blue.length = 8;
var->green.length = 8;
var->red.length = 8;
var->blue.msb_right = 0;
var->green.msb_right = 0;
var->red.msb_right = 0;
- var->transp.offset = 24;
+ var->transp.offset = 0;
var->transp.length = 8;
bpp = 4;
break;
@@ -1317,11 +1317,16 @@ DECLARE_MUTEX(msm_fb_pan_sem);
static int msm_fb_pan_display(struct fb_var_screeninfo *var,
struct fb_info *info)
{
- struct mdp_dirty_region dirty;
+struct mdp_dirty_region dirty;
struct mdp_dirty_region *dirtyPtr = NULL;
struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)info->par;
struct msm_fb_panel_data *pdata =
(struct msm_fb_panel_data *)mfd->pdev->dev.platform_data;
+ if (info->node == 1 || info->node == 2) {
+ pr_err("%s: no pan display for fb%d!",
+ __func__, info->node);
+ return -EPERM;
+ }
if ((!mfd->op_enable) || (!mfd->panel_power_on))
return -EPERM;
@@ -1397,8 +1402,10 @@ static int msm_fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
{
struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)info->par;
+ printk(KERN_WARNING "FB_ROTATE_UR");
if (var->rotate != FB_ROTATE_UR)
return -EINVAL;
+ printk(KERN_WARNING "grayscale");
if (var->grayscale != info->var.grayscale)
return -EINVAL;
@@ -1438,33 +1445,40 @@ static int msm_fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
break;
case 32:
- /* Figure out if the user meant RGBA or ARGB
- and verify the position of the RGB components */
+ printk(KERN_WARNING,"case 32");
if (var->transp.offset == 24) {
- if ((var->blue.offset != 16) ||
+ printk(KERN_WARNING "offset 24");
+ if ((var->blue.offset != 0) ||
(var->green.offset != 8) ||
- (var->red.offset != 0))
+ (var->red.offset != 16)){
+ printk(KERN_WARNING "1");
return -EINVAL;
+ }
} else if (var->transp.offset == 0) {
- if ((var->blue.offset != 24) ||
+ printk(KERN_WARNING "offset 0");
+ if ((var->blue.offset != 8) ||
(var->green.offset != 16) ||
- (var->red.offset != 8))
+ (var->red.offset != 24)){
+ printk(KERN_WARNING "2");
return -EINVAL;
- } else
+ }
+ } else{
+ printk(KERN_WARNING "first else");
return -EINVAL;
+ }
- /* Check the common values for both RGBA and ARGB */
-
+ printk(KERN_WARNING "checking common");
if ((var->blue.length != 8) ||
(var->green.length != 8) ||
(var->red.length != 8) ||
(var->transp.length != 8) ||
(var->blue.msb_right != 0) ||
(var->green.msb_right != 0) ||
- (var->red.msb_right != 0))
+ (var->red.msb_right != 0)){
+ printk(KERN_WARNING "common failed");
return -EINVAL;
-
+ }
break;
default:
@@ -1472,25 +1486,35 @@ static int msm_fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
}
if ((var->xres_virtual <= 0) || (var->yres_virtual <= 0))
- return -EINVAL;
+ {printk(KERN_WARNING "3");
+ return -EINVAL;}
if (info->fix.smem_len <
(var->xres_virtual*var->yres_virtual*(var->bits_per_pixel/8)))
- return -EINVAL;
+ {printk(KERN_WARNING "4");
+ return -EINVAL;}
if ((var->xres == 0) || (var->yres == 0))
- return -EINVAL;
+ {printk(KERN_WARNING "5");
+ return -EINVAL;}
if ((var->xres > mfd->panel_info.xres) ||
(var->yres > mfd->panel_info.yres))
- return -EINVAL;
+ {printk(KERN_WARNING "6");
+ return -EINVAL;}
if (var->xoffset > (var->xres_virtual - var->xres))
- return -EINVAL;
-
+ {printk(KERN_WARNING "7");
+ return -EINVAL;}
+/*
if (var->yoffset > (var->yres_virtual - var->yres))
- return -EINVAL;
-
+ {printk(KERN_WARNING "8");
+ printk(KERN_WARNING "yoffset: %u",var->yoffset);
+ printk(KERN_WARNING "virtual: %u",var->yres_virtual);
+ printk(KERN_WARNING "yres: %u",var->yres);
+ return -EINVAL;}
+*/
+ printk(KERN_WARNING "return 0");
return 0;
}
@@ -1521,7 +1545,7 @@ static int msm_fb_set_par(struct fb_info *info)
break;
case 32:
- if (var->transp.offset == 0)
+ if (var->transp.offset == 24)
mfd->fb_imgType = MDP_ARGB_8888;
else
mfd->fb_imgType = MDP_RGBA_8888;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment