天【tiān】天观焦点:RK3588-Camera:MIPI-CSI调【diào】试之通【tōng】路解析

2024-9-21 20:19:35来源:jf_30051736

一、简介

专栏总目录

本文介绍RK3588平台的Camera:MIPI-CSI调试之通路解析


【资料图】

MIPI联盟,即移动产业处理器接口【kǒu】(Mobile Industry Processor Interface 简【jiǎn】称【chēng】MIPI)联盟。MIPI(移动产业处理器接口【kǒu】)是MIPI联【lián】盟发起【qǐ】的为移【yí】动应用【yòng】处理器制定的开放标准和一个规【guī】范【fàn】。

目的是把手机内部的接口如摄像头、显示屏接口、射频/基带接口【kǒu】等标准化【huà】,从而减少手机设计【jì】的复【fù】杂程度和增加设计【jì】灵活【huó】性。

CSI & DSI

• CSI ( Camera Serial Interface ):摄像头接【jiē】口

• DSI ( Display Serial Interface ):显示【shì】接口

二、 名词解释:

ISP ( Image Signal Processor ): 即图【tú】像【xiàng】信号处理模块, 主要作用是对前端图像传感器输出的信号做后期处理,依赖于 ISP 才能在不同的光学条件下都【dōu】能较好的【de】还原现场细节。VICAP( Video capture ):视频捕获单元

三、RK3588 的camera通路:

多sensor支持:

单路硬件isp最多【duō】支持4路复用,isp复用情况支持分辨【biàn】率如下:2路复用【yòng】:最大分辨率3840x2160,dts对应配置【zhì】2路rkisp_vir设备。3路或4路【lù】复用【yòng】:最大【dà】分辨率2560x1536,dts对应【yīng】配置3或4路rkisp_vir设备。硬件【jiàn】支【zhī】持最多采集7路【lù】sensor:6mipi + 1dvp,多【duō】sensor软【ruǎn】件通路如【rú】下:

下【xià】图是RK3588 camera连接链路示【shì】意图,可以【yǐ】支【zhī】持7路camera。

四、 链路解析:

图中:mipi camera2---> csi2_dphy1 ---> mipi2_csi2 ---> rkcif_mipi_lvds2--->rkcif_mipi_lvds2_sditf --->rkisp0_vir2

对应节【jiē】点:imx415 ---> csi2_dphy0 ---> mipi2_csi2 ---> rkcif_mipi_lvds2--->rkcif_mipi_lvds2_sditf --->rkisp0_vir2

链【liàn】接关【guān】系:sensor---> csi2 dphy---->mipi csi host--->vicap

实线链路解析【xī】: Camera sensor ---> dphy ---> 通【tōng】过mipi_csi2模【mó】块解析mipi协议【yì】---> vicap ( rkcif节点【diǎn】代表vicap )

虚【xū】线链路解【jiě】析:vicap ---> rkcif_mipi_lvds2_sditf ---> isp

每个vicap节点【diǎn】与isp的链接关系,通过【guò】对应虚拟【nǐ】出的XXX_sditf来【lái】指明链接关【guān】系。

五、RK3588硬件通路框图

rk3588支持2个isp硬件,每【měi】个isp设备可虚拟出多个虚【xū】拟节【jiē】点,软【ruǎn】件上通过回读【dú】的方式,依次从ddr读取【qǔ】每一路的【de】图像数据进isp处理。对于多摄【shè】方案,建议将数据流平均分【fèn】配到两个isp上。回读:指数据经过vicap采【cǎi】集到ddr,应用获【huò】取到数据后,将buffer地址【zhǐ】推【tuī】送【sòng】给isp,isp再从ddr获取图【tú】像数据。

六、详细解析:

imx415 : Camera sensorcsi2_dphy0 : rk3588支【zhī】持2个dphy硬件,这里我们【men】称【chēng】之【zhī】为dphy0_hw/dphy1_hw ,,两个【gè】dphy硬件【jiàn】都可以工作在【zài】full mode 和split mode两种模式下。

当使用dphy0_hw:

full mode:节【jiē】点名称使用csi2_dphy0,最多支持4 lane。当【dāng】dphy0_hw使用【yòng】full mode时,链路需【xū】要【yào】按照csi2_dphy1这条链路【lù】来配【pèi】置,但【dàn】是节点名【míng】称csi2_dphy1需要修改为csi2_dphy0,软件【jiàn】上是【shì】通过phy的序号来区分phy使用的【de】模式。split mode:拆分成【chéng】2个phy使用,分别为csi2_dphy1(使用0/1 lane)、csi2_dphy2(使【shǐ】用2/3 lane),每个phy最多【duō】支持2 lane。

