MTK Linux DRM分析(二十九)- MTK mtk_dsi.c(Part.1)
一、代码函数分析
1. drm_mode_vfp
功能说明: 计算显示模式的垂直前肩(Vertical Front Porch, VFP),即垂直同步信号开始到显示区域开始的行数。
参数:
- const struct drm_display_mode *mode:显示模式结构体,包含分辨率、时序等信息。
返回值:
- u16:垂直前肩的行数。如果输入模式为空或分辨率为0,返回0。
备注:
- 函数检查输入模式是否有效,计算 vsync_start - vdisplay 以获取VFP值。
- 用于显示时序配置。
2. drm_mode_hfp
功能说明: 计算显示模式的水平前肩(Horizontal Front Porch, HFP),即水平同步信号开始到显示区域开始的像素数。
参数:
- const struct drm_display_mode *mode:显示模式结构体,包含分辨率、时序等信息。
返回值:
- u16:水平前肩的像素数。如果输入模式为空或分辨率为0,返回0。
备注:
- 函数检查输入模式是否有效,计算 hsync_start - hdisplay 以获取HFP值。
- 用于显示时序配置。
3. drm_mode_equal_res
功能说明: 比较两个显示模式的分辨率是否相同,并打印分辨率切换信息。
参数:
- const struct drm_display_mode *mode1:第一个显示模式。
- const struct drm_display_mode *mode2:第二个显示模式。
返回值:
- bool:如果分辨率相同(hdisplay 和 vdisplay 相等),返回 true;否则返回 false。如果任一模式为空或都为空,返回相应的布尔值。
备注:
- 使用 DDPMSG 打印分辨率和刷新率变化信息。
- 用于判断是否需要调整显示设置。
4. mtk_dsi_mask
功能说明: 对DSI寄存器的指定位域进行掩码操作,设置或清除特定位。
参数:
- struct mtk_dsi *dsi:DSI控制器结构体,包含寄存器基地址。
- u32 offset:寄存器偏移地址。
- u32 mask:掩码,用于指定要操作的位。
- u32 data:要写入的数据。
返回值:
- 无(void)。
备注:
- 读取寄存器当前值,使用掩码操作更新指定位后写回。
- 用于精确控制DSI硬件寄存器的位域。
5. mtk_dsi_doze_state
功能说明: 获取DSI控制器的低功耗(Doze)状态。
参数:
- struct mtk_dsi *dsi:DSI控制器结构体。
返回值:
- bool:返回当前是否处于Doze状态(基于CRTC状态)。
备注:
- 通过检查CRTC状态中的 CRTC_PROP_DOZE_ACTIVE 属性判断。
- 用于低功耗模式的判断。
6. mtk_dsi_doze_status_change
功能说明: 检查DSI控制器的Doze状态是否发生变化。
参数:
- struct mtk_dsi *dsi:DSI控制器结构体。
返回值:
- bool:如果Doze状态发生变化,返回 true;否则返回 false。
备注:
- 比较当前Doze状态与DSI结构体中的缓存状态。
- 用于检测状态切换以触发相应操作。
7. mtk_dsi_pre_cmd
功能说明: 在发送DSI命令之前执行预处理操作,确保硬件准备就绪。
参数:
- struct mtk_dsi *dsi:DSI控制器结构体。
- struct drm_crtc *crtc:DRM CRTC结构体,表示显示控制器。
返回值:
- 无(void)。
备注:
- 如果DSI处于命令模式,会创建一个命令队列包(cmdq_pkt),等待帧完成和DSI空闲状态。
- 使用GCE(Global Command Engine)等待事件并清除阻塞状态。
- 确保命令发送前的硬件状态正确。
8. mtk_dsi_post_cmd
功能说明: 在发送DSI命令之后执行后处理操作,恢复硬件状态。
参数:
- struct mtk_dsi *dsi:DSI控制器结构体。
- struct drm_crtc *crtc:DRM CRTC结构体。
返回值:
- 无(void)。
备注:
- 如果DSI处于命令模式,会创建一个命令队列包,检查DSI空闲状态并设置相关事件。
- 用于命令发送后的清理和状态恢复。
9. mtk_dsi_dphy_timconfig
功能说明: 配置DSI D-PHY的时序参数,用于高速传输。
参数:
- struct mtk_dsi *dsi:DSI控制器结构体。
- void *handle:命令队列句柄(cmdq_pkt),用于GCE操作。
返回值:
- 无(void)。
备注:
- 根据数据速率(data_rate)计算时序参数(如LPX、HS_PREP、HS_ZERO等)。
- 如果存在扩展参数(dsi->ext->params),使用面板提供的时序值覆盖默认值。
- 支持通过命令队列或直接寄存器写入配置时序。
- 确保参数符合硬件约束(如LPX为偶数,HS_PREP >= 6)。
10. mtk_dsi_cphy_timconfig
功能说明: 配置DSI C-PHY的时序参数,用于高速传输。
参数:
- struct mtk_dsi *dsi:DSI控制器结构体。
- void *handle:命令队列句柄(cmdq_pkt)。
返回值:
- 无(void)。
备注:
- 类似于 mtk_dsi_dphy_timconfig,但专为C-PHY设计,计算不同的时序参数。
- 支持特定MMSYS(如MT6983、MT6985等)平台的约束。
- 配置寄存器 DSI_CPHY_CON0 以启用C-PHY模式。
- 更新 data_phy_cycle 用于后续计算。
11. mtk_dsi_phy_timconfig
功能说明: 根据DSI是否使用C-PHY,选择调用D-PHY或C-PHY时序配置函数。
参数:
- struct mtk_dsi *dsi:DSI控制器结构体。
- struct cmdq_pkt *handle:命令队列句柄。
返回值:
- 无(void)。
备注:
- 检查面板扩展参数(dsi->ext)是否存在,并根据 is_cphy 标志选择调用 mtk_dsi_cphy_timconfig 或 mtk_dsi_dphy_timconfig。
- 提供统一的时序配置接口。
12. mtk_dsi_dual_enable
功能说明: 启用或禁用DSI的双通道模式。
参数:
- struct mtk_dsi *dsi:DSI控制器结构体。
- bool enable:是否启用双通道模式。
返回值:
- 无(void)。
备注:
- 通过修改 DSI_CON_CTRL 寄存器的 DSI_DUAL_EN 位启用或禁用双通道。
- 用于支持高分辨率显示的双DSI配置。
13. mtk_dsi_enable
功能说明: 启用DSI控制器。
参数:
- struct mtk_dsi *dsi:DSI控制器结构体。
返回值:
- 无(void)。
备注:
- 设置 DSI_CON_CTRL 寄存器的 DSI_EN 位以启用DSI。
- 如果驱动数据(driver_data)要求等待FIFO满,可启用 DSI_CM_WAIT_FIFO_FULL_EN。
14. mtk_dsi_disable
<