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 |