设为首页 加入收藏

TOP

全志G2D实现屏幕旋转,开机logo实现手动旋转。(一)
2023-07-23 13:27:05 】 浏览:50
Tags:全志 G2D 开机 logo

产品设计出来之后啊,大家使用的时候觉得反过来使用更加便捷。但是屏幕显示是反的。那怎么办那?????

修改硬件费时费工,那能否软件实现那?????

 如果纯软件使用那就太费系统资源了。于是就想到了使用全志R528 自带的G2D功能(硬件加速功能)。

使用它进行旋转,后又发现uboot阶段系统没有G2D导致开机logo不能自动旋转,内核启动后G2D 启动logo 又旋转了。

(好烦啊!!!!!!!!!!!!)

于是就需要把uboot 阶段手动把图片数据旋转过来。在G2D启动前把uboot 传递给内核的logo 图片数据也旋转过来。

下面具体步骤:

一、开启G2D功能。

1、由于此前公版默认在modules.mk屏蔽了屏旋转相关配置, 如果你的版本是禁用旋转的, 需要把相关配置去掉.
device/config/chips/r528/configs/evb1/linux-5.4/config-5.4

2759:# CONFIG_SUNXI_DISP2_FB_DISABLE_ROTATE is not set
以下3个相关选项

CONFIG_DISP2_SUNXI=m \
#CONFIG_SUNXI_DISP2_FB_DISABLE_ROTATE=y \
#CONFIG_SUNXI_DISP2_FB_ROTATION_SUPPORT=n \
#CONFIG_SUNXI_DISP2_FB_HW_ROTATION_SUPPORT=n \
修改为:
CONFIG_DISP2_SUNXI=m \ #CONFIG_SUNXI_DISP2_FB_DISABLE_ROTATE=n \ #CONFIG_SUNXI_DISP2_FB_ROTATION_SUPPORT=n \ #CONFIG_SUNXI_DISP2_FB_HW_ROTATION_SUPPORT=y \

 

2、硬件旋转需要确保G2D驱动已经使能

make kernel_menuconfig
Device Drivers --->
<*> SUNXI G2D Driver
[*] sunxi g2d mixer module
[*] sunxi g2d rotate module
[] sunxi sync fence implement for rotate jobs synchronous

3.打开显示驱动旋转支持

make kernel_menuconfig
Device Drivers --->
Graphics support --->
Frame buffer Devices --->
Video support for sunxi --->
DISP2 Framebuffer rotation support (Disable rotation) --->
( ) Disable rotation
( ) Software rotation support (不要选这个,方案未支持)
(X) Hardware(G2D) rotation support (选择G2D旋转)

4.dts配置

 

board.dts 和 uboot-board.dts同步修改.

&disp{
.....
disp_rotation_used = <1>;/* 使能旋转功能 */
degree0 = <2>; /* X:screen index; 0:0 degree; 1:90 degree; 3:270 degree */
fb0_width = <800>;/*fb 的长宽交换*/
fb0_height = <480>;
.....
};

 

5.旋转后framebuffer编程是需要注意,旋转后的buffer不会直接显示到屏幕上, 需要在应用刷屏的地方调用FBIOPAN_DISPLAY接口.同步旋转后的buffer到LCD上.

 

以修改公版旋转的GUI刷屏示例:

 

路径:package/gui/littlevgl-6/lv_drivers/display/fbdev.c

void fbdev_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_p){
....
    lv_disp_flush_ready(drv);
    ioctl(fbfd, FBIOPAN_DISPLAY, &vinfo); /*函数最后,在刷屏函数后面,调用 FBIOPAN_DISPLAY 接口*/
}

 

我们系统时自己的UI系统。是在重绘回调函数中,增加FBIOPAN_DISPLAY

 

 

main()
{
int fp=0; struct fb_var_screeninfo vinfo; struct fb_fix_screeninfo finfo; fp = open("/dev/fb0", O_RDWR); if(fp < 0) { printf("Error : Can not open framebuffer device/n"); exit(1); } if(ioctl(fp, FBIOGET_VSCREENINFO, &vinfo)){ printf("Error reading variable information/n"); exit(3); } vinfo.xoffset = 0; vinfo.yoffset = 0;
}
void sys_paint(void) // 每次重绘调用一次 {   ioctl(fbfd, FBIOPAN_DISPLAY, &vinfo); /*函数最后,在刷屏函数后面,调用 FBIOPAN_DISPLAY 接口*/ }

二、uboot阶段手动修改旋转图片数据

  追踪uboot  logo 执行过程

static int run_main_loop(void) 
 {
....
    #ifdef CONFIG_ARCH_SUNXI
        initr_sunxi_plat,
    #endif
....
}

initr_sunxi_plat
{
....
              #ifdef CONFIG_BOOT_GUI
                void board_bootlogo_display(void);
                board_bootlogo_display();
        #else
....
}

void board_bootlogo_display(void) 
{
....
#if defined(CONFIG_CMD_SUNXI_BMP)
    sunxi_bmp_display("bootlogo.bmp"); //指定bootlogo的名字。通过修改这个地方可以修改指定logo的名称
    
#elif defined(CONFIG_CMD_SUNXI_JPEG)
    sunxi_jpeg_display("bootlogo.jpg");
#endif    
....
}


int sunxi_bmp_display(char *name)
{
    int ret = -1;
    char *argv[6];
    char bm
首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【解决】Linux 桌面 无法打开终端.. 下一篇mysql 基础

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目