现在framebuffer驱动中会申请双buffer,上层是如何使用这两个buffer,底层又是怎么处理两个buffer的?
上层传数据到framebuffer时,会先放到其中一个buffer中,等再有数据传输下来时会切换到另外一个buffer,将其放满。相当于fb的基地址,加上一个偏移量在两个buffer之间切换。底层通过将要显示的buffer的地址写入到DMA中,DMA就会自动将一个buffer的数据搬运到屏的RAM中。
计算lcm的buffer?
buffer有三部分
a)Framebuffer:width*height*(32/8)*2
b)DPI buffer:
size=dsiTmpBufBpp×buffer_num×width×height
其中dsiTmpBufBpp=2(RGB565) or 3(RGB666/888)
buffer_num = params->dsi.internediat_buffer_num (defulat=2)
width = params->width
height = params->height
c)Assert Layer buffer:width*height*(16/8)+4096
针对DBI接口的屏,framebuffer 如何刷数据到LCD上? TE 信号的作用是什么?如何往LCD 写一帧黑屏?
上层将显示数据填充到framebuffer 中,调用mtkfb_ioctl:MTKFB_TRIG_OVERLAY_OUT,然后调用mtkfb_update_screen,然后mtkfb_update_screen_impl,然后DISP_UpdateScreen,在DISP_UpdateScreen中主要调用lcm_drv->update和disp_drv->update_screen(); LCD控制器会将FBbuffer 数据搬运到 LCD的gram中,LCD IC 再从gram 刷新到Lcd panel上。
TE信号是为了解决切屏问题引入的,硬件管脚为FMARK。产生切屏的原因是BB写图像数据的速率和LCD刷屏的速率不一致引起。
当开启TE时,FMARK 发一个信号到BB端,这时BB端才刷一帧图像,这样两边达到同步,解决切屏问题。
先调用LCD_UPDATE设置所要刷新的窗口大小。再向LCD写一帧数据为全0的图像。
lcd_set_window(left,top,right,bottom);
For(I = 0 ;I <width * height ;I ++){
senddata(0x0);
}
android中LCM刷新异常(花屏,白屏)处理思路
阐述DBI 接口LCM 切屏(tearing)产生原因,及消除tearing的机制,对于没有接FMARK的屏如何尽可能减少tearing ?
Tearing产生的原因:BB通过LCD IF将数据刷到DRIVER IC的GRAM的时间T0与DIRVER IC将GRAM数据刷到LCD的玻璃上的的时间T1不同步,导致Baseband没写完一帧Driver IC就更新了。
针对没有FMARK的屏,只能尽量调整LCD IF送数据的时序及LCD Driver IC刷新频率,使T0、T1达到同步
获得当前显示内容的方法
DDMS 截图方法如下,
Device - -> Screen capture
点击Screen capture,就能抓到当前刷到LCM 屏上的那帧数据
方法二:
adb shell
cat /dev/graphics/fb0 > /data/fbxx.bin
然后将fbxx.bin adb push出来,通过工具查看fbxx.bin