当使用dphy1_hw:

full mode:节点名称使用【yòng】csi2_dphy3,最多支【zhī】持4 lane。当dphy1_hw使用【yòng】full mode时,链路需要按照【zhào】csi2_dphy4这条链路来配置,但是节点名称csi2_dphy4需【xū】要修【xiū】改为csi2_dphy3,软件上是通过phy的【de】序号【hào】来【lái】区分phy使用的模式。split mode:拆分成2个phy使用【yòng】,分别【bié】为csi2_dphy4(使用0/1 lane)、csi2_dphy5(使用2/3 lane),每个【gè】phy最【zuì】多支持2 lane。

dcphy:rk3588支持两【liǎng】个dcphy,节点【diǎn】名称分别【bié】为csi2_dcphy0/csi2_dcphy1。每个dcphy硬件支持RX/TX同时使用【yòng】,对【duì】于camera输入使用的是RX。支持DPHY/CPHY协议【yì】复用;需【xū】要注意的是同一个dcphy的TX/RX只【zhī】能【néng】同时使用DPHY或【huò】同时使用CPHY。其他dcphy参数请【qǐng】查【chá】阅rk3588数据手册。

使【shǐ】用【yòng】上述mipi phy节【jiē】点,需要把对【duì】应的物理节点配置上。(csi2_dcphy0_hw/csi2_dcphy1_hw/csi2_dphy0_hw/csi2_dphy1_hw)

每个【gè】mipi phy都需要一个csi2模块来解析mipi协议【yì】,节点名称【chēng】分别【bié】为【wéi】mipi0_csi2~mipi5_csi2。

rk3588所有camera数据都【dōu】需要【yào】通过vicap,再链接到isp。rk3588仅支持一【yī】个【gè】vicap硬件,这个vicap支持同时输【shū】入6路mipi phy,及一【yī】路dvp数据,所以我【wǒ】们将vicap分化【huà】成rkcif_mipi_lvds~rkcif_mipi_lvds5、rkcif_dvp等7个节【jiē】点【diǎn】,各个节点【diǎn】的绑【bǎng】定关系【xì】需要严格【gé】按照框图【tú】的节【jiē】点序【xù】号配置。

每个【gè】vicap节点与isp的链【liàn】接关系,通【tōng】过对应虚【xū】拟出【chū】的【de】XXX_sditf来指明链接关系。

rk3588支持2个isp硬件,每【měi】个isp设【shè】备【bèi】可虚拟出多个虚拟【nǐ】节点,软件上通过回读的【de】方式,依次【cì】从ddr读【dú】取每一路的图像数据进isp处【chù】理。对于多摄方案,建议【yì】将【jiāng】数据流平均分配到两【liǎng】个【gè】isp上【shàng】。

直通与【yǔ】回【huí】读模【mó】式:•直通【tōng】:指数据经【jīng】过vicap采集,直接发送给isp处【chù】理,不存【cún】储到ddr。需要注【zhù】意的【de】是hdr直通时,只有【yǒu】短帧是真正【zhèng】的直通,长帧需要存在ddr,isp再从ddr读取。

•回读:指数据经过vicap采集到ddr,应用获【huò】取【qǔ】到数据【jù】后,将buffer地址【zhǐ】推送给isp,isp再【zài】从【cóng】ddr获【huò】取图【tú】像数据。

•在dts配【pèi】置时,一个isp硬【yìng】件,如【rú】果只配置一个虚拟【nǐ】节点,默【mò】认【rèn】使【shǐ】用直通模式,如果配置了【le】多个虚拟节点默认使用回读模式。

七【qī】、单路Camera的dts配置说明:( 以imx415摄像头【tóu】为例【lì】 )

