作者: 李先静 xianjimli@gmail.com
希望对那些在开发高通MSM7XXX平台的朋友有很大的帮助
FrameBuffer 在Android中并不像在其它GUI那样直观,抽象的层次比较多,加上GUI的更新是通过OpenGLES来做的。所以让人很难搞清GUI更新的整个流程,最近要准备一个讲稿,所以花了一些去研究,这里做点笔记供大家参考,源代码是基于高通平台的,这些代码在网上都可以下载。
FrameBuffer 的相关组件如下图所示:
图片贴不过来,请到原地址去查看http://www.linuxgraphics.cn/android/framebuffer_arch.html
- SurfaceFlinger是一个服务,主要是负责合成各窗口的Surface,然后通过OpenGLES显示到FrameBuffer上。SurfaceFlinger本身比较重要而且比较复杂,以后专门写一篇吧。
- DisplayHardware是对显示设备的抽象,包括FrameBuffer和Overlay。它加载FrameBuffer和Overlay插件,并初始化OpenGLES:
mNativeWindow = new FramebufferNativeWindow(); framebuffer_device_t const * fbDev = mNativeWindow->getDevice(); if (hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module) == 0) { overlay_control_open(module, &mOverlayEngine); } surface = eglCreateWindowSurface(display, config, mNativeWindow.get(), NULL); eglMakeCurrent(display, surface, surface, context);
- FramebufferNativeWindow 是framebuffer 的抽象,它负责加载libgralloc,并打开framebuffer设备。FramebufferNativeWindow并不直接使用 framebuffer,而是自己创建了两个Buffer:
- queueBuffer负责显示一个Buffer到屏幕上,它调用fb->post去显示。
- dequeueBuffer获取一个空闲的Buffer,用来在后台绘制。
这两个函数由eglSwapBuffers调过来,调到:
egl_window_surface_v2_t::swapBuffers: nativeWindow->queueBuffer(nativeWindow, buffer); nativeWindow->dequeueBuffer(nativeWindow, &buffer);
- msm7k/liboverlay是Overlay的实现,与其它平台不同的是,高通平台上的Overlay并不是提供一个framebuffer设备,而通过fb0的ioctl来实现的,ioctl分为两类操作:
OverlayControlChannel用于设置参数,比如设置Overlay的位置,宽度和高度:
mNativeWindow = new FramebufferNativeWindow(); framebuffer_device_t const * fbDev = mNativeWindow->getDevice(); if (hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module) == 0) { overlay_control_open(module, &mOverlayEngine); } surface = eglCreateWindowSurface(display, config, mNativeWindow.get(), NULL); eglMakeCurrent(display, surface, surface, context);
- FramebufferNativeWindow 是framebuffer 的抽象,它负责加载libgralloc,并打开framebuffer设备。FramebufferNativeWindow并不直接使用 framebuffer,而是自己创建了两个Buffer:
- queueBuffer负责显示一个Buffer到屏幕上,它调用fb->post去显示。
- dequeueBuffer获取一个空闲的Buffer,用来在后台绘制。
这两个函数由eglSwapBuffers调过来,调到:
egl_window_surface_v2_t::swapBuffers: nativeWindow->queueBuffer(nativeWindow, buffer); nativeWindow->dequeueBuffer(nativeWindow, &buffer);
- msm7k/liboverlay是Overlay的实现,与其它平台不同的是,高通平台上的Overlay并不是提供一个framebuffer设备,而通过fb0的ioctl来实现的,ioctl分为两类操作:
OverlayControlChannel用于设置参数,比如设置Overlay的位置,宽度和高度:
bool OverlayControlChannel::setPosition(int x, int y, uint32_t w, uint32_t h) {
ov.dst_rect.x = x;
ov.dst_rect.y = y;
ov.dst_rect.w = w;
ov.dst_rect.h = h;
ioctl(mFD, MSMFB_OVERLAY_SET, &ov);
}
OverlayDataChannel用于显示Overlay,其中最重要的函数就是queueBuffer:
bool OverlayDataChannel::queueBuffer(uint32_t offset) { mOvData.data.offset = offset; ioctl(mFD, MSMFB_OVERLAY_PLAY, odPtr)) }
- msm7k/libgralloc 是显示缓存的抽象,包括framebuffer和普通Surface的Buffer。
framebuffer只是/dev/graphic/fb0的包装,Surface的Buffer则是对/dev/pmem、ashmem和GPU内存(msm_hw3dm)的包装,它的目标主要是方便硬件加速,因为 DMA传输使用物理地址,要求内存在物理地址上连续。
- msm7k/libcopybit这是2D加速库,主要负责Surface的拉伸、旋转和合成等操作。它有两种实现方式:
- copybit.cpp: 基于fb0的ioctl(MSMFB_BLIT)的实现。
- copybit_c2d.cpp: 基于kgsl的实现,只是对libC2D2.so的包装,libC2D2.so应该是不开源的。
- pmem
- misc/pmem.c: 对物理内存的管理,算法和用户空间的接口。
- board-msm7x27.c定义了物理内存的缺省大小:
#define MSM_PMEM_MDP_SIZE 0x1B76000 #define MSM_PMEM_ADSP_SIZE 0xB71000 #define MSM_PMEM_AUDIO_SIZE 0x5B000 #define MSM_FB_SIZE 0x177000 #define MSM_GPU_PHYS_SIZE SZ_2M #define PMEM_KERNEL_EBI1_SIZE 0x1C000
msm_msm7x2x_allocate_memory_regions分配几大块内存用于给pmem做二次分配。
Kernel Graphics System Layer (KGSL),3D图形加速驱动程序,源代码drivers/gpu/msm目录下,它是对GPU的包装,给OpenGLES 2.0提供抽象的接口。
这个我在内核中没有找到相关代码。
msm_fb.c: framebuffer, overlay和blit的用户接口。
mdp_dma.c: 对具体显示设备的包装,提供两种framebuffer更新的方式:
mdp_refresh_screen: 定时更新。
mdp_dma_pan_update: 通过pan display主动更新。
mdp_dma_lcdc.c:针对LCD实现的显示设备,mdp_lcdc_update用更新framebuffer。
分享到:
相关推荐
android下读取framebuffer的内容 程序运行就会把framebuffer的内容保存在/sdcard/123.raw下面, 要想打开还需要在文件上插入如bitmap的文件头即可
QUALCOMM 平台 android framebuffer 命令行测试工具 源代码
一个完整的android framebuffer截图程序。支持16位、24位和32位,支持所有屏幕大小。16位和32位的全部功能经测试,可以完美使用。24位暂时没有测试过。
在手机root下,通过Framebuffer获取手机系统界面上的截图,可以显示出来
一个完整的android framebuffer截图程序。支持16位和24位,支持所有屏幕大小。比上一个版本多了对屏幕指定部位进行截图的功能。
一个完整的android framebuffer截图程序。支持16位和24位,支持所有屏幕大小。
Android4.0下使用framebuffer抓屏并保存成bmp文件
前面在介绍Android系统的...在前面Android系统的开机画面显示过程分析一文中提到,Linux内核在启动的过程中会创建一个类别和名称分别为“graphics”和“fb0”的设备,用来描述系统中的第一个帧缓冲区,即第一个显示屏,
详细分析了Linux内核中framebuffer的源代码,并介绍的framebuffer的实现原理
framebuffer测试程序,帮你了解framebuffer流程
linux framebuffer编程,显示BMP图片
framebuffer中显示JPEG或BMP图片,文档中有源码,可以直接编译运行
详细的介绍了framebuffer的汉字显示原理。
自己单独写了一个jni来调用系统截屏接口 screencap ( frameworks/base/cmds/screencap/screencap.cpp),然后在源代码中编译jni成一个so文件(libscreencapjni.so),可是在真机上测试出现了SurfaceFlinger ...
1.1.4 android系统开发(移植)和应用开发 /11 1.2 获取和编译android的源码 /13 1.2.1 环境配置 /13 1.2.2 获取android源码 /14 1.2.3 编译android的源码及其工具包 /16 1.2.4 运行android系统 /21 1.3 开发环境...
第9章“Android的多媒体系统”,介绍Android的多媒体系统的核心部分,包括Android中多媒体系统的业务、结构、多媒体系统的核心框架、OpenCore系统结构和使用等内容。 第10章“Android的电话部分”,介绍Android...
全面的framebuffer详解
framebuffer驱动全篇
关于LCD显示屏的驱动的详细架构描述和驱动分析