瑞芯微Rockchip开发者社区
直播中

小麦地

12年用户 1662经验值
私信 关注
[问答]

RK3399图显系统的软件框架结构是怎样的?

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使用了前者。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分