OV5648调试分享(mipi camera)

板子:rk3568
平台:android11

1. kernel修改

1.1设备树

在设备树文件添加如下节点:

&i2c2 {
    
    
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&i2c2m1_xfer>;

	ov5648: ov5648@36 {
    
    
		status = "okay";
		compatible = "ovti,ov5648";
		reg = <0x36>;
		clocks = <&cru CLK_CIF_OUT>;
		clock-names = "xvclk";
		/* avdd-supply = <&vcc2v8_dvp>; */
		// dovdd-supply = <&vcc1v8_dvp>;
		// dovdd-supply = <&vcc1v8_dvp>;
		/* dvdd-supply = <&vcc1v8_dvp>; */
		device_type = "v4l2-i2c-subdev";
		
		power-domains = <&power RK3568_PD_VI>;
		// pinctrl-names = "default";
		pinctrl-names = "rockchip,camera_default";
		pinctrl-0 = <&cif_clk>, <&ov5648_rst_gpio>, <&ov5648_pwdn_gpio>; //<&ov5648_power_gpio>, 
		//reset pin control by hardware,used this pin switch to mipi input
		//1->2LANE(LANE 0&1) FRONT camera, 0->4LANE REAR camera
		// power-gpios = <&gpio0 RK_PB0 GPIO_ACTIVE_HIGH>;
		reset-gpios = <&gpio3 RK_PD4 GPIO_ACTIVE_HIGH>;
		pwdn-gpios = <&gpio3 RK_PD5 GPIO_ACTIVE_HIGH>;
		rockchip,camera-module-index = <0>;
		rockchip,camera-module-facing = "back";
		rockchip,camera-module-name = "THDS11073_Largan";
		// rockchip,camera-module-lens-name = "default";
		rockchip,camera-module-lens-name = "40122a1";
		port {
    
    
			ov5648_out: endpoint {
    
    
				remote-endpoint = <&mipi_in_ucam0>;
				data-lanes = <1 2>;
			};
		};
	};

};
  • 我这里的供电是硬件指定好的所以不需要自己配置,关于dovdd,avdd,dvdd说明如下:
- dovdd-supply: Digital I/O voltage supply, 
- avdd-supply: Analog voltage supply, 
- dvdd-supply: Digital core voltage supply,
  • power-domains = <&power RK3568_PD_VI>;这个是时钟的电源域

  • pwdn-gpios: 这个引脚的作用是复位设备寄存器

  • rockchip,camera-module-facing:指定前摄还是后摄

  • rockchip,camera-module-name,rockchip,camera-module-lens-name这两个参数决定使用哪一个IQ文件

  • remote-endpoint: mipi dphy 端的 port 名

  • data-lanes: mipi lane 数,1lane 为 <1>, 4lane 为 <1 2 3 4>

CSI设备树配置:

&csi2_dphy_hw {
    
    
	status = "okay";
};

&csi2_dphy0 {
    
    
	status = "okay";

	ports {
    
    
		#address-cells = <1>;
		#size-cells = <0>;
		port@0 {
    
    
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi_in_ucam0: endpoint@1 {
    
    
				reg = <1>;
				remote-endpoint = <&ov5648_out>;
				data-lanes = <1 2>;
			};
		};
		port@1 {
    
    
			reg = <1>;
			#address-cells = <1>;
			#size-cells = <0>;

			csidphy_out: endpoint@0 {
    
    
				reg = <0>;
				remote-endpoint = <&isp0_in>;
			};
		};
	};
};

isp图像控制器设备树配置:

&rkisp {
    
    
	status = "okay";
};

&rkisp_mmu {
    
    
	status = "okay";
};

&rkisp_vir0 {
    
    
	status = "okay";

	port {
    
    
		#address-cells = <1>;
		#size-cells = <0>;

		isp0_in: endpoint@0 {
    
    
			reg = <0>;
			remote-endpoint = <&csidphy_out>;
		};
	};
};

添加编译:

扫描二维码关注公众号,回复: 14815908 查看本文章
CONFIG_VIDEO_OV5648=y

如果设备树配置没问题
代码相关目录:

Linux Kernel-4.19
|-- arch/arm/boot/dts #DTS配置文件
|-- drivers/phy/rockchip
|-- phy-rockchip-mipi-rx.c #mipi dphy驱动
|-- phy-rockchip-csi2-dphy-common.h
|-- phy-rockchip-csi2-dphy-hw.c
|-- phy-rockchip-csi2-dphy.c
|-- drivers/media
|-- platform/rockchip/cif #RKCIF驱动
|-- platform/rockchip/isp #RKISP驱动
|-- dev #包含 probe、异步注册、clock、pipeline、 iommu及media/v4l2 framework
|-- capture #包含 mp/sp/rawwr的配置及 vb2,帧中断处理
|-- dmarx #包含 rawrd的配置及 vb2,帧中断处理
|-- isp_params #3A相关参数设置
|-- isp_stats #3A相关统计
|-- isp_mipi_luma #mipi数据亮度统计
|-- regs #寄存器相关的读写操作
|-- rkisp #isp subdev和entity注册
|-- csi #csi subdev和mipi配置
|-- bridge #bridge subdev,isp和ispp交互桥梁
|-- platform/rockchip/ispp #rkispp驱动
|-- dev #包含 probe、异步注册、clock、pipeline、 iommu及media/v4l2 framework
|-- stream #包含 4路video输出的配置及 vb2,帧中断处理
|-- rkispp #ispp subdev和entity注册
|-- params #TNR/NR/SHP/FEC/ORB参数设置
|-- stats #ORB统计信息
|-- i2

整体的框架图:
在这里插入图片描述
各个节点的说明:
在这里插入图片描述
在这里插入图片描述

使用v4l2-ctl抓取camera数据帧

v4l2-ctl --verbose -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat='NV12' --stream-mmap=4 --set-selection=target=crop,flags=0,top=0,left=0,width=1920,height=1080 --stream-to=/data/out.yuv

把out.yuv文件拷贝出来通过ubuntu去查看:

ffplay -f rawvideo -video_size 1920x1080 -pix_fmt nv12 out.yuv

IQ文件

raw摄像头支持的iq文件路径external/camera_engine_rkaiq/iqfiles/isp21, 与以前不一样的地方是iq文件不再采用.xml的方式,而是采用.json的方式。虽有提供xml转json的工具, 但isp20的xml配置转换后也不适用isp21。

若使用raw摄像头sensor,请留意isp21目录所支持的iq文件

Android系统使用camera应用
Android系统使用camera的apk打开摄像头需要配置camera3_profiles*.xml,具体可参考Android SDK hardware/rockchip/camera/etc/camera目录下的文件

默认打开前置、后置摄像头:
    packages/apps/Camera2/res/values/strings.xml里设置pref_camera_id_default为1即默认打开后摄,为0即默认打开前置

在hardware/rockchip/camera/etc/camera/camera3_profiles_rk356x.xml中

     </Profiles>
     <Profiles cameraId="0" name="ov5648" moduleId="m00">
....
 <sensor.orientation value="90"/>         摄像头旋转的角度

只有1个摄像头所以moduleId为0 ,sensor.orientation是旋转的角度值

未完,后面持续完善

猜你喜欢

转载自blog.csdn.net/weixin_68294039/article/details/127295889
今日推荐