Android 关于display的几个问题

本文探讨了Android系统中显示层如何使用双缓冲进行数据传输,以及底层如何处理这两个缓冲区。内容包括:帧缓冲的构成、DPI buffer和Assert Layer buffer的计算,以及DBI接口屏的数据刷新过程。TE信号的作用在于解决切屏问题,确保BB写数据速率与LCD刷新速率同步。此外,还讨论了Android中LCM刷新异常的处理思路,以及如何通过DDMS截图和adb命令获取当前显示内容。
AI助手已提取文章相关产品:

现在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上。









•针对DBI接口,TE 信号的作用是什么?

    TE信号是为了解决切屏问题引入的,硬件管脚为FMARK。产生切屏的原因是BB写图像数据的速率和LCD刷屏的速率不一致引起。

  当开启TE时,FMARK 发一个信号到BB端,这时BB端才刷一帧图像,这样两边达到同步,解决切屏问题。

•针对DBI接口,如何往LCD 写一帧黑屏?

    先调用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,即“断层”“分屏”“撕裂”现象
Tearing产生的原因:BB通过LCD IF将数据刷到DRIVER IC的GRAM的时间T0与DIRVER IC将GRAM数据刷到LCD的玻璃上的的时间T1不同步,导致Baseband没写完一帧Driver IC就更新了。
针对有FMARK的屏,硬件将FMARK脚接到BB LCDC TE脚,软件上开启TE功能。原理是,LCM GRAM中的显示信息被刷新到LCD PANEL后,LCD Driver IC会发出一个同步sync信号告诉BB可以更新 Frame Buffer内容到LCM Gram了。保证了上述T0 、T1时间上不会重叠
针对没有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







您可能感兴趣的与本文相关内容

Android系统中,RemoteDisplay(远程显示)是一项重要的功能,允许将设备上的内容镜像或流式传输到其他屏幕设备上。实现RemoteDisplay通常涉及以下几个方面:底层协议支持、SurfaceFlinger服务的配置、以及应用层的适配与调试。 ### 1. RemoteDisplay 的实现原理 RemoteDisplay 的核心机制是通过 `MediaProjection` 或 `VirtualDisplay` 实现屏幕内容的捕获和转发。`VirtualDisplay` 是 Android 提供的一个 API,用于创建虚拟显示器,并将其内容渲染到特定的 Surface 上。此 Surface 可以连接到 MediaCodec 编码器,进行视频编码并通过网络传输给远程设备[^1]。 ```java DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE); VirtualDisplay virtualDisplay = displayManager.createVirtualDisplay( "remote_display", width, height, dpi, surface, // 目标 Surface,例如 MediaCodec 的输入 Surface DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC, null, null, null); ``` ### 2. 开发实践:构建远程显示流程 开发过程中需要完成以下关键步骤: - **请求权限**:使用 `MediaProjectionManager` 请求用户授权。 - **创建 VirtualDisplay**:绑定编码器输出的 Surface。 - **编码与传输**:使用 `MediaCodec` 进行 H.264/H.265 编码,并通过 RTP/RTSP 等协议进行网络传输。 - **远程解码与渲染**:接收端使用 `MediaPlayer` 或 `ExoPlayer` 解码并播放视频流。 示例代码片段如下: ```java // 创建 MediaProjection MediaProjection mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data); // 创建 VirtualDisplay 并关联 MediaCodec 的输入 Surface virtualDisplay = mediaProjection.createVirtualDisplay( "screen-mirror", width, height, dpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, encoderSurface, null, null); ``` ### 3. 调试指南 调试 RemoteDisplay 功能时,可以借助 ADB 工具查看系统日志、检查 SurfaceFlinger 状态、以及验证 VirtualDisplay 是否成功创建。 - 查看日志: ```bash adb logcat -s SurfaceFlinger ``` - 列出当前所有显示设备: ```bash adb shell dumpsys display ``` - 检查是否启用硬件加速编码器: ```bash adb shell media.codec_proxy ``` 此外,在某些设备上可能需要 root 权限才能访问底层图形资源,此时可使用 `adb root` 和 `adb remount` 命令提升访问权限[^2]。 ### 4. 性能优化建议 为了提升 RemoteDisplay 的性能表现,建议采取以下措施: - 使用硬件加速编码器(如 OMX.qcom.video.encoder.avc),降低 CPU 占用率。 - 调整分辨率与帧率,平衡画质与带宽消耗。 - 合理设置缓冲区大小,避免丢帧或延迟过高。 - 结合 Kotlin 协程优化异步任务调度,提高响应速度[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值