引自免费微信小程序:皆我百晓生
在您的描述中,您正在尝试基于RK3588和LT9611UXC芯片开发一个MIPI转HDMI的解决方案,并且在Linux环境下遇到了DRM驱动的相关问题。您需要在DRM框架下编写一个bridge驱动以实现自动检测后端HDMI显示器的功能,同时发现目前输出的分辨率与实际显示器支持的分辨率不符,尤其是在4K分辨率下时序识别不正确。
从您提供的日志信息来看:
-
图1显示了RK3588的两个视频端口状态,其中Video Port2(HDMI-B-1)配置为3840x2160p50的分辨率,但是LT9611UXC的日志提示未能从列表中找到正确的视频模式,这意味着它可能没有正确解析或匹配到当前连接的HDMI显示器的EDID数据中的有效时序信息。
-
LT9611UXC的日志内容表明,MIPI接口的部分参数如像素宽度、高度、总线时钟频率以及行同步和帧同步信号的设置情况。但存在“Do not find a video from the list!!”的错误信息,这说明LT9611UXC在处理来自RK3588的MIPI信号时无法找到与当前显示器相匹配的视频模式。
解决这个问题的关键在于正确读取并解析HDMI显示器的EDID数据,并根据这些信息动态调整LT9611UXC的转换参数。以下是一个简化的步骤:
- 在Linux DRM驱动中添加对LT9611UXC桥接芯片的支持,通常需要实现
drm_bridge_driver
结构体,并覆盖必要的方法,比如prepare
, commit
, 和mode_fixup
等,以便在DRM流水线中插入对LT9611UXC芯片进行时序转换的操作。
static const struct drm_bridge_funcs lt9611uxc_bridge_funcs = {
.attach = lt9611uxc_attach,
.detach = lt9611uxc_detach,
.enable = lt9611uxc_enable,
.disable = lt9611uxc_disable,
.mode_fixup = lt9611uxc_mode_fixup, // 根据EDID调整输入输出模式
// 其他必要函数...
};
static struct drm_bridge_driver lt9611uxc_bridge_driver = {
.driver = {
.name = "lt9611uxc",
},
.funcs = <9611uxc_bridge_funcs,
};
- 在
mode_fixup
函数中,应获取连接到HDMI端口的显示器的EDID信息,然后根据EDID数据生成或选择合适的输出时序。这部分代码通常会涉及读取EDID、解析时序、以及将这些时序转换为LT9611UXC所需的MIPI时序格式。
static int lt9611uxc_mode_fixup(struct drm_bridge *bridge,
struct drm_display_mode *mode,
struct drm_connector *connector)
{
struct lt9611uxc_private_data *pdata = bridge->dev->_drvdata;
struct edid *edid = connector->display_info.raw_edid;
if (edid) {
// 解析EDID获取所需时序
// ...
// 将解析出的HDMI时序转换为MIPI时序,并设置到LT9611UXC寄存器中
pdata->set_mipi_timing(mode->hdisplay, mode->vdisplay, hsync, vsync, pixel_clock);
}
return 0;
}
由于这是一个相当复杂的过程,涉及到具体的硬件寄存器操作和EDID解析算法,这里只能给出大致的思路和伪代码。完整的源码实现需要查阅LT9611UXC的数据手册,理解其工作原理和寄存器布局,同时结合DRM子系统的API来完成。此外,还需要确保MIPI DSI控制器(即RK3588)的输出时序也与LT9611UXC的输入要求一致。
建议联系瑞芯微(Rockchip)获取更多技术支持和参考代码,或者查找是否有公开的开源项目已经实现了类似功能。对于涉及版权和保密性的源码请求,请遵循相关法律法规及商业合同约束,不宜直接在公开场合索取或提供。