minui是Android自带的一个画图工具,可以绘制一些简单的图形和图像,显示png图片,显示字符串等。
在Android设备中譬如,关机充电动画,自动测试程序,recovery模式界面等都是用minui绘制界面,进行人机交互,完成一些必要的功能。其优点是在不启动Android surfaceflinger等主要绘图进程的情况下,实现基于基本Linux显示框架下的显示功能,起到开机时间短,节约电量等功能。
下面介绍一下通过仿照关机充电应用程序,写的一个小屏显示进程。Android默认支持一个主屏,Android N以后退出双屏异显的接口api,但是这里并不是通过创建两个displaydevice来实现双屏显示而是通过另外启动一个进程,使用minui将第二个屏的显示数据推送到第二个屏上(小屏,也叫副屏)。移植minui的工作就变得不可绕开了。
从关机充电应用程序那里复制一套minui的代码:
minui的画图和显示接口在另外一篇文章中会有介绍:https://blog.csdn.net/eliot_shao/article/details/78597522
下面也会有一个实例来应用。
minui移植必要代码分析:
graphics.c
minui驱动接口有两个,一个使用adf框架的显示接口,一个是使用framebuffer的显示框架,因为对framebuffer了解比较多,遂使用framebuffer的方式来实现驱动。
graphics_fbdev.c
这里会打开驱动层对应的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、
驱动的主要内容包括framebuffer申请,一块连续的虚拟内存的申请,fb_info的填充,注册framebuffer,重写fb_ops的blank函数(SPI驱动这里略过)。
现在minui的驱动部分已经写好了,编译进去执行adb可以看到对应的/dev/graphics/fb0(fb1)的接口,下面写一个简单的minui应用程序测试一下:
显示效果:
为了能正常编译minui应用程序,需要修改android.mk文件。
如下:
至此,minui从应用到显示打通,可以显示自定义界面,和主屏互不干扰,实现双屏异显。但是这种显示只能显示较为简单的界面,或者第二人机交互界面 在一些需要双显示的系统中解决一些重要的问题。