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

minui介绍

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

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

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

minui代码分析

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

https://img-blog.csdnimg.cn/20190213143442912.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NlZWtfMDM4MA==,size_16,color_FFFFFF,t_70

https://img-blog.csdnimg.cn/20190213143425926.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NlZWtfMDM4MA==,size_16,color_FFFFFF,t_70

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

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

minui移植必要代码分析:

graphics.c

https://img-blog.csdnimg.cn/20190213143820603.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NlZWtfMDM4MA==,size_16,color_FFFFFF,t_70

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

graphics_fbdev.c

这里会打开驱动层对应的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、

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

minui应用测试程序及效果

现在minui的驱动部分已经写好了,编译进去执行adb可以看到对应的/dev/graphics/fb0(fb1)的接口,下面写一个简单的minui应用程序测试一下:

显示效果:

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

如下:

总结

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

你可能感兴趣的:(android系统开发)