Android双屏异显另辟蹊径---minui的移植

转自:https://blog.csdn.net/eliot_shao/article/details/87180451

minui介绍
minui是Android自带的一个画图工具,可以绘制一些简单的图形和图像,显示png图片,显示字符串等。

在Android设备中譬如,关机充电动画,自动测试程序,recovery模式界面等都是用minui绘制界面,进行人机交互,完成一些必要的功能。其优点是在不启动Android surfaceflinger等主要绘图进程的情况下,实现基于基本Linux显示框架下的显示功能,起到开机时间短,节约电量等功能。

下面介绍一下通过仿照关机充电应用程序,写的一个小屏显示进程。Android默认支持一个主屏,Android N以后退出双屏异显的接口api,但是这里并不是通过创建两个displaydevice来实现双屏显示而是通过另外启动一个进程,使用minui将第二个屏的显示数据推送到第二个屏上(小屏,也叫副屏)。移植minui的工作就变得不可绕开了。

minui代码分析
从关机充电应用程序那里复制一套minui的代码:

Android双屏异显另辟蹊径---minui的移植_第1张图片

Android双屏异显另辟蹊径---minui的移植_第2张图片

minui的画图和显示接口在另外一篇文章中会有介绍:https://blog.csdn.net/eliot_shao/article/details/78597522 

下面也会有一个实例来应用。

minui移植必要代码分析:

graphics.c

Android双屏异显另辟蹊径---minui的移植_第3张图片

minui驱动接口有两个,一个使用adf框架的显示接口,一个是使用framebuffer的显示框架,因为对framebuffer了解比较多,遂使用framebuffer的方式来实现驱动。

graphics_fbdev.c

Android双屏异显另辟蹊径---minui的移植_第4张图片

这里会打开驱动层对应的framebuffer节点。

所以我们下一步是创建一个framebuffer子系统节点和必要的信息。

在驱动层创建一个framebuffer驱动,可以仿照其他显示驱动实例。

framebuffer驱动实现
framebuffer驱动主要内容:

1、

struct fb_info *info;

info = framebuffer_alloc(sizeof(u32) * 256, &dev->dev);

2、

size = PAGE_ALIGN(size);

mem = vmalloc_32(size);

3、info->screen_base = (char __iomem *)videomemory;

    vfb_fix.smem_start = (unsigned long) videomemory;

    vfb_fix.smem_len = videomemorysize;

4、 info->fix = vfb_fix;

    info->flags = FBINFO_FLAG_DEFAULT;

    retval = register_framebuffer(info);

5、
Android双屏异显另辟蹊径---minui的移植_第5张图片

驱动的主要内容包括framebuffer申请,一块连续的虚拟内存的申请,fb_info的填充,注册framebuffer,重写fb_ops的blank函数(SPI驱动这里略过)。

minui应用测试程序及效果
现在minui的驱动部分已经写好了,编译进去执行adb可以看到对应的/dev/graphics/fb0(fb1)的接口,下面写一个简单的minui应用程序测试一下:
Android双屏异显另辟蹊径---minui的移植_第6张图片

Android双屏异显另辟蹊径---minui的移植_第7张图片

显示效果:

Android双屏异显另辟蹊径---minui的移植_第8张图片

为了能正常编译minui应用程序,需要修改android.mk文件。

如下:

Android双屏异显另辟蹊径---minui的移植_第9张图片

Android双屏异显另辟蹊径---minui的移植_第10张图片

总结

至此,minui从应用到显示打通,可以显示自定义界面,和主屏互不干扰,实现双屏异显。但是这种显示只能显示较为简单的界面,或者第二人机交互界面 在一些需要双显示的系统中解决一些重要的问题。

你可能感兴趣的:(display)