案例场景【jǐng】:这里【lǐ】使用的是csi2_dphy0的单路camera配【pèi】置:链路配置: imx415 —> csi2_dphy0 —> mipi2_csi2 —> rkcif_mipi_lvds2—>rkcif_mipi_lvds2_sditf —>rkisp0_vir2
&i2c3 {status = "okay";imx415: imx415@1a {status = "okay";compatible = "sony,imx415";reg = < 0x1a >;clocks = < &cru CLK_MIPI_CAMARAOUT_M3 >;clock-names = "xvclk";pinctrl-names = "default";pinctrl-0 = < &mipim0_camera3_clk >;power-domains = < &power RK3588_PD_VI >;pwdn-gpios = < &gpio1 RK_PB0 GPIO_ACTIVE_HIGH >;reset-gpios = < &gpio4 RK_PA0 GPIO_ACTIVE_LOW >;rockchip,camera-module-index = < 0 >;rockchip,camera-module-facing = "back";rockchip,camera-module-name = "CMK-OT2022-PX1";rockchip,camera-module-lens-name = "IR0147-50IRC-8M-F20";port {imx415_out0: endpoint {remote-endpoint = < &mipidphy0_in_ucam0 >;data-lanes = < 1 2 3 4 >;};};};camera_imx219: camera-imx219@10 {status = "disabled";compatible = "sony,imx219";reg = < 0x10 >;clocks = < &clk_cam_24m >;clock-names = "xvclk";rockchip,camera-module-index = < 0 >;rockchip,camera-module-facing = "back";rockchip,camera-module-name = "rpi-camera-v2";rockchip,camera-module-lens-name = "default";port {imx219_out0: endpoint {remote-endpoint = < &mipidphy0_in_ucam1 >;data-lanes = < 1 2 >;};};};};&csi2_dphy0_hw {status = "okay";};&csi2_dphy0 {status = "okay";ports {#address-cells = < 1 >;#size-cells = < 0 >;port@0 {reg = < 0 >;#address-cells = < 1 >;#size-cells = < 0 >;mipidphy0_in_ucam0: endpoint@1 {reg = < 1 >;remote-endpoint = < &imx415_out0 >;data-lanes = < 1 2 3 4 >;};mipidphy0_in_ucam1: endpoint@2 {reg = < 2 >;remote-endpoint = < &imx219_out0 >;data-lanes = < 1 2 >;};};port@1 {reg = < 1 >;#address-cells = < 1 >;#size-cells = < 0 >;csidphy0_out: endpoint@0 {reg = < 0 >;remote-endpoint = < &mipi2_csi2_input >;};};};};&mipi2_csi2 {status = "okay";ports {#address-cells = < 1 >;#size-cells = < 0 >;port@0 {reg = < 0 >;#address-cells = < 1 >;#size-cells = < 0 >;mipi2_csi2_input: endpoint@1 {reg = < 1 >;remote-endpoint = < &csidphy0_out >;};};port@1 {reg = < 1 >;#address-cells = < 1 >;#size-cells = < 0 >;mipi2_csi2_output: endpoint@0 {reg = < 0 >;remote-endpoint = < &cif_mipi2_in0 >;};};};};&rkcif {status = "okay";};&rkcif_mipi_lvds2 {status = "okay";port {cif_mipi2_in0: endpoint {remote-endpoint = < &mipi2_csi2_output >;};};};&rkcif_mipi_lvds2_sditf {status = "okay";port {mipi_lvds2_sditf: endpoint {remote-endpoint = < &isp0_vir0 >;};};};&rkcif_mmu {status = "okay";};&rkisp0 {status = "okay";};&isp0_mmu {status = "okay";};&rkisp0_vir0 {status = "okay";port {#address-cells = < 1 >;#size-cells = < 0 >;isp0_vir0: endpoint@0 {reg = < 0 >;remote-endpoint = < &mipi_lvds2_sditf >;};};};&pinctrl {camera {cam_pwdn_gpio: cam-pwdn-gpio {rockchip,pins = < 1 RK_PB0 RK_FUNC_GPIO &pcfg_pull_up >;};};};

八、 调试技巧

8.1 i2c设备的通用调试命令【lìng】:查看设备是【shì】否挂载到【dào】i2c总线下:

i2cdetect -y 3

8.2 摄像命令

Linux系统摄像命令:
gst-launch-1.0 v4l2src device=/dev/video11 ! video/x-raw,format=NV12,width=3840,height=2160, framerate=30/1 ! xvimagesink

Android系统:

Android系统自带相机APP。点【diǎn】击APP,看摄像【xiàng】画面是否【fǒu】正【zhèng】常显示。

8.3 imx415 相关的log信息

dmesg | grep imx415

8.4 查看拓扑结构

media-ctl -d /dev/media0 -p

审核编辑:汤梓红

为你推荐

最新资讯

股票软件