linux dsi接口,Linux DRM那些事-component框架介绍

一、component介绍

Linux内核component代码实现文件:drivers/base/component.c。

使用git log -p component.c命令,可以查看该文件的第一次提交记录。

commit 2a41e6070dd7ef539d0f3b1652b4839d04378e11

Author: Russell King

Date: Fri Jan 10 23:23:37 2014 +0000

drivers/base: provide an infrastructure for componentised subsystems

Subsystems such as ALSA, DRM and others require a single card-level

device structure to represent a subsystem. However, firmware tends to

describe the individual devices and the connections between them.

Therefore, we need a way to gather up the individual component devices

together, and indicate when we have all the component devices.

We do this in DT by providing a "superdevice" node which specifies

the components, eg:

imx-drm {

compatible = "fsl,drm";

crtcs = ;

connectors = ;

};

The superdevice is declared into the component support, along with the

subcomponents. The superdevice receives callbacks to locate the

subcomponents, and identify when all components are present. At this

point, we bind the superdevice, which causes the appropriate subsystem

to be initialised in the conventional way.

When any of the components or superdevice are removed from the system,

we unbind the superdevice, thereby taking the subsystem down.

Linux内核引入component框架的目的:

在DRM、ALSA等子系统中,通过超级设备(superdevice)管理多个组件(component)加载顺序,保证所有组件都可正常使用。

二、超级设备

1.超级设备定义

超级设备也可称为master,一般指某个子系统(如:display-subsystem)。定义文件:rk3399.dtsi,内容如下:

display_subsystem: display-subsystem {

compatible = "rockchip,display-subsystem";

ports = , ;

clocks = , ;

clock-names = "hdmi-tmds-pll", "default-vop-pll";

devfreq = ;

status = "disabled";

};

2.超级设备加载

超级设备通过component_master_add_with_match()函数进行match注册,实现文件:rockchip_drm_drv.c,内容如下:

static int rockchip_drm_platform_probe(struct platform_device *pdev)

{

...

/*

* Bind the crtc ports first, so that

* drm_of_find_possible_crtcs called from encoder .bind callbacks

* works as expected.

*/

for (i = 0;; i++) {

...

port = of_parse_phandle(np, "ports", i);

...

component_match_add(dev, &match, compare_of, port->parent); ## 1. Bind CRTC

of_node_put(port);

}

...

/*

* For each bound crtc, bind the encoders attached to its

* remote endpoint.

*/

for (i = 0;; i++) {

port = of_parse_phandle(np, "ports", i);

...

rockchip_add_endpoints(dev, &match, port); ## 2. add endpoints for each port

of_node_put(port);

}

...

return component_master_add_with_match(dev, &rockchip_drm_ops, match);

}

三、component设备

1.component设备定义

component设备用来表示vop和各显示接口(如:HDMI、MIPI等),定义文件:rk3399.dtsi,内容如下:

vopl_out: port {

#address-cells = <1>;

#size-cells = <0>;

vopl_out_dsi: endpoint@0 {

reg = <0>;

remote-endpoint = ;

};

...

vopl_out_hdmi: endpoint@2 {

reg = <2>;

remote-endpoint = ;

};

...

};

vopb_out: port {

#address-cells = <1>;

#size-cells = <0>;

...

vopb_out_dsi: endpoint@1 {

reg = <1>;

remote-endpoint = ;

};

vopb_out_hdmi: endpoint@2 {

reg = <2>;

remote-endpoint = ;

};

...

};

2.component设备加载

component设备通过component_add()函数进行加载。

vop实现文件rockchip_vop_reg.c,代码如下:

static int vop_probe(struct platform_device *pdev)

{

...

return component_add(dev, &vop_component_ops);

}

HDMI接口实现文件dw_hdmi-rockchip.c,代码如下:

static int dw_hdmi_rockchip_probe(struct platform_device *pdev)

{

...

return component_add(&pdev->dev, &dw_hdmi_rockchip_ops);

}

其它接口暂不介绍。

PS:

VOP(Video Output Processor)是Rockchip系列SoC的显示控制器。RK3399显示特性如下:

1、Dual VOP: one supports 4096x2160 with AFBC supported;The other supports 2560x1600

2、Dual channel MIPI-DSI (4 lanes per channel)

3、eDP 1.3 (4 lanes with 10.8Gbps) to support display, with PSR

4、HDMI 2.0 for 4K 60Hz with HDCP 1.4/2.2

5、DisplayPort 1.2 (4 lanes, up to 4K 60Hz)

6、Supports Rec.2020 and conversion to Rec.709

RK3399的数据手册里没有找到VOP的框图,比较遗憾。欢迎神通广大的同学伸出援助之手,多谢!

注:本文代码基于RockPI 4A Debian系统Linux 4.4内核。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值