专栏总目录
本文介绍RK3588平台的Camera:MIPI-CSI调试之通路解析
【资料图】
MIPI联盟,即移【yí】动产业处【chù】理器接口(Mobile Industry Processor Interface 简称MIPI)联【lián】盟。MIPI(移动【dòng】产业【yè】处理器【qì】接口)是MIPI联盟发起的【de】为移动应用处理器制定【dìng】的【de】开放标准和一个规范。
目的是把手机内部的接口如摄像头、显示屏接口、射频/基带接【jiē】口【kǒu】等标准化,从而减【jiǎn】少手机设计的复杂程【chéng】度和增加设计灵活性。
CSI & DSI
• CSI ( Camera Serial Interface ):摄像头接口【kǒu】
• DSI ( Display Serial Interface ):显示接口【kǒu】
下图是RK3588 camera连接链路示意图【tú】,可以支持7路camera。
图中:mipi camera2---> csi2_dphy1 ---> mipi2_csi2 ---> rkcif_mipi_lvds2--->rkcif_mipi_lvds2_sditf --->rkisp0_vir2
对应节点:imx415 ---> csi2_dphy0 ---> mipi2_csi2 ---> rkcif_mipi_lvds2--->rkcif_mipi_lvds2_sditf --->rkisp0_vir2
链【liàn】接关系:sensor---> csi2 dphy---->mipi csi host--->vicap
实线链【liàn】路【lù】解析【xī】: Camera sensor ---> dphy ---> 通过mipi_csi2模块解析mipi协【xié】议---> vicap ( rkcif节点代表【biǎo】vicap )
虚【xū】线链【liàn】路解析:vicap ---> rkcif_mipi_lvds2_sditf ---> isp
每个vicap节【jiē】点与isp的链接关系,通过对应虚拟出【chū】的XXX_sditf来指明链【liàn】接关系【xì】。
当使用dphy0_hw:
full mode:节点名称【chēng】使【shǐ】用【yòng】csi2_dphy0,最多支持4 lane。当【dāng】dphy0_hw使用full mode时,链路需要【yào】按【àn】照csi2_dphy1这条链路来配置,但【dàn】是【shì】节点名【míng】称csi2_dphy1需要修改为csi2_dphy0,软【ruǎn】件上是【shì】通【tōng】过【guò】phy的序号来【lái】区分phy使用的模式。split mode:拆分成2个phy使用,分别为csi2_dphy1(使用0/1 lane)、csi2_dphy2(使用【yòng】2/3 lane),每个phy最多支持2 lane。当使用dphy1_hw:
full mode:节【jiē】点名【míng】称使用【yòng】csi2_dphy3,最多【duō】支【zhī】持4 lane。当dphy1_hw使用full mode时,链路需要按照【zhào】csi2_dphy4这条【tiáo】链路【lù】来【lái】配【pèi】置,但是节点【diǎn】名称csi2_dphy4需要修改【gǎi】为csi2_dphy3,软件【jiàn】上是通【tōng】过phy的【de】序号来区【qū】分phy使用的模式。split mode:拆分成2个phy使用,分别【bié】为csi2_dphy4(使用0/1 lane)、csi2_dphy5(使用2/3 lane),每个phy最多【duō】支【zhī】持2 lane。dcphy:rk3588支持两个【gè】dcphy,节点名称分别为csi2_dcphy0/csi2_dcphy1。每个【gè】dcphy硬件支【zhī】持RX/TX同【tóng】时【shí】使用,对于camera输入【rù】使【shǐ】用【yòng】的是RX。支持【chí】DPHY/CPHY协议复用;需要注意的是同【tóng】一个dcphy的【de】TX/RX只能同时使用【yòng】DPHY或同【tóng】时使用CPHY。其他dcphy参数请查阅rk3588数据手册。
使用上【shàng】述mipi phy节点【diǎn】,需要【yào】把对【duì】应的物理节点配置上。(csi2_dcphy0_hw/csi2_dcphy1_hw/csi2_dphy0_hw/csi2_dphy1_hw)
每个mipi phy都需要一个csi2模块来【lái】解析mipi协议,节点【diǎn】名称分别为mipi0_csi2~mipi5_csi2。
rk3588所有camera数【shù】据都需【xū】要通过vicap,再链接到【dào】isp。rk3588仅支持一【yī】个vicap硬件,这个【gè】vicap支持同时输入6路mipi phy,及一【yī】路dvp数据,所以我们将vicap分【fèn】化成rkcif_mipi_lvds~rkcif_mipi_lvds5、rkcif_dvp等【děng】7个节点,各个节点的绑定关系需要严格按照框【kuàng】图的【de】节点序号配【pèi】置。
每【měi】个【gè】vicap节点与isp的链接关系,通【tōng】过对应虚拟出的XXX_sditf来指【zhǐ】明【míng】链接关系。
rk3588支持2个isp硬件,每个isp设备可【kě】虚拟出多【duō】个虚拟节点【diǎn】,软【ruǎn】件上通过【guò】回读的方式,依次【cì】从ddr读【dú】取每【měi】一路的图像数据【jù】进isp处【chù】理。对于【yú】多摄方案【àn】,建议将数据【jù】流平均分配到两个isp上。
直通与回读模式:•直通:指数据经过【guò】vicap采集,直接发【fā】送【sòng】给【gěi】isp处【chù】理,不存【cún】储到ddr。需【xū】要注【zhù】意的是hdr直【zhí】通时,只【zhī】有短【duǎn】帧是真正的直通,长帧需要存在ddr,isp再从ddr读取。
•回读:指数据经过vicap采集到ddr,应用【yòng】获取到数据后,将buffer地【dì】址推送给isp,isp再从【cóng】ddr获取图像数据【jù】。
•在dts配置时,一个isp硬件,如果只配置一【yī】个虚拟节点,默认使用【yòng】直【zhí】通【tōng】模式,如【rú】果配置了多【duō】个虚拟节点默【mò】认【rèn】使用回【huí】读模式。
&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 >;};};};
i2cdetect -y 3
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,看摄像画面是否【fǒu】正【zhèng】常显示【shì】。
dmesg | grep imx415
media-ctl -d /dev/media0 -p
审核编辑:汤梓红