OV5645摄像头驱动没有/dev/videoX设备

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

OV5645摄像头驱动没有/dev/videoX设备

跳至解决方案
678 次查看
Versenkt
Contributor II

Hi

我使用的是imx8mp平台。最初,我在设备树上加入了如下节点:

 

&i2c2 {
	clock-frequency = <400000>;
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_i2c2>;
	status = "okay";

	ov5645_0: ov5645_mipi@3c {
		compatible = "ovti,ov5645";
		reg = <0x3c>;
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_csi0_pwn>, <&pinctrl_csi0_rst>;
		clocks = <&clk IMX8MP_CLK_IPP_DO_CLKO2>;
		clock-names = "xclk";
		assigned-clocks = <&clk IMX8MP_CLK_IPP_DO_CLKO2>;
		assigned-clock-parents = <&clk IMX8MP_CLK_24M>;
		assigned-clock-rates = <24000000>;
		csi_id = <1>;
		enable-gpios = <&gpio3 20 GPIO_ACTIVE_HIGH>;
		reset-gpios = <&gpio3 19 GPIO_ACTIVE_LOW>;
		clock-frequency = <24000000>;
		mclk = <24000000>;
		mclk_source = <0>;
		mipi_csi;
		status = "okay";

		port {
			ov5645_mipi_1_ep: endpoint {
				remote-endpoint = <&mipi_csi1_ep>;
				data-lanes = <1 2>;
				clock-lanes = <0>;
				// link-frequencies = /bits/ 64 <336000000>;
			};
		};
	};
};

&mipi_csi_1 {
	#address-cells = <1>;
	#size-cells = <0>;
	status = "okay";

	port@1 {
		reg = <1>;
		mipi_csi1_ep: endpoint {
			remote-endpoint = <&ov5645_mipi_1_ep>;
			data-lanes = <2>;
			csis-hs-settle = <13>;
			csis-clk-settle = <2>;
			csis-wclk;
		};
	};
};

 

 

系统启动后,没有在/dev/下发现任何mediaX,v4l-subdevX和新的videoX设备(除了video0和video1分别是encoder和decoder)。

查看内核日志时,发现imx8-img-md: subdev_notifier_complete error exit错误。

根据错误信息,找到了imx8-media-dev.c,在其中加入了一些额外打印的调试信息,发现在

mxc_md_create_link函数中,会调用传感器实体的link_setup函数。而最新的imx bsp中,ov5645.c内并没有定义类似于static const struct media_entity_operations ov5645_subdev_entity_ops和static int ov5645_link_setup ov5645_link_setup(...)这样的结构体和函数。
参考了ov5640.c和其它摄像头的驱动代码,发现link_setup函数几乎只是简单的返回0值,没有什么实际动作,于是我在mxc_md_create_link中,删除了这一步骤(我不确定这样做是否有其它负面影响,但目前来看可以向下推进)。
Versenkt_0-1709096961048.png

 

目前遇到的问题:

1. 系统启动时,似乎没有自动执行creat link相关的动作,内核日志中,ov5645驱动探测到i2c上的摄像头后,没有出现mx8-img-md打印的任何日志,/dev下也没有任何摄像头相关的设备出现。  我注意到,内核日志中,系统启动时ov5645被探测到的时间出现在imx8_media_dev之后,这是否和问题1有关?完整的日志在附件中。

Versenkt_4-1709098398004.png

2. 我可以通过modprobe手动重新加载imx8-media-dev模块,此时出现了预期中的日志信息,同时/dev下出现了media0, v4l-subdev0和v4l-subdev1,但依旧没有对应的video设备。

Versenkt_1-1709097577946.png

日志中的+++++表示这是我加入的debug信息。

Versenkt_2-1709097777168.png

可能因为我本次构建镜像时,使用了imx-image-core导致缺少部分组件,decoder和encoder对应的videoX信息没能正常被读取?在imx-image-multimedia镜像中是正常的。

 

 3. 请问在imx8mp平台上,是哪段驱动代码在产生摄像头的/dev/videoX设备节点?根据一些搜索到的资料,似乎是在调用video_register_device函数时产生,但有很多处代码都在调用这个函数

Versenkt_5-1709098632595.png

 

0 项奖励
回复
1 解答
651 次查看
Versenkt
Contributor II
看来是我犯了个低级错误。设备树中,csi对应的isi或isp默认是关闭状态的,需要使能,然后linux内就可正常出现video设备了。

 

&isi_1 {
    status = "okay";

    cap_device {
        status = "okay";
    };
};

 

在原帖中查看解决方案

0 项奖励
回复
1 回复
652 次查看
Versenkt
Contributor II
看来是我犯了个低级错误。设备树中,csi对应的isi或isp默认是关闭状态的,需要使能,然后linux内就可正常出现video设备了。

 

&isi_1 {
    status = "okay";

    cap_device {
        status = "okay";
    };
};

 

0 项奖励
回复