1. 程式人生 > 其它 >【分享】解決VPSS設計中沒有media裝置的問題

【分享】解決VPSS設計中沒有media裝置的問題

【分享】解決VPSS設計中沒有media裝置的問題

作者: 付漢傑 [email protected] [email protected]

使用hdmi-rx, vpss, frmbuf_write,設計了video輸入的pipeline。使用PetaLinux基於XSA做了linux,編譯成功,啟動也成功。

但是後來查詢視訊裝置,只有video裝置,沒有media裝置。

root@dapd-0330-tpg-peta:~# ls /dev/vid*
/dev/video0  /dev/video1  /dev/video2  /dev/video3  /dev/video4  /dev/video5
root@dapd-0330-tpg-peta:~# ls /dev/medi*
ls: /dev/medi*: No such file or directory

檢查啟動日誌,發現一些異常。比如of_reserved_mem_device_init返回值是負數,表示出錯。

[    3.949086] xlnx,scaler-bridge a4440000.v_proc_ss: xlnx drm scaler experimental driver probed
[    3.957768] debugfs: File 'xlnx_bridge-v_proc_ss' in directory 'xlnx-bridge' already present!
[    3.966288] xlnx,scaler-bridge a4480000.v_proc_ss: xlnx drm scaler experimental driver probed
[    3.974966] debugfs: File 'xlnx_bridge-v_proc_ss' in directory 'xlnx-bridge' already present!
[    3.983485] xlnx,scaler-bridge a44c0000.v_proc_ss: xlnx drm scaler experimental driver probed
[    4.307936] xvip_dma_init:1613.
[    4.311071] xvip_graph_dma_init_one:733.
[    4.314988] xilinx-video amba_pl@0:vcap_v_proc_ss_12: parsing node ffff0501fdfe7f18
[    4.314993] xilinx-video amba_pl@0:vcap_v_proc_ss_12: handling endpoint ffff0501fdfe85e0
[    4.315002] xilinx-video amba_pl@0:vcap_v_proc_ss_12: parsing node ffff0501fdfda748
[    4.315006] xilinx-video amba_pl@0:vcap_v_proc_ss_12: handling endpoint ffff0501fdfdb648
[    4.315037] xilinx-video amba_pl@0:vcap_v_proc_ss_12: handling endpoint ffff0501fdfdbac8
[    4.315046] xilinx-video amba_pl@0:vcap_v_proc_ss_12: parsing node ffff0501fdfe27b8
[    4.315050] xilinx-video amba_pl@0:vcap_v_proc_ss_12: handling endpoint ffff0501fdfe31c8
[    4.315057] xilinx-video amba_pl@0:vcap_v_proc_ss_12: xdev->atomic_streamon:0
[    4.322188] xilinx-video amba_pl@0:vcap_v_proc_ss_12: of_reserved_mem_device_init: -19
[    4.322192] xilinx-video amba_pl@0:vcap_v_proc_ss_12: device registered
[    4.328940] xvip_graph_init:798.
[    4.332163] xvip_graph_dma_init:756.
[    4.335734] xvip_graph_dma_init:766.
[    4.339303] xvip_graph_dma_init_one:720.
[    4.343221] xvip_dma_init:1408.
[    4.346354] xvip_dma_init:1416.
[    4.349487] xvip_dma_init:1459.
[    4.352617] xvip_dma_init:1485.

但是檢查下面程式碼,驅動中雖然報錯,但也繼續初始化了。看樣子,這部分程式碼不是必須的。

    ret = of_reserved_mem_device_init(&pdev->dev);
    if (ret) {
        dev_dbg(&pdev->dev, "of_reserved_mem_device_init: %d\n", ret);
    }

注意到列印中的DRM,意識到這是用於顯示的驅動。仔細檢查devicetree,PetaLinux自動生成的devicetree如下:

v_proc_ss_12: v_proc_ss@a4380000 {
	clock-names = "aclk_axis", "aclk_ctrl";
	clocks = <&misc_clk_2>, <&misc_clk_2>;
	compatible = "xlnx,v-proc-ss-2.3", "xlnx,vpss-scaler-2.2", "xlnx,v-vpss-scaler-2.2", "xlnx,vpss-scaler";
}

檢查Linux程式碼,發現有兩個vpss的驅動。第一個驅動是V4L2的驅動drivers\media\platform\xilinx\xilinx-vpss-scaler.c,它的匹配字串如下:

static const struct of_device_id xscaler_of_id_table[] = {
    {
        .compatible = "xlnx,v-vpss-scaler",
        .data = &xlnx_scaler
    },
    {
        .compatible = "xlnx,v-vpss-scaler-1.0",
        .data = &xlnx_scaler_v1_0
    },
    {
        .compatible = "xlnx,v-vpss-scaler-2.2",
        .data = &xlnx_scaler_v2_2
    },
    { /* end of table */ }
};

第一個驅動是DRM的驅動drivers\gpu\drm\xlnx\Xlnx_scaler.c,它的匹配字串如下:

static const struct of_device_id xilinx_scaler_of_match[] = {
	{ .compatible = "xlnx,vpss-scaler",
		.data = &xlnx_scaler},
	{ .compatible = "xlnx,vpss-scaler-2.2",
		.data = &xlnx_scaler_v2_2},
	{ }
};

PetaLinux自動生成的devicetree的第一個字串是 "xlnx,v-proc-ss-2.3",都沒有匹配。第二個字串是"xlnx,vpss-scaler-2.2",匹配了DRM的驅動,所以載入了VPSS的DRM驅動。

目前需求是做V4L2的裝置,把匹配字串改為"xlnx,v-vpss-scaler-2.2"。

後來media裝置,能夠載入成功。