Android启动前预渲染DDR频率过高,DRM connector与crtc禁用问题咨询
DRM相关问题解答
1. 用户空间操作DRM的相关资料查阅路径
- 内核官方文档:内核源码
Documentation/gpu/目录下包含全量DRM规范说明,其中drm-uapi.rst专门针对用户空间API做了完整定义,若使用的是厂商定制Android BSP,可在对应BSP的文档目录中查找平台特有的DRM扩展说明 - 系统原生头文件:Android NDK或源码树的
prebuilts/ndk/[对应版本]/usr/include/drm/目录下,drm.h、drm_mode.h等头文件包含了所有DRM用户空间操作的API、结构体、常量定义 - Android平台实现源码:
frameworks/native/libs/ui/、frameworks/native/services/surfaceflinger/目录下的DRM适配代码,是Android环境下用户空间操作DRM的最贴合实际场景的参考资料
2. 禁用connector与crtc的实现方法
你可以结合启动时序需求选择以下两种方案:
方案一:通过libdrm API调用实现(适用于正式量产版本)
核心操作逻辑如下:
- 调用
drmModeGetResources获取当前DRM设备的所有资源句柄 - 调用
drmModeGetConnector获取shared-disp-1对应的connector实例,确认当前绑定的crtc ID - 调用
drmModeSetCrtc,传入目标crtc ID,将fb_id、connectors指针、connector count等参数全部设为0,即可同时关闭crtc的active、enable状态,自动解除connector与crtc的绑定关系 - 操作完成后调用
drmModeFreeConnector、drmModeFreeResources释放申请的资源
你可以将该操作插入到SurfaceFlinger初始化完成、第一帧画面上屏前的时间点执行,既可以避免预绘制阶段释放资源导致的黑屏间隙,又能在DRM资源被系统显示服务接管前完成闲置组件关闭,解决DDR频率过高的问题
方案二:通过debugfs节点操作(适用于调试验证阶段)
如果需要快速验证效果,可直接操作DRM的debugfs节点实现禁用:
- 执行
echo 0 > /sys/kernel/debug/dri/0/crtc-6/enable即可直接关闭crtc的使能状态 - 执行
echo "detach" > /sys/kernel/debug/dri/0/connector-168/status即可解除connector与crtc的绑定
内容的提问来源于stack exchange,提问作者RomanUser13579
相关产品推荐
相关产品推荐

