Hi Quingwei,

Maybe there is some change with the Display Mechanism in Android. Last time
I tried on Android 2.2 Eclair, it still can swap color.
Anyways, I am sure that the Android system still need to call to the display
FB driver .
On your Boot Logo, it can swap color, but android system cannot => So I
guess the Android system did not call into the part of code that you changed
in the FB driver.
There are many options for the color space
  /* RGBA 5551 */ /* RGB 565 */ /* RGB 888 */ /* RGBA 8888 */
So I guess the Android system did not call RGB565, instead it call RGB888 or
RGB551 ...etc
You can put a printk("debug message") in the FB code to trace which color
space did Android call to . And you can see your debug trace in logcat
console windows.

Regards,
Tung


On Tue, Sep 13, 2011 at 10:55 AM, <[email protected]> wrote:

>   Hi Tung,
>
> I have tested my FB driver, it’s OK! And I found Boot logo can swap color,
> but android system can’t.
>
> I’m puzzled with this. Does system not use FB?
>
> Best regards,
> Qingwei
>
>  *From:* [email protected]
> *Sent:* Friday, September 09, 2011 1:58 PM
> *To:* Tung Dang <[email protected]>
> *Cc:* android-porting <[email protected]>
> *Subject:* Re: [android-porting] i.MX51 BBG: How to swap red color with
> blue on DISP2 (RGB565 -> BGR565)
>
>   Hi Tung,
>
> Thank you!
>
> I have ever done the similar thing with our FB driver, but it did not take
> effect. Maybe our platform made some special changes, or driver has bugs.
> I’ll check them carefully.
>
> BTW, I wonder if there is another way to implement, e.g. modify fbmem.c or
> other files.
>
> Best regards,
> Qingwei
>
>  *From:* Tung Dang <[email protected]>
> *Sent:* Friday, September 09, 2011 1:19 PM
> *To:* [email protected]
> *Cc:* android-porting <[email protected]>
> *Subject:* Re: [android-porting] i.MX51 BBG: How to swap red color with
> blue on DISP2 (RGB565 -> BGR565)
>
> Hi QingWei,
>
> Last time I tried to swap the color on Android VNC Server, which use the
> virtual frame buffer driver in kernel/drivers/video/vfb.c
> In your case, you should do the same with your FB driver. You should check
> your kernel boot parameter also, to make sure the input setting for your
> Video Output is RGB565.
> But last time I did on Android 2.2, I am not very sure what has been
> changed with the display mechanism on new Android.
>
> <<kernel/drivers/video/vfb.c>>
>
> static int vfb_check_var(struct fb_var_screeninfo *var,
>              struct fb_info *info)
> {
>     u_long line_length;
>
>     /*
>      *  FB_VMODE_CONUPDATE and FB_VMODE_SMOOTH_XPAN are equal!
>      *  as FB_VMODE_SMOOTH_XPAN is only used internally
>      */
>
>     if (var->vmode & FB_VMODE_CONUPDATE) {
>         var->vmode |= FB_VMODE_YWRAP;
>         var->xoffset = info->var.xoffset;
>         var->yoffset = info->var.yoffset;
>     }
>
>     /*
>      *  Some very basic checks
>      */
>     if (!var->xres)
>         var->xres = 1;
>     if (!var->yres)
>         var->yres = 1;
>     if (var->xres > var->xres_virtual)
>         var->xres_virtual = var->xres;
>     if (var->yres > var->yres_virtual)
>         var->yres_virtual = var->yres;
>     if (var->bits_per_pixel <= 1)
>         var->bits_per_pixel = 1;
>     else if (var->bits_per_pixel <= 8)
>         var->bits_per_pixel = 8;
>     else if (var->bits_per_pixel <= 16)
>         var->bits_per_pixel = 16;
>     else if (var->bits_per_pixel <= 24)
>         var->bits_per_pixel = 24;
>     else if (var->bits_per_pixel <= 32)
>         var->bits_per_pixel = 32;
>     else
>         return -EINVAL;
>
>     if (var->xres_virtual < var->xoffset + var->xres)
>         var->xres_virtual = var->xoffset + var->xres;
>     if (var->yres_virtual < var->yoffset + var->yres)
>         var->yres_virtual = var->yoffset + var->yres;
>
>     /*
>      *  Memory limit
>      */
>     line_length =
>         get_line_length(var->xres_virtual, var->bits_per_pixel);
>     if (line_length * var->yres_virtual > videomemorysize)
>         return -ENOMEM;
>
>     /*
>      * Now that we checked it we alter var. The reason being is that the
> video
>      * mode passed in might not work but slight changes to it might make it
>
>      * work. This way we let the user know what is acceptable.
>      */
>     switch (var->bits_per_pixel) {
>     case 1:
>     case 8:
>         var->red.offset = 0;
>         var->red.length = 8;
>         var->green.offset = 0;
>         var->green.length = 8;
>         var->blue.offset = 0;
>         var->blue.length = 8;
>         var->transp.offset = 0;
>         var->transp.length = 0;
>         break;
>     case 16:        /* RGBA 5551 */
>         if (var->transp.length) {
>             var->red.offset = 0;
>             var->red.length = 5;
>             var->green.offset = 5;
>             var->green.length = 5;
>             var->blue.offset = 10;
>             var->blue.length = 5;
>             var->transp.offset = 15;
>             var->transp.length = 1;
>         } else {    /* RGB 565 */
>             var->red.offset = 0; /* => modify to 11 */
>             var->red.length = 5;
>             var->green.offset = 5;
>             var->green.length = 6;
>             var->blue.offset = 11; /* => modify to 0 */
>             var->blue.length = 5;
>             var->transp.offset = 0;
>             var->transp.length = 0;
>         }
>         break;
>     case 24:        /* RGB 888 */
>         var->red.offset = 0;
>         var->red.length = 8;
>         var->green.offset = 8;
>         var->green.length = 8;
>         var->blue.offset = 16;
>         var->blue.length = 8;
>         var->transp.offset = 0;
>         var->transp.length = 0;
>         break;
>     case 32:        /* RGBA 8888 */
>         var->red.offset = 0;
>         var->red.length = 8;
>         var->green.offset = 8;
>         var->green.length = 8;
>         var->blue.offset = 16;
>         var->blue.length = 8;
>         var->transp.offset = 24;
>         var->transp.length = 8;
>         break;
>     }
>     var->red.msb_right = 0;
>     var->green.msb_right = 0;
>     var->blue.msb_right = 0;
>     var->transp.msb_right = 0;
>
>     return 0;
> }
>
> Regards,
> Tung
>
> On Fri, Sep 9, 2011 at 9:48 AM, <[email protected]> wrote:
>
>>   Hi, Dang,
>>
>> We’re using driver/video/mxc/mxc_ipuv3_fb.c as framebuffer driver, and I
>> think the only thing I should do is modify check_var to re-define
>> fb_bitfield, right?
>>
>> Or I should modify other file? Could you please give a example or further
>> tips?
>>
>> Thanks a lot!
>>
>> BR,
>> Qingwei
>>
>>  *From:* Tung Dang <[email protected]>
>> *Sent:* Friday, September 09, 2011 8:42 AM
>> *To:* [email protected]
>> *Cc:* android-porting <[email protected]>
>> *Subject:* Re: [android-porting] i.MX51 BBG: How to swap red color with
>> blue on DISP2 (RGB565 -> BGR565)
>>
>>   Hi Qingwei,
>>
>> The correct way is to modify in your frame buffer display driver , just
>> swap between B and R
>> The frame buffer display driver is in your linux kernel driver
>> /linux-xxx/drivers/video
>>
>> Regards,
>> Tung
>>
>> On Thu, Sep 8, 2011 at 8:43 PM, <[email protected]> wrote:
>>
>>> Hi,
>>>
>>> Now I have to use BGR565 instead of RGB565, so I modified following
>>> codes, but they have no effect.
>>> file:
>>> mxc_ipuv3_fb.c, function: mxcfb_check_var
>>> ......
>>> switch
>>> (var->bits_per_pixel) {
>>> case 8:
>>>     ......
>>>     break;
>>> case 16:
>>>    var->red.length = 5;
>>>    var->red.offset = 11;   ----> 0
>>>    var->red.msb_right = 0;
>>>    var->green.length = 6;
>>>    var->green.offset = 5;
>>>    var->green.msb_right = 0;
>>>    var->blue.length = 5;
>>>    var->blue.offset = 0;   ---->11
>>>    var->blue.msb_right = 0;
>>>    ......
>>>    break;
>>> case 24:
>>> ......
>>>
>>> And then, I modified _ipu_ch_params_set_packing in
>>> drivers/mxc/ipu3/ipu_param_**mem.h, and found the color of UI is
>>> correct, but camera preview/taking photo/recording, video playing are not
>>> correct (R and B color are reversed).
>>>
>>> I think the best way is to modify framebuffer, but I don’t know how to
>>> do.
>>>
>>> Does anyone have some ideas?
>>>
>>> BR,
>>> Qingwei
>>>
>>> --
>>> unsubscribe: 
>>> android-porting+unsubscribe@**googlegroups.com<android-porting%[email protected]>
>>> website: 
>>> http://groups.google.com/**group/android-porting<http://groups.google.com/group/android-porting>
>>>
>>
>>
>
>

-- 
unsubscribe: [email protected]
website: http://groups.google.com/group/android-porting

Reply via email to