rk3568相关设备树显示屏rk3568的crtcVOP是RK 系列的显示硬件IP也就是lcd控制器对应的软件抽象叫crtcstm32mp1对应的是ltdcVOP有两个版本VOP1和VOP2不同版本对应其对多显的支持方式不同VOP1:VOP2:RK3568数据手册说明使用的是VOP2显示子系统由于drm的独立驱动较多并不是同时probe但彼此又存在依赖关系而由-EPROBE_DEFER管理比较麻烦于是使用component将其统一管理等到需要的component的驱动都已经probe就会调用component提供的bind设备树display_subsystem对应的驱动为rockchip_drm_drv.cprobe使用component_master_add_with_match创建component_masterrockchip_drm_platform_of_probe会解析ports节点然后找到port对应的节点解析iommus记录是否支持mmurockchip_drm_match_add就是将需要的子驱动加入match记录drm框架需要哪些子驱动当记录的这些驱动已经probecomponent_add后便会执行component_master提供的rockchip_drm_ops.bind()创建drm_device并初始化drm_mode_config用来记录drm下有关的子设备其中mode_config.funcs.atomic_commit是用来设置子设备的参数然后调用各个驱动的component.bind之后根据设备树中的route判断当前板子要使用哪条显示输出路径然后根据这条 route 找到对应的 VOP/VP、Encoder、Connector 等 DRM 资源并把它们组织成一条可以工作的 DRM 显示链路选择显示链路设备树中初始使用的是LCD_TYPE_HDMI_VP0使用MIPI的话要用LCD_TYPE_MIPIVOP设备树对应驱动rockchip_vop2_reg.c,probe会根据compatible获取plane/window相关属性plane表示图片如何显示window表示使用哪个硬件去读取rockchip_drm_vop2.c其中的component.bind会负责根据win获取创建plane的资源描述并给每个vp都创建一个crtc和与其绑定独有的primary plane其余覆盖的win也创建plane并连接所有crtcdsi的bind会创建encoder类型为dsi并通过remote-point查找encoder可以连接的crtc之后将panel直接和connector连接,connector和encoder连接屏幕使用的是panel-simple.c摄像头IMX415创建I2C_driver框架struct v4l2_subdev_ops提供对不同设备的操作方式v4l2_subdev_ops.v4l2_subdev_video_ops提供对子设备操作的接口Probe 函数中首先对 dts 进行解析获取 regulator, gpio, clk 等信息用以对 sensor 上下电。其次注册 media entity, v4l2 subdev, 及 v4l2 controller 信息。注意到 v4l2 subdev 的注册是异步。如下几个关键的函数调用。v4l2_i2c_subdev_init (), 注册为一个 v4l2 subdev参数中提供回调函数imx415_initialize_controls ()初始化 v4l2 controlsmedia_entity_init ()注册成为一个 media entityimx415 仅有一个输出即 Source PadPadv4l2_async_register_subdev ()声明 sensor 需要异步注册。因为 RKISP1 及 CIF 都采用异步注册 sub device所以这个调用是必须的