[U-Boot] [PATCH 4/4] common/lcd_console: introduce display/framebuffer rotation

Hannes Petermaier Hannes.Petermaier at br-automation.com
Mon Mar 16 09:32:59 CET 2015


> Hi Hannes,
Hi Igor,

> >> +    /* setup text-console */
> >> +    debug("[LCD] setting up console...\n");
> >> +#ifdef CONFIG_LCD_ROTATION
> >> +    lcd_init_console(lcd_base,
> >> +             panel_info.vl_col,
> >> +             panel_info.vl_row,
> >> +             panel_info.vl_rot);
> >>   #else
> >> -    console_rows = panel_info.vl_row / VIDEO_FONT_HEIGHT;
> >> +    lcd_init_console(lcd_base,
> >> +             panel_info.vl_col,
> >> +             panel_info.vl_row,
> >> +             0);
> >>   #endif
> >> Please, don't start the #ifdef mess here...
> >> just always pass the panel_info.vl_rot.
> > This is not possible, because 'vl_rot' does'nt exist if
> > CONFIG_LCD_ROTATION is not defined. (have a look into lcd.h).
> 
> Of course I did before sending the reply...
> What I'm trying to say is - let it exist and default to 0 angle 
rotation.
> 
> > I made this to be compatible to all who have allready initialized a
> > panel_info without vl_rot.
> 
> This increases the mess and I think is not sensible enough.
> Just change the users to initialize the panel_info with vl_rot.
> I think also that default initialization of globals is 0, right?
> If so, those users that do not initialize the vl_rot explicitly,
> should have it initialized to 0 implicitly by compiler.
Yes, thats a good idea. I will check if the compiler really initializes 
the global
struct panel_info with zero and change this.
 
[...]
> >>>   }
> >>>   +static inline void console_setrow180(u32 row, int clr)
> >>> +{
> >>> +    int i;
> >>> +    uchar *dst = (uchar *)(cons.lcd_address +
> >>> +                   (cons.rows-row-1) * VIDEO_FONT_HEIGHT *
> >>> +                   cons.lcdsizex * PIXLBYTES);
> >>> +
> >>> +    fbptr_t *d = (fbptr_t *)dst;
> >>> +    for (i = 0; i < (VIDEO_FONT_HEIGHT * cons.lcdsizex); i++)
> >>> +        *d++ = clr;
> >>> +}
> >>> +
> >>> +static inline void console_moverow180(u32 rowdst, u32 rowsrc)
> >>> +{
> >>> +    int i;
> >>> +    uchar *dst = (uchar *)(cons.lcd_address +
> >>> +                   (cons.rows-rowdst-1) * VIDEO_FONT_HEIGHT *
> >>> +                   cons.lcdsizex * PIXLBYTES);
> >>> +
> >>> +    uchar *src = (uchar *)(cons.lcd_address +
> >>> +                   (cons.rows-rowsrc-1) * VIDEO_FONT_HEIGHT *
> >>> +                   cons.lcdsizex * PIXLBYTES);
> >>> +
> >>> +    fbptr_t *pdst = (fbptr_t *)dst;
> >>> +    fbptr_t *psrc = (fbptr_t *)src;
> >>> +    for (i = 0; i < (VIDEO_FONT_HEIGHT * cons.lcdsizex); i++)
> >>> +        *pdst++ = *psrc++;
> >>> +}
> >>> +
> >>> +#endif /* CONFIG_LCD_ROTATION */
> >> Can't this whole thing go into a separate file?
> >> So, the console stuff will only define weak functions which can be 
overridden
> >> by the rotation functionality.
> >> This will keep the console code clean (also from ifdefs) and have the 
rotation
> >> functionality cleanly added by a CONFIG_ symbol, which will control 
the
> >> compilation for the separate file.
> > Might be possible, which name should we give to it ? 
lcd_console_rotation.c ?
> 
> Sounds good.
> 
> > But how we deal with the function-pointer initialization ?
> 
> I think the usual method would do...
> You call some kind of lcd_console_init_rot() with most of the code
> that you currently have in lcd_init_console() that is related to 
rotation.
> If the CONFIG_LCD_ROTATION is not set, then the lcd_init_console() stub
> just returns the 0 rotation config.

I just started to move rotation specific functions into own file, called 
lcd_console_rotation.c and
ran into some trouble.

1) 
I need during initialization the console_calc_rowcol(...) function, which 
is provided by lcd.c.
A possible solution might be to "un-static" it - but i am not happy with 
this. 
Another way could be to take up vl_rot into console_t structure and pass 
only a pointer to structure to this function and decide inside the 
function.
But this would create a little mix between 0 degree and rotation code.
Yet another idea is to have (also having pointer to console_t in call) in 
lcd_console_rotation also such a calc function which overrides the values 
calculated before.

or maybe you've another solution ?

2)
I need in almost every "paint-function" the framebuffer base 
(cons.lcd_address) and the screen dimension.
This information is stored in the static structure within lcd.c - i don't 
like to make this public.
A possible solution could be to change all painting function to work 
without some global variable and pass
a third argument, pointer to console_t, and take informations from there. 
This will consume one more register
on function call, runtime is equal i think.

Whats your opinion around this ?

> >> I would recommend extracting the whole if else ... structure into
> >> a separate function say lcd_setup_console_rot() or something and
> >> make the default one doing only the vl_rot == 0 stuff.
> > Whats the use of this ?
> > Should this also be in a separate file?
> 
> Yes, that is how I think it will do better.
> 
> Just to explain my points:
> 1) make the rotation feature an integrative part of the code by always 
using
>    the rotation code: if CONFIG_LCD_ROTATION is *not* set then just 
rotate it
>    to 0 degrees and compile out the rest of the code.
> 2) make the rotation feature a bit more separate from the console code.
>    I believe this way will make it cleaner.
Actually (within new code) i do initialize the pointers and things around 
with 0 degree rotation and
call afterwards the new function lcd_init_console_rot which is implemented 
in lcd_console_rotation.c
and "__weak" in lcd_console.c which does re-initialze fps and col/row 
stuff.

> 
> Also, might it be useful to allow specifiying the angle through the
> CONFIG_LCD_ROTATION define?
> Have you considered using Kconfig for this?
First i thought about this to specifiy rotation angle with a value defined 
CONFIG_LCD_ROTATION - but this is only usefull to one of my boards (where 
display is rotated 180degrees). In another board i have one U-Boot for a 
bunch of variants (16 at this time) where all rotation angles are needed. 
I want to take there this information out of device-tree and write it to 
vl_rot.
> 
> -- 
> Regards,
> Igor.
best regards,
Hannes




More information about the U-Boot mailing list