RK3399
回帖(1)
2022-3-7 13:51:28
1. RK3399图显系统介绍
RK3399支持两个视频显示控制器,称之为VOP。可以支持的显示外设包括HDMI、MIPI-DSI、eDP、DisplayPort等。
2. 图显系统软件框架
RK3399图显系统的软件框架定义了各组件之间的拓扑关系、绑定流程及DRM系统注册等内容。相较于树莓派4B在驱动代码中定义各个组件之间的拓扑关系,RK3399则是在设备树中定义各组件之间的关系,然后在驱动代码解析设备树实现各组件的绑定。由于vopb和vopl支持的分辨率不同,所以,每个图显外设的设备树同两个vop均进行了关联。
2.1 设备树定义
RK3399的设备树框架如下图所示,在display-subsystem下挂接了两个端口vopl_out、vopb_out,这两个端口分别属于node vopl与node vopb。在node vop中各挂接4各端口,分别指向node MIPI、node edp、node hdmi、node dp等。
设备树中通过ports和port定义端口。通过#address-cells和#size-cells限定phandle reg编号。利用endpoint与remote-endpoint进行端口间的联结。
设备树中多媒体IP端口的定义如下:
device { ...
ports { #address-cells = <1>;
#size-cells = <0>;
port@0 { ...
endpoint@0 { ... };
endpoint@1 { ... };
};
};
};
具体请参考kernel文档
Documentation/devicetree/bindings/media/video-interfaces.txt
设备树中描述多媒体IP之间联结关系的定义如下:
device-1 {
port {
device_1_output: endpoint {
remote-endpoint = <&device_2_input>;
};
};
};
device-2 {
port {
device_2_input: endpoint {
remote-endpoint = <&device_1_output>;
};
};
};
具体请参考kernel文档
Documentation/devicetree/bindings/graph.txt
2.2 设备树解析
RK3399 DRM图显系统基于display-subsystem的匹配字符串rockchip,display-subsystem为入口进行驱动程序的注册。
static const struct of_device_id rockchip_drm_dt_ids[] = {
{ .compatible = "rockchip,display-subsystem", },
{ /* sentinel */ },
};
MODULE_DEVICE_TABLE(of, rockchip_drm_dt_ids);
static struct platform_driver rockchip_drm_platform_driver = {
.probe = rockchip_drm_platform_probe,
.remove = rockchip_drm_platform_remove,
.shutdown = rockchip_drm_platform_shutdown,
.driver = {
.name = "rockchip-drm",
.of_match_table = rockchip_drm_dt_ids,
.pm = &rockchip_drm_pm_ops,
},
};
在rockchip_drm_platform_of_probe()函数中解析rockchip,display-subsystem中的phandle ports属性。获得ports vopl对应的device_node信息,如下:
vopl_out: port {
#address-cells = <1>;
#size-cells = <0>;
该port对应vopl: vop@ff8f0000 {,此时获取到了第一个图显控制器。在rockchip_drm_platform_of_probe中循环获取ports的连接关系。
static int rockchip_drm_platform_of_probe(struct device *dev)
{
struct device_node *np = dev->of_node;
struct device_node *port;
bool found = false;
int i;
if (!np)
return -ENODEV;
for (i = 0;; i++) {
struct device_node *iommu;
port = of_parse_phandle(np, "ports", i);
if (!port)
break;
if (!of_device_is_available(port->parent)) {
of_node_put(port);
continue;
}
...
found = true;
of_node_put(iommu);
of_node_put(port);
}
之后,基于component架构完成各图显IP组件的注册。component_match_add()和drm_of_component_match_add都可以实现图显IP和图显控制器之间的联结关系的绑定。 前者可以通过驱动platform_find_device_by_driver去查找到对应设备信息,后者通过解析设备树获取对应的设备信息。rk3399使用了前者。
1. RK3399图显系统介绍
RK3399支持两个视频显示控制器,称之为VOP。可以支持的显示外设包括HDMI、MIPI-DSI、eDP、DisplayPort等。
2. 图显系统软件框架
RK3399图显系统的软件框架定义了各组件之间的拓扑关系、绑定流程及DRM系统注册等内容。相较于树莓派4B在驱动代码中定义各个组件之间的拓扑关系,RK3399则是在设备树中定义各组件之间的关系,然后在驱动代码解析设备树实现各组件的绑定。由于vopb和vopl支持的分辨率不同,所以,每个图显外设的设备树同两个vop均进行了关联。
2.1 设备树定义
RK3399的设备树框架如下图所示,在display-subsystem下挂接了两个端口vopl_out、vopb_out,这两个端口分别属于node vopl与node vopb。在node vop中各挂接4各端口,分别指向node MIPI、node edp、node hdmi、node dp等。
设备树中通过ports和port定义端口。通过#address-cells和#size-cells限定phandle reg编号。利用endpoint与remote-endpoint进行端口间的联结。
设备树中多媒体IP端口的定义如下:
device { ...
ports { #address-cells = <1>;
#size-cells = <0>;
port@0 { ...
endpoint@0 { ... };
endpoint@1 { ... };
};
};
};
具体请参考kernel文档
Documentation/devicetree/bindings/media/video-interfaces.txt
设备树中描述多媒体IP之间联结关系的定义如下:
device-1 {
port {
device_1_output: endpoint {
remote-endpoint = <&device_2_input>;
};
};
};
device-2 {
port {
device_2_input: endpoint {
remote-endpoint = <&device_1_output>;
};
};
};
具体请参考kernel文档
Documentation/devicetree/bindings/graph.txt
2.2 设备树解析
RK3399 DRM图显系统基于display-subsystem的匹配字符串rockchip,display-subsystem为入口进行驱动程序的注册。
static const struct of_device_id rockchip_drm_dt_ids[] = {
{ .compatible = "rockchip,display-subsystem", },
{ /* sentinel */ },
};
MODULE_DEVICE_TABLE(of, rockchip_drm_dt_ids);
static struct platform_driver rockchip_drm_platform_driver = {
.probe = rockchip_drm_platform_probe,
.remove = rockchip_drm_platform_remove,
.shutdown = rockchip_drm_platform_shutdown,
.driver = {
.name = "rockchip-drm",
.of_match_table = rockchip_drm_dt_ids,
.pm = &rockchip_drm_pm_ops,
},
};
在rockchip_drm_platform_of_probe()函数中解析rockchip,display-subsystem中的phandle ports属性。获得ports vopl对应的device_node信息,如下:
vopl_out: port {
#address-cells = <1>;
#size-cells = <0>;
该port对应vopl: vop@ff8f0000 {,此时获取到了第一个图显控制器。在rockchip_drm_platform_of_probe中循环获取ports的连接关系。
static int rockchip_drm_platform_of_probe(struct device *dev)
{
struct device_node *np = dev->of_node;
struct device_node *port;
bool found = false;
int i;
if (!np)
return -ENODEV;
for (i = 0;; i++) {
struct device_node *iommu;
port = of_parse_phandle(np, "ports", i);
if (!port)
break;
if (!of_device_is_available(port->parent)) {
of_node_put(port);
continue;
}
...
found = true;
of_node_put(iommu);
of_node_put(port);
}
之后,基于component架构完成各图显IP组件的注册。component_match_add()和drm_of_component_match_add都可以实现图显IP和图显控制器之间的联结关系的绑定。 前者可以通过驱动platform_find_device_by_driver去查找到对应设备信息,后者通过解析设备树获取对应的设备信息。rk3399使用了前者。
举报
更多回帖