/*SW XXX*/
//LCD_OWNER_ID 来自哪里的刷新
typedef enum
{
LCD_UPDATE_MODULE_MMI = 0,//MMI层触发的刷新
LCD_UPDATE_MODULE_MEDIA ,//camera等触发的刷新
LCD_UPDATE_MODULE_JPEG_VIDEO ,//MJPG_DECODE触发的刷新
LCD_UPDATE_MODULE_EXT_CAMERA , //这个不清楚,可能是拓展camera触发的刷新,类似于DSP
LCD_UPDATE_MODULE_LCD_FW //这个我也不清楚
} LCD_OWNER_ID_ENUM;
/*SW XXX*/
//LCD_UPDATE_MODE 刷新的模式
typedef enum
{
LCD_SW_TRIGGER_MODE = 0, /* LCD SW trigger with frame buffer */ //软件缓冲刷新
LCD_HW_TRIGGER_MODE = 1, /* LCD HW trigger with frame buffer */ //硬件缓冲刷新
LCD_DIRECT_COUPLE_MODE = 2 /* LCD HW trigger without frame buffer, direct couple */ //不需要缓冲区的硬件直接耦合刷新
} LCD_UPDATE_MODE_ENUM;
//有些我也不太清楚他的意义,只能通过翻译软件来大致了解。
上面两种设计应该是互相搭配的,比如LCD_SW_TRIGGER_MODE的OWNER_ID一般肯定是LCD_UPDATE_MODULE_MMI,而缓冲区又在哪里定义的呢?
下面看重要的LCD刷新接口函数:
lcd_frame_update_struct结构里有如下需要注意的元素:
void (* lcd_block_mode_cb)(void);
/// the layers to be updated
kal_uint32 update_layer;
/// which layer will be applied by hw trigger or direct couple
kal_uint32 hw_update_layer;
/// rotate select for hardware update layer
kal_uint8 rotate_value;
#if defined(DRV_LCD_MEMORY_OUTPUT)
/// enable/disable otuput to memory and LCM simultaneously
kal_bool memory_output;
/// block write out or not
kal_uint8 block_mode;
/// output data format to memory, LCD_WMEM_RGB565 or LCD_WMEM_RGB888 for 6228, 6229.
/// always RGB565 for 6226,6227
kal_uint8 memory_data_format;
/// memory block when output to memory
kal_uint16 memory_block_width;
/// buffer address of memory output buffer
kal_uint32 memory_output_buffer_address;
/// buffer size of memory output buffer
kal_uint32 memory_output_buffer_size;
/// x offset of dest buffer
kal_uint16 dest_offset_x;
/// y offset of dest buffer
kal_uint16 dest_offset_y;
/// temp memory buffer
kal_uint32 dest_temp_address;
#endif //DRV_LCD_MEMORY_OUTPUT
1. void (* lcd_block_mode_cb)(void);为刷新完成后的callback,这个在mmi上可以有效的防止上一次刷新未完成又进行新刷新,这个也就产生了gdi_waiting_blt_finish()函数。
2.对memory_output_buffer_address和memory_output_buffer_size,是将屏幕显示向外output,可能用于camera_capture图片或者抓屏吧。函数里有要求只有当update_mod为LCD_UPDATE_MODULE_MMI时才允许向外output_bufferAdress
3.数据缓冲区在哪呢?我也找不到,只有参考这个了http://web.rfeda.net/dp-bbsthread-237857.html
可能和update_layer和hw_update_layer有点关系吧
在这里接口函数里,53平台通过调用lcd_fb_update_19_26_28_series(lcd_para);来调用驱动中的blockwrite来分别主屏和子屏进行刷新。以及刷新完成后执行callback函数lcd_block_mode_cb
在mmi_gdi系统内,通过lcd_fb_update<-gdi_layer_blt_ext_internal<-gdi_layer_blt_ext<-gdi_layer_blt,gdi_layer_blt_previous,gdi_layer_blt_tree,gdi_lcd_paint_ext,gdi_lcd_paint_all_ext等等刷屏函数,我主要用的是gdi_layer_blt_previous,原来有这么多刷屏函数,真是孤陋寡闻了。。。
作者:张素丰,转载请注明出处:http://www.cnblogs.com/zhangsufeng/archive/2010/09/24/1833666.html
在刷屏过程中,不论lcd_fb_update还是lcd_fb_update_19_26_28_series函数都不断的对MTK中断控制器进行操作,例如:
_lcd_wait_for_lcd_ready();
关于中断控制器的相关文档可以参考
http://www.docin.com/p-62184651.html
http://www.hudong.com/wiki/%E4%B8%AD%E6%96%AD%E6%8E%A7%E5%88%B6%E5%99%A8
后悔以前没有吧计算机组成原理学好~~
在刷屏的过程中会进入中断,在这个中断进行过程中,系统是否会去相应比如按键相应的其他中断呢?这个我还不太明白
在看代码的过程中无意发现了一个断言刷屏的函数assert_lcd_fb_update,可能是在打开工厂模式里的MMI Debug后系统断言时会调用的,具体的流程自己也没看懂,有时间再来研究一下。
在MTK中自己不明白的东西实在太多,有明白的同事能不能帮我补充一下下,我相信分享才能成长,交流才能进步,闭门造车有时会自缚手脚的。