一、简介
三个代码文件(drm_mipi_dbi.c、drm_panel.c、drm_mipi_dsi.c)的分析。这些文件都是Linux内核DRM(Direct Rendering Manager)子系统的组成部分,主要用于支持显示面板,特别是通过MIPI(Mobile Industry Processor Interface)接口的显示设备。它们提供了显示驱动的框架、面板管理和接口通信的抽象层。
二、代码分析
1. drm_mipi_dbi.c 文件分析
文件概述
- 目的:提供MIPI Display Bus Interface (DBI) LCD控制器的支持。主要针对通过SPI(Serial Peripheral Interface)连接的MIPI Type C显示器(如小型LCD面板)。支持命令发送、帧缓冲更新、电源管理等。
- 关键特性:
- 支持MIPI DBI命令(如读/写内存、设置地址)。
- 处理SPI传输(包括9-bit和8-bit模式)。
- 与DRM框架集成,提供简单显示管道(simple display pipe)。
- 支持调试文件系统(debugfs)和旋转模式。
- 依赖:依赖DRM核心(如drm_connector、drm_framebuffer)、SPI子系统和GPIO。
主要流程
- 初始化:使用mipi_dbi_spi_init初始化DBI结构,设置命令函数(如mipi_dbi_typec1_command或mipi_dbi_typec3_command)。然后调用mipi_dbi_dev_init设置DRM设备、连接器和显示模式。
- 命令发送:通过mipi_dbi_command_read、mipi_dbi_command_buf等函数发送MIPI DCS命令。底层使用SPI传输(如mipi_dbi_spi_transfer)。
- 帧缓冲更新:mipi_dbi_pipe_update处理脏矩形(dirty rectangle),调用mipi_dbi_fb_dirty更新显示内存。涉及缓冲拷贝(mipi_dbi_buf_copy)和窗口地址设置(mipi_dbi_set_window_address)。
- 启用/禁用:mipi_dbi_enable_flush启用面板(包括背光),mipi_dbi_pipe_disable禁用面板(包括清屏)。
- 调试:通过debugfs文件(如"command")允许用户发送命令或读取状态。
- SPI特定处理:处理不同SPI模式(9-bit vs 8-bit),包括字节交换和传输分块。
整体流程:驱动加载 -> 初始化DBI和DRM -> 命令/数据传输 -> 帧更新 -> 电源管理。
mipi_dbi_spi_init (入口: 初始化SPI DBI)-> mipi_dbi_typec1_command (设置命令函数,如果无DC GPIO)-> mipi_dbi_spi1_transfer (9-bit SPI传输)-> mipi_dbi_spi1e_transfer (如果不支持9-bit,模拟)-> spi_sync (底层SPI同步传输)-> mipi_dbi_typec1_command_read (读命令)-> spi_sync-> mipi_dbi_typec3_command (设置命令函数,如果有DC GPIO)-> mipi_dbi_spi_transfer (8/16-bit SPI传输)-> spi_sync-> mipi_dbi_typec3_command_read (读命令)-> spi_syncmipi_dbi_dev_init (入口: 初始化DBI设备)--> drm_simple_display_pipe_init (DRM管道初始化)-> mipi_dbi_connector_get_modes (获取模式)-> drm_mode_duplicate (复制模式)-> mipi_dbi_mode_config_funcs (模式配置)-> drm_gem_fb_create_with_dirty (创建帧缓冲)-> mipi_dbi_rotate_mode (处理旋转)-> mipi_dbi_debugfs_init (调试初始化)-> debugfs_create_file ("command"文件)-> mipi_dbi_debugfs_command_write (写命令)-> mipi_dbi_command_buf-> mipi_dbi_debugfs_command_show (读命令)-> mipi_dbi_command_bufmipi_dbi_command_buf (核心: 发送命令)-> mipi_dbi_command_stackbuf (栈缓冲版本)--> dbi->command (调用typec1或typec3命令函数)-> mipi_dbi_spi_transfer (或模拟)mipi_dbi_pipe_update (更新管道)-> drm_atomic_helper_damage_merged (计算脏矩形)-> mipi_dbi_fb_dirty (脏帧更新)-> mipi_dbi_buf_copy (拷贝缓冲)-> drm_fb_memcpy / drm_fb_xrgb8888_to_rgb565 (格式转换)-> mipi_dbi_set_window_address (设置地址)-> mipi_dbi_command_buf (写内存开始)mipi_dbi_enable_flush (启用)-> mipi_dbi_fb_dirty (全屏刷新)-> backlight_enable (背光)mipi_dbi_pipe_disable (禁用)-> backlight_disable-> mipi_dbi_blank (清屏)-> mipi_dbi_set_window_address-> mipi_dbi_command_buf
2. drm_panel.c 文件分析
文件概述
- 目的:提供DRM面板帮助器框架,用于注册和管理显示面板(如LCD)。允许驱动通过中央注册表检索面板,并处理面板的电源、背光和模式探测。
- 关键特性:
- 面板注册/注销(链表管理)。
- 标准操作:准备(上电)、启用(开启显示)、禁用、获取模式。
- 支持OF(OpenFirmware)设备树查找面板。
- 集成背光设备(可选)。