Linux DRM (Direct Rendering Manager) 子系统是内核图形框架的核心,drm_drv.c 文件负责 DRM 设备的注册、初始化和注销等通用驱动逻辑。它不直接实现 plane、CRTC、connector 或 encoder 的具体功能,这些功能分别在 drm_plane.c、drm_crtc.c、drm_connector.c 和 drm_encoder.c 中定义。drm_drv.c 通过调用 drm_mode_config.c 中的辅助函数(如 drm_mode_config_reset 和 drm_mode_config_cleanup)来间接调用这些文件中的函数。
调用关系主要发生在 DRM 设备注册 (drm_dev_register) 和注销 (drm_dev_unregister) 过程中。这些调用通常是间接的:
- 直接调用:drm_drv.c 会直接调用 drm_connector.c 中的函数(如 drm_connector_register_all)。
- 间接调用:通过 drm_mode_config.c 的函数循环遍历 plane、CRTC、encoder 和 connector 列表,调用各自文件中的函数或驱动提供的回调函数(funcs,如 reset、disable_plane、destroy 等)。这些 funcs 由硬件驱动实现,但结构体(如 struct drm_plane、struct drm_crtc 等)定义在相应文件中。
- drm_drv.c 本身不直接初始化 plane 等组件;这是由硬件驱动在 probe/load 阶段调用 drm_plane_init_new、drm_crtc_init_new、drm_encoder_init 和 drm_connector_init 等函数完成的(这些 init 函数分别在 drm_plane.c、drm_crtc.c、drm_encoder.c 和 drm_connector.c 中定义)。
主要函数分析
- drm_dev_register (drm_drv.c): 注册 DRM 设备到系统。调用 drm_mode_config_reset 重置模式配置,调用 drm_connector_register_all 注册所有 connector。
- drm_dev_unregister (drm_drv.c): 注销 DRM 设备。调用 drm_mode_config_cleanup 清理模式配置。
- 其他函数如 drm_dev_alloc/drm_dev_init 用于分配设备结构体,但不涉及直接调用目标文件。
分析方法
- 主要函数识别 :
- drm_drv.c 的核心函数包括设备初始化(drm_dev_init、devm_drm_dev_alloc)、注册(drm_dev_register)、注销(drm_dev_unregister)等。
- 这些函数通过调用 drm_mode_config.c 和其他文件(如 drm_connector.c)中的函数,间接或直接与 drm_plane.c、drm_crtc.c、drm_connector.c 和 drm_encoder.c 交互。
- 调用路径 :
- 直接调用:drm_dev_register 直接调用 drm_modeset_register_all(drm_mode_config.c),后者调用 drm