找回密码
 注册
搜索
查看: 6044|回复: 58

[讨论] MTK 显示从 MMI WGUI LAYER 到DRIVER 刷新到LCD的流程

[复制链接]
发表于 2008-2-28 15:57:03 | 显示全部楼层 |阅读模式
最近想搞明白MTK平台整个的显示流程,想请高手解释一下这中间的奥妙.....
   从MMI WGUI layer层我们所熟悉的show categoryScreen到最后DRIVER将MMI传过来的DATA数据刷新到LCD,这中间的流程,有谁能帮我整明白么?
[em13][em13][em11][em11]
发表于 2008-2-28 20:00:45 | 显示全部楼层
好问题,我也想学习。
点评回复

使用道具 举报

 楼主| 发表于 2008-2-29 11:27:30 | 显示全部楼层
那LS同学
学习成果,我们可以一起研究交流一下哦
希望有兴趣的人加入,一起探讨....
点评回复

使用道具 举报

发表于 2008-3-5 12:49:10 | 显示全部楼层
大家谁建个群  这样比较方便讨论
点评回复

使用道具 举报

发表于 2008-4-2 17:08:03 | 显示全部楼层
希望有高手能指点一下嘛,帖子不能这样沉下去啊
点评回复

使用道具 举报

发表于 2008-5-6 12:03:30 | 显示全部楼层
show categoryScreen也是调用画图的函数画界面,gdi_draw_xxx,这些函数先判断clip,再修改活动的层的buffer,当调用gdi_layer_blt_ext()时,才涉及到drive.
在gdi_layer_blt_ext里最终会调用lcd_fb_update,这个函数有一千七百多行,里面经过一通判断,会调用LCD驱动的BlockWrite函数,这个函数就把我们画的东西更新到屏幕上了.

MTK的代码宏和全局变量太多,函数指针也很多,我没写过这么大的程序,不敢乱加评论,只能说我看着很晕.
点评回复

使用道具 举报

发表于 2008-5-8 18:03:22 | 显示全部楼层
caz28 讲得很好,我也分析到了这个过程。
我觉得有两个层次,首先是从DrawScreen到GDI,另一个从gdi_layer_blt_ext到LCM GRAM的过程。
前一个层次的问题我还没有深入研究,对后一个问题做了浅显的分析。

数据流为线索分析,其基本流程是通过config_lcd_layer_window函数来设置图层和窗口信息后通过lcd_fb_update更新窗口;这个过程MTK设计了一个复杂的状态机(标名为:LCD Interface State Machines,文档名称为:LCD_all_chip_API_Design_V1.01.pdf),我还没有仔细研究,如果弄懂了会分享给大家。

我现在遇到了两个困惑:
1) 从framebuf到LCM GRAM 拷贝数据的DMA是如何触发的?
    我看了一下DATASHEET,其中有个叫做IMAGE DMA的,可能是合并图层和拷贝数据等专用的DMA,但是它何时被启动我没有在代码中找到,因为lcd_fb_update太大了,怀疑是在START_LCD_TRANSFER中被启动的不能确定。希望达人指点;
2) 图层合并是何时发生的?

我准备把这两个问题弄清楚了,再来研究它的状态机。
把状态机搞清楚了,再来搞清楚多层、多屏时的framebuf切换、传递流程。
把framebuf问题搞清楚了,再来研究window层的东西。

不知道这个思路是否可行,还请达人指点。
点评回复

使用道具 举报

发表于 2008-7-13 09:15:05 | 显示全部楼层
很受启发
点评回复

使用道具 举报

发表于 2008-7-17 11:25:15 | 显示全部楼层
START_LCD_TRANSFER开启了DMA传输,会将各层frame buffer中的数据先合并后传输到GRAM中去。图层的合并就在此时发生,由于是硬件合并,所有没有代码。
点评回复

使用道具 举报

发表于 2008-7-17 12:52:02 | 显示全部楼层
谢谢, 受益非浅,谢谢
点评回复

使用道具 举报

发表于 2008-7-18 16:39:28 | 显示全部楼层
是这样的过程:

WGUI <- GUI <- GDI <- LCD dirver <- Display buffer
点评回复

使用道具 举报

发表于 2008-7-24 14:11:12 | 显示全部楼层
WGUI和GUI有啥区别?
点评回复

使用道具 举报

发表于 2008-8-7 13:35:32 | 显示全部楼层
学习了..
点评回复

使用道具 举报

发表于 2008-8-12 14:10:45 | 显示全部楼层
顶了,这么好的帖子,学习了。
点评回复

使用道具 举报

发表于 2008-8-18 10:49:41 | 显示全部楼层
好帖,顶,up
点评回复

使用道具 举报

发表于 2008-8-30 16:40:54 | 显示全部楼层
顶贴,希望有高手继续讲解。。
点评回复

使用道具 举报

发表于 2008-9-3 18:05:38 | 显示全部楼层
以一段代码来说明(这里省略了很多的东西):
void EntryScrIncomingOptions(void)
{       
        1、退出上一窗口,进入新的窗口;
EntryNewScreen(ITEM_SCR_INCOMING_OPTIONS,NULL, EntryScrIncomingOptions, NULL);
2、获取当前窗口的GUI buffer
guiBuffer = GetCurrGuiBuffer(ITEM_SCR_INCOMING_OPTIONS);   
3、获取列表窗口的子菜单数目;
number_of_items = GetNumOfChild_Ext(MITEM_OPT_PSEUDO);
4、获取要显示的字符串序列;
GetSequenceStringIds_Ext(MITEM_OPT_PSEUDO, list_of_items);
5、设置当前窗口的父窗口的ID;
SetParentHandler(MITEM_OPT_PSEUDO);
6、注册highlight 函数
RegisterHighlightHandler(ExecuteCurrHiliteHandler);
7、在已经获取了以上信息后,绘制当前的窗口;
    ShowCategory1Screen(
        STR_SCR1002_CAPTION,
        0,
        STR_GLOBAL_OK,
        IMG_GLOBAL_OK,
        STR_GLOBAL_BACK,
        IMG_GLOBAL_BACK,
        number_of_items,
        list_of_items,
        0,
        guiBuffer);
点评回复

使用道具 举报

发表于 2008-9-3 23:11:28 | 显示全部楼层
好贴,好人啊,顶!!
点评回复

使用道具 举报

发表于 2008-9-9 02:03:46 | 显示全部楼层
怎么说呢,基本上到了lcd_fb_update这个函数,你就别想跟下去了,不过通过MTK提供的仿真可以推出来,lcd_fb_update这个函数做了这么几件事:
1. layer compound, 图层复合,对四个(或六个)图层进行复合,包括clip, alpha blending(opacity),形成最后逻辑上的一个复合图像
2.将复合后的图像COPY到显存。
===========================
送你几个关键字:frame buffer, linear address
点评回复

使用道具 举报

发表于 2008-9-28 16:34:29 | 显示全部楼层
真的是 个好帖!!!!!!
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2025-1-8 05:57 , Processed in 0.048787 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表