這篇文章給大家介紹一下RK3568雙攝的調(diào)試,RK3568有一個(gè)4lane的mipi dphy,最高支持2.5G/bps每lane,ISP自帶csi host,最高處理8M的圖像,rk3568這個(gè)mipi dphy還有一個(gè)處理方法,就是拆分成2個(gè)2lane的使用,其中一個(gè)連接到單獨(dú)的csi host,另一個(gè)連接到isp內(nèi)部自帶的csi host,這樣就可以支持雙攝同時(shí)的應(yīng)用場(chǎng)景,下面介紹一下雙攝的調(diào)試。
目錄
(1)RK3568 camera資源介紹
①RK3568 MIPI CSI
②VICAP
③ISP
(2)RK3568雙攝調(diào)試
①雙攝硬件連接
②dts配置
③抓數(shù)據(jù)流確認(rèn)
④HAL層適配
⑤接vicap的sensor的MIPI信號(hào)異常導(dǎo)致畫面異常復(fù)位機(jī)制
(3)總結(jié)
(1)RK3568 camera資源介紹
①RK3568 MIPI CSI
RK356x有一個(gè)DPHY,其中有兩個(gè)clk lane,可做4lane使用,也可以做2x2lane使用。
type | Max bandwidth | NUM | Mode | |
DPHY | DPHY v1.2 | 2.5Gbps x 4 lanes | 1 | 4lane or 2lane+2lane |
②VICAP
VICAP控制器可以接CSI HOST的輸入,輸入分辨率一般沒有限制,主要是ddr帶寬的限制。
接口 | 數(shù)量 | 輸入 | 輸出 |
VICAP | 1 | BT601 YCbCr 422 8bit, RAW 8/10/12 BT656 YCbCr 422 8bit 逐行/隔行 BT1120 YCbCr 422 16bit 逐行/隔行,單/雙邊沿采樣 2/4 通道交錯(cuò)BT656/BT1120 YCbCr 422 8/16bit 逐行/隔行 MIPI CSI 4路IDs虛擬通道 MIPI CSI RAW8/10/12/14, YUV422 |
NV16/NV12/YUV400/YUYV 緊湊/非緊湊 RAW |
③ISP
RK3568ISP屬于RKISP V2.1的版本
吞吐率 | 最大分辨率 | 輸入格式 | |
單ISP 單CIS | 8M@30 | 4096x2304 | raw8/raw10/raw12/YUV422 |
(2)RK3568雙攝調(diào)試
RK3568雙攝同時(shí)打開的話,需要滿足吞吐率符合要求,因?yàn)镈PHY總計(jì)只有4lane,因此雙攝都必須是2lane或者小于2lane的sensor。
①雙攝硬件連接
需要使用到MIPI的?CLK0 和 CLK1:
MIPI_RX_CLK0 和 MIPI_RX_D0-1 一組,使用CLK0
MIPI_RX_CLK1 和 MIPI_RX_D2-3 一組,使用CLK1
②dts配置
鏈接關(guān)系 1: sensor1->csi2_dphy1->isp_vir0
鏈接關(guān)系 2: sensor2->csi2_dphy2->mipi_csi2->vicap ......->isp_vir1
實(shí)例使用gc2093+gc2053,參考配置如下:
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* Copyright (c) 2022 Rockchip Electronics Co., Ltd.
*
*/
&csi2_dphy_hw {
status = "okay";
};
/*
* csi2_dphy1 & csi2_dphy2 used for split mode,
* csi2_dphy0 used for full mode,
* full mode and split mode are mutually exclusive
*/
&csi2_dphy0 {
status = "disabled";
/delete-node/ ports;
};
&csi2_dphy1 {
status = "okay";
/*
* dphy1 only used for split mode,
* can be used concurrently with dphy2
* full mode and split mode are mutually exclusive
*/
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
mipi_in_gc2093_rgb: endpoint@2 {
reg = <2>;
remote-endpoint = <&gc2093_out>;
data-lanes = <1 2>;
};
};
port@1 {
reg = <1>;
#address-cells = <1>;
#size-cells = <0>;
dphy1_out: endpoint@1 {
reg = <1>;
remote-endpoint = <&mipi_csi2_input>;
};
};
};
};
&csi2_dphy2 {
status = "okay";
/*
* dphy2 only used for split mode,
* can be used concurrently with dphy1
* full mode and split mode are mutually exclusive
*/
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
mipi_in_gc2053_ir: endpoint@1 {
reg = <1>;
remote-endpoint = <&gc2053_out>;
data-lanes = <1 2>;
};
};
port@1 {
reg = <1>;
#address-cells = <1>;
#size-cells = <0>;
dphy2_out: endpoint@1 {
reg = <1>;
remote-endpoint = <&isp_in1>;
};
};
};
};
&mipi_csi2 {
status = "okay";
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
mipi_csi2_input: endpoint@1 {
reg = <1>;
remote-endpoint = <&dphy1_out>;
data-lanes = <1 2>;
};
};
port@1 {
reg = <1>;
#address-cells = <1>;
#size-cells = <0>;
mipi_csi2_output: endpoint@0 {
reg = <0>;
remote-endpoint = <&cif_mipi_in>;
data-lanes = <1 2>;
};
};
};
};
&i2c4 {
status = "okay";
/delete-node/ gc8034@37;
/delete-node/ os04a10@36;
/delete-node/ ov5695@36;
gc2053: gc2053@37 {
status = "okay";
compatible = "galaxycore,gc2053";
reg = <0x37>;
clocks = <&pmucru CLK_WIFI>;
clock-names = "xvclk";
power-domains = <&power RK3568_PD_VI>;
pinctrl-names = "default";
pinctrl-0 = <&refclk_pins>;
reset-gpios = <&gpio3 RK_PB5 GPIO_ACTIVE_LOW>;
pwdn-gpios = <&gpio4 RK_PB5 GPIO_ACTIVE_LOW>;
rockchip,camera-module-index = <1>;
rockchip,camera-module-facing = "front";
rockchip,camera-module-name = "DW-RV2093-V1.0";
rockchip,camera-module-lens-name = "JZ-7070AS-A3";
port {
gc2053_out: endpoint {
remote-endpoint = <&mipi_in_gc2053_ir>;
data-lanes = <1 2>;
};
};
};
gc2093: gc2093@7e {
status = "okay";
compatible = "galaxycore,gc2093";
reg = <0x7e>;
clocks = <&cru CLK_CIF_OUT>;
clock-names = "xvclk";
power-domains = <&power RK3568_PD_VI>;
pinctrl-names = "default";
pinctrl-0 = <&cif_clk>;
reset-gpios = <&gpio3 RK_PB6 GPIO_ACTIVE_LOW>;
pwdn-gpios = <&gpio4 RK_PB4 GPIO_ACTIVE_HIGH>;
rockchip,camera-module-index = <0>;
rockchip,camera-module-facing = "front";
rockchip,camera-module-name = "DW-RV2093-V1.0";
rockchip,camera-module-lens-name = "JZ-7070AS-A1";
port {
gc2093_out: endpoint {
remote-endpoint = <&mipi_in_gc2093_rgb>;
data-lanes = <1 2>;
};
};
};
};
&rkcif {
status = "okay";
};
&rkcif_mipi_lvds {
status = "okay";
port {
cif_mipi_in: endpoint {
remote-endpoint = <&mipi_csi2_output>;
data-lanes = <1 2>;
};
};
};
&rkcif_mipi_lvds_sditf {
status = "okay";
port {
mipi_lvds_sditf: endpoint {
remote-endpoint = <&isp_in2>;
data-lanes = <1 2>;
};
};
};
&rkcif_mmu {
status = "okay";
};
&rkisp {
status = "okay";
max-input = <3840 2160 30>;
};
&rkisp_mmu {
status = "okay";
};
&rkisp_vir0 {
status = "okay";
/* gc2053-ir->dphy2->isp_vir0 */
port {
#address-cells = <1>;
#size-cells = <0>;
isp_in1: endpoint@0 {
reg = <0>;
remote-endpoint = <&dphy2_out>;
};
};
};
&rkisp_vir1 {
status = "okay";
/* gc2093-rgb->dphy1->csi2->vicap */
/* vicap sditf->isp_vir1 */
port {
#address-cells = <1>;
#size-cells = <0>;
isp_in2: endpoint@0 {
reg = <0>;
remote-endpoint = <&mipi_lvds_sditf>;
};
};
};
③抓數(shù)據(jù)流確認(rèn)
需要注意一個(gè)點(diǎn)是,RK3568雙攝的使用場(chǎng)景時(shí),第二路必須使用回讀模式,也就是必須將AIQ跑起來才可以同時(shí)從兩路的ISP輸出抓到數(shù)據(jù)流。
第一路直通ISP的sensor可以直接從對(duì)應(yīng)的ISP節(jié)點(diǎn)抓數(shù)據(jù)流,第二路鏈路可以先保證從vicap的節(jié)點(diǎn)抓到數(shù)據(jù)流,之后再跑aiq的回讀模式確認(rèn)回讀到ISP的數(shù)據(jù)。
使用如下命令可以查看對(duì)應(yīng)的節(jié)點(diǎn):
rk3568_t:/ # grep -H '' /sys/class/video4linux/video*/name
/sys/class/video4linux/video0/name:stream_cif_mipi_id0
/sys/class/video4linux/video1/name:stream_cif_mipi_id1
/sys/class/video4linux/video10/name:rkisp_rawrd0_m
/sys/class/video4linux/video11/name:rkisp_rawrd2_s
/sys/class/video4linux/video12/name:rkisp-statistics
/sys/class/video4linux/video13/name:rkisp-input-params
/sys/class/video4linux/video14/name:rkisp_mainpath
/sys/class/video4linux/video15/name:rkisp_selfpath
/sys/class/video4linux/video16/name:rkisp_rawwr0
/sys/class/video4linux/video17/name:rkisp_rawwr2
/sys/class/video4linux/video18/name:rkisp_rawwr3
/sys/class/video4linux/video19/name:rkisp_rawrd0_m
/sys/class/video4linux/video2/name:stream_cif_mipi_id2
/sys/class/video4linux/video20/name:rkisp_rawrd2_s
/sys/class/video4linux/video21/name:rkisp-statistics
/sys/class/video4linux/video22/name:rkisp-input-params
/sys/class/video4linux/video3/name:stream_cif_mipi_id3
/sys/class/video4linux/video4/name:rkcif-mipi-luma
/sys/class/video4linux/video5/name:rkisp_mainpath
/sys/class/video4linux/video6/name:rkisp_selfpath
/sys/class/video4linux/video7/name:rkisp_rawwr0
/sys/class/video4linux/video8/name:rkisp_rawwr2
/sys/class/video4linux/video9/name:rkisp_rawwr3
一般是video0和video5兩個(gè)同時(shí)抓數(shù)據(jù)流確認(rèn),如果正常,則說明底層通路是正常的。
④HAL層適配
HAL層主要需要適配pipeline,雙攝對(duì)應(yīng)場(chǎng)景的pipeline,HAL層可能沒有完全支持,可以在如下位置進(jìn)行自行按需求增加修改:
hardware/rockchip/camera/psl/rkisp2/RKISP2GraphConfig.cpp:
if(mIsMipiInterface){
if ((mipName.find("dphy2") != std::string::npos) && (mipName2.find("mipi") != std::string::npos)) {
//for dual camera
if(PlatformData::supportDualVideo()) {
addLinkParams(mipName, mipSrcPad, mipName2, csiSinkPad, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
addLinkParams(mipName2, 1, "stream_cif_mipi_id0", 0, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
addLinkParams(mipName2, 2, "stream_cif_mipi_id1", 0, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
addLinkParams(mipName2, 3, "stream_cif_mipi_id2", 0, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
addLinkParams(mipName2, 4, "stream_cif_mipi_id3", 0, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
addLinkParams("rkisp-csi-subdev", 2, "rkisp_rawwr0", 0, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
addLinkParams("rkisp-csi-subdev", 4, "rkisp_rawwr2", 0, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
addLinkParams("rkisp-csi-subdev", 5, "rkisp_rawwr3", 0, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
addLinkParams("rkisp-isp-subdev", 2, "rkisp_mainpath", 0, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
addLinkParams("rkisp-isp-subdev", 2, "rkisp_selfpath", 0, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
}
} else if(mipName2.find("mipi") != std::string::npos) {
addLinkParams(mipName, mipSrcPad, mipName2, csiSinkPad, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
addLinkParams(mipName2, 1, "stream_cif_mipi_id0", 0, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
addLinkParams(mipName2, 2, "stream_cif_mipi_id1", 0, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
addLinkParams(mipName2, 3, "stream_cif_mipi_id2", 0, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
addLinkParams(mipName2, 4, "stream_cif_mipi_id3", 0, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
mSensorLinkedToCIF = true;
} else {
addLinkParams(mipName, mipSrcPad, csiName, csiSinkPad, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
addLinkParams(csiName, csiSrcPad, IspName, ispSinkPad, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
addLinkParams(csiName, 2, "rkisp_rawwr0", 0, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
addLinkParams(csiName, 4, "rkisp_rawwr2", 0, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
addLinkParams(csiName, 5, "rkisp_rawwr3", 0, 1, MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
}
}
HAL 還需要配置雙攝的屬性,通知AIQ走回讀模式:
diff --git a/common/platformdata/PlatformData.cpp b/common/platformdata/PlatformData.cpp
index 4d9257f..91cf277 100755
--- a/common/platformdata/PlatformData.cpp
+++ b/common/platformdata/PlatformData.cpp
@@ -1047,7 +1047,7 @@ CameraHWInfo::CameraHWInfo() :
mProductName = "<not_set>";
mManufacturerName = "<not set>";
mCameraDeviceAPIVersion = CAMERA_DEVICE_API_VERSION_3_3;
- mSupportDualVideo = false;
+ mSupportDualVideo = true;
mSupportExtendedMakernote = false;
mSupportFullColorRange = true;
mSupportIPUAcceleration = false;
如果是比較新的SDK,通過XML配置屬性即可:
<cITMaxMargin value="10"/> <!--coarse integration time max margin -->
<aiq.multicamera value="true"/> <!-- true or false -->
⑤接vicap的sensor的MIPI信號(hào)異常導(dǎo)致畫面異常復(fù)位機(jī)制
mipi 信號(hào)出錯(cuò),導(dǎo)致 vicap(356x 的 mipi接收端)從某幀開始丟了幾行,少的幾行由下一幀的前面幾行補(bǔ)上;所以造成畫面斷層(仔細(xì)觀察預(yù)覽畫面,畫面底部會(huì)有斷層),如果剛好丟的行數(shù)是奇數(shù)行,那由于bayer rgb順序變掉,isp出來的效果就是偏紫的這種是處理信號(hào)低概率出錯(cuò)情況,概率如果高,一直reset也不是辦法,且reset會(huì)丟幀卡頓,也有可能會(huì)閃紅一兩幀的如果高概率出現(xiàn)mipi報(bào)錯(cuò),還是要硬件信號(hào)確認(rèn)下。文章來源:http://www.zghlxwxcb.cn/news/detail-403247.html
&rkcif_mipi_lvds {
status = "okay";
/* parameters for do cif reset detecting:
* index0: monitor mode,
0 for idle,
1 for continue,
2 for trigger,
3 for hotplug (for nextchip)
* index1: the frame id to start timer,
min is 2
* index2: frame num of monitoring cycle
* index3: err time for keep monitoring
after finding out err (ms)
* index4: csi2 err reference val for resetting
*/
rockchip,cif-monitor = <3 2 3 1000 5>;
port {
cif_mipi_in: endpoint {
remote-endpoint = <&mipi_csi2_output>;
data-lanes = <1 2>;
};
};
};
(3)總結(jié)
這篇文章主要介紹了RK3568/rk3566的camera資源以及雙攝的配置調(diào)試,很多人會(huì)發(fā)現(xiàn)rk3568除了兩路mipi camera的支持,還能支持一路dvp接口的camera,是否可以同時(shí)支持3路camera的場(chǎng)景?當(dāng)然是可以的,下次再給大家分享一下3攝的配置調(diào)試。文章來源地址http://www.zghlxwxcb.cn/news/detail-403247.html
到了這里,關(guān)于RK3568/RK3566 mipi雙攝調(diào)試(gc2093+gc2053)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!