rk3568相关设备树
显示屏
rk3568的crtc
VOP是RK 系列的显示硬件IP也就是lcd控制器,对应的软件抽象叫crtc;
stm32mp1对应的是ltdc;
VOP有两个版本,VOP1和VOP2不同版本对应其对多显的支持方式不同;
VOP1:![]()
VOP2:![]()
RK3568数据手册说明使用的是VOP2
显示子系统
由于drm的独立驱动较多,并不是同时probe但彼此又存在依赖关系,而由-EPROBE_DEFER管理比较麻烦;于是使用component将其统一管理:等到需要的component的驱动都已经probe就会调用component提供的bind;
设备树display_subsystem对应的驱动为rockchip_drm_drv.c,probe使用component_master_add_with_match创建component_master
rockchip_drm_platform_of_probe会解析ports节点然后找到port对应的节点解析iommus,记录是否支持mmu
rockchip_drm_match_add就是将需要的子驱动加入match
记录drm框架需要哪些子驱动
当记录的这些驱动已经probe+component_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_MIPI
VOP设备树对应驱动rockchip_vop2_reg.c,probe会根据compatible获取plane/window相关属性(plane表示图片如何显示,window表示使用哪个硬件去读取),
rockchip_drm_vop2.c其中的component.bind会负责根据win获取创建plane的资源描述,
并给每个vp都创建一个crtc和与其绑定独有的primary plane,其余覆盖的win也创建plane并连接所有crtc
dsi的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 controls
- media_entity_init (),注册成为一个 media entity,imx415 仅有一个输出,即 Source Pad
Pad
- v4l2_async_register_subdev (),声明 sensor 需要异步注册。因为 RKISP1 及 CIF 都采用异步注册 sub device,所以这个调用是必须的