Discuz! Board

标题: android系统上传到底如何和framebuffer进行交互操作的 [打印本页]

作者: zangcf    时间: 2016-4-7 12:41
标题: android系统上传到底如何和framebuffer进行交互操作的
Android中 lcd是一个帧缓冲设备,驱动程序通过处理器的 lcd控制器将物理内存的一段区域设置为显存,如果向这段内存区域写入数据就会马上在 lcd上显示出来。Android在 HAL 中提供了gralloc模块,封装了用户层对帧缓冲设备的所有操作接口,并通过 SurfaceFlinger服务向应用提供显示支持。在启动过程中系统会加载 gralloc模块,然后打开帧缓冲设备,获取设备的各种参数并完成 gralloc模块的初始化。当应用程序需要把内容显示到 lcd上时,需要通过 gralloc模块申请一块图形缓冲区,然后将这块图形缓冲区映射到自己的地址空间并写入内容即可。当应用程序不再需要这块图形缓冲区时需要通过 gralloc模块释放掉,然后解除对缓冲区的映射。


作者: zangcf    时间: 2016-4-7 14:55
void SurfaceFlinger::postFramebuffer()
{
    ATRACE_CALL();

    const nsecs_t now = systemTime();
    mDebugInSwapBuffers = now;

    HWComposer& hwc(getHwComposer());
    if (hwc.initCheck() == NO_ERROR) {
        if (!hwc.supportsFramebufferTarget()) {
            // EGL spec says:
            //   "surface must be bound to the calling thread's current context,
            //    for the current rendering API."
            DisplayDevice::makeCurrent(mEGLDisplay,
                    getDefaultDisplayDevice(), mEGLContext);
        }
        hwc.commit();
    }

    for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
        sp<const DisplayDevice> hw(mDisplays[dpy]);
        const Vector< sp<LayerBase> >& currentLayers(hw->getVisibleLayersSortedByZ());
        hw->onSwapBuffersCompleted(hwc);
        const size_t count = currentLayers.size();
        int32_t id = hw->getHwcDisplayId();
        if (id >=0 && hwc.initCheck() == NO_ERROR) {
            HWComposer:ayerListIterator cur = hwc.begin(id);
            const HWComposer:ayerListIterator end = hwc.end(id);
            for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
                currentLayers[i]->onLayerDisplayed(hw, &*cur);
            }
        } else {
            for (size_t i = 0; i < count; i++) {
                currentLayers[i]->onLayerDisplayed(hw, NULL);
            }
        }
    }

    mLastSwapBufferTime = systemTime() - now;
    mDebugInSwapBuffers = 0;
}
这个是如何post的呢?
作者: zangcf    时间: 2016-4-7 17:37
1,基本的与Framebuffer交互命令序列:
MTKFB_GET_OVERLAY_LAYER_INFO
mtkfb_check_var()
mtkfb_set_par()
mtkfb_pan_display_proxy()
mtkfb_pan_display_impl()
mtkfb_update_screen()
mtkfb_update_screen_impl()
mtkfb_setcolreg()

作者: zangcf    时间: 2016-4-7 18:06
后面的显示好像经过如下几步:
1,mtkfb_ioctl()
2,mtkfb_ioctl() MTKFB_GET_OVERLAY_LAYER_INFO
3,fb_set_var() fbmem
4,mtkfb_check_var()
5,mtkfb_set_par()
6,fb_pan_display() fbmem
7,mtkfb_pan_display_proxy()
8,mtkfb_pan_display_impl()
9,mtkfb_update_screen()
10,mtkfb_update_screen_impl()
11,mtkfb_setcolreg()
12,mtkfb_waitVsync()




欢迎光临 Discuz! Board (http://47.89.242.157:9000/bbs/discuz/) Powered by Discuz! X3.2