修改V4L2的Video Pipeline的devicetree

电子说

1.2w人已加入

描述

介绍

PetaLinux 能够根据Vivado的设计,自动生成V4L2的Video Pipeline的devicetree。但是它主要为Xilinx的VCU TRD服务,测试的组合比较少。很多时候,需要根据自己的工程,修改V4L2的Video Pipeline的devicetree。

硬件设计

有项目需要对输入的视频,既需要对原始视频做编解码,也需要缩放后再做编解码。于是创建了下面的硬件设计。

Linux

axis_data_fifo主要用于暂时缓存数据。axis_broadcaster和vpss之间的axis_data_fifo、axis_register_slice,可以删除,完全不影响共。

两个framebuffer_write的tready通过逻辑门的“或”操作,连接到了一起,再连接到前级axis_register_slice的输入,保证只要有一个framebuffer_write在工作,前面的模块就能向后输出数据。

devicetree

对于上述的硬件设计,对应的V4L2的devicetree如下:

&amba_pl {

/delete-node/ axis_broadcasterhdmi_input_axis_broadcaster_0@0;

/* media-ctl prints out each node name of the video pipeline.

hdmi_brdcst_0@0: media-ctl prints it out. */

hdmi_brdcst_0_lb: hdmi_brdcst_0@0 {

compatible = “xlnx,axis-broadcaster-1.1”;

hdmi_brdcst_0_ports: ports {

#address-cells = ;

#size-cells = ;

};

};

/delete-node/ vcapaxis_broad_out1hdmi_input_axis_broadcaster_0;

/delete-node/ vcap_hdmi_input_v_proc_ss_0;

/* vcap_hdmi_brdcst_0: media-ctl prints it out. */

vcap_hdmi_brdcst_0 {

compatible = “xlnx,video”;

dma-names = “port0”, “port1”;

dmas = , ;

/* vcap_hdmi_brdcst_0_ports: Linux prints it out in log. */

vcap_hdmi_brdcst_0_ports: ports {

#address-cells = ;

#size-cells = ;

vcap_broadcaster_0_port1: port@0 {

direction = “input”;

reg = ;

/* Video input pipeline 1:

hdmi_rx_ss --》 broadcaster_0 : 1 --》 v_proc_ss_0 --》 v_frmbuf_wr_1

hdmi_rx_ss : source_to_axis_broad_in0_from_v_hdmi_rx_ss_0

broadcaster_0 : out 1 : port2 :: src_to_vpss0_from_broad_port2_hwout1

v_proc_ss_0 @a0040000 port@0 :: sink_to_vpss0_from_broad_port2_hwout1

v_proc_ss_0 @a0040000 port@1 :: src_to_frmbuf_wr1_from_vpss_0

v_frmbuf_wr_1 @a0080000 :: hdmi_input_v_frmbuf_wr_1

*/

sink_to_frmbuf_wr1_from_vpss_0: endpoint {

remote-endpoint = ;

};

};

vcap_broadcaster_0_port2: port@1 {

direction = “input”;

reg = ;

/* Video input pipeline 0:

hdmi_rx_ss --》 broadcaster_0 : 0 --》 v_frmbuf_wr_0

hdmi_rx_ss : source_to_axis_broad_in0_from_v_hdmi_rx_ss_0

broadcaster_0 : out 0 : port1 :: src_to_frmbuf_wr0_from_broad_port1_hwout0

v_frmbuf_wr_1 @a0010000 :: hdmi_input_v_frmbuf_wr_0

hdmi_input_ v_frmbuf_wr_0 hdmi_input_ axis_broadcaster_0

*/

sink_to_frmbuf_wr0_from_broad_port1_hwout0: endpoint {

remote-endpoint = ;

};

};

};

};

};

/* hdmi_input_v_hdmi_rx_ss_0: v_hdmi_rx_ss@a0000000 */

&hdmirx_porthdmi_input_v_hdmi_rx_ss_0 {

source_to_axis_broad_in0_from_v_hdmi_rx_ss_0: endpoint {

remote-endpoint = ;

};

};

&hdmi_brdcst_0_ports{

/delete-node/ axis_broad_port1hdmi_input_axis_broadcaster_0;

/delete-node/ axis_broad_port2hdmi_input_axis_broadcaster_0;

/delete-node/ axis_broad_port0hdmi_input_axis_broadcaster_0;

axis_broad_port1_hw_output0: port@1 {

reg = ;

src_to_frmbuf_wr0_from_broad_port1_hwout0: endpoint {

remote-endpoint = ;

};

};

axis_broad_port2_hw_output1: port@2 {

reg = ;

src_to_vpss0_from_broad_port2_hwout1: endpoint {

remote-endpoint = ;

};

};

axis_broad_port0_hw_input: port@0 {

reg = ;

sink_to_broad_in0__from_v_hdmi_rx_ss_0: endpoint {

remote-endpoint = ;

};

};

};

&scaler_portshdmi_input_v_proc_ss_0{

/delete-node/ port@0;

/delete-node/ port@1;

scaler_port1_v_proc_ss_0: port@1 {

/* For xlnx,video-format user needs to fill as per their requirement */

reg = ;

xlnx,video-format = ;

xlnx,video-width = ;

src_to_frmbuf_wr1_from_vpss_0: endpoint {

remote-endpoint = ;

};

};

scaler_port0_v_proc_ss_0: port@0 {

/* For xlnx,video-format user needs to fill as per their requirement */

reg = ;

xlnx,video-format = ;

xlnx,video-width = ;

sink_to_vpss0_from_broad_port2_hwout1: endpoint {

remote-endpoint = ;

};

};

};

上述的devicetree,使用了更短更好理解的标签名称。

v_proc_ss的devicetree里,port@0是输入;port@1是输出。

broadcaster的devicetree里,port@0是输入;port@1和port@2是输出。

另外,V4L2的设备号,根据“xlnx,video”设备里的port顺序分配。 如果port@0在port@1后面,那么port@0也会被分配video1; 而port@1也会被分配video0.

审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分