关于CA55与CM33总线访问冲突的问题


如果遇到明明代码完全没问题,但是出现运行一会儿就会卡死的现象,可以聚焦这篇博客。微机原理指出,IO一般是通过控制器挂载在总线上的,而总线一般是只能由单个设备进行访问。所以当我们的CA55和CM33同时访问一个IO的时候就会产生总线冲突导致CA55内核崩溃或者CM33崩溃。这常见于A55和M33访问同一个i2c接口或者串口接口。若是要CM33获得这个IO的独有权,可以通过修改设备树的方式禁用CA55对这个IO的控制。

拿之前提到的linux使用i2c举例,如果我想要将这个接口划分给CM33,可以前往文件:linux/arch/arm64/boot/dts/myzr/myzr-rzv2h-ek320.dts

跳转至457行左右,修改i2c2的节点变为如下:

&i2c2 {
	pinctrl-0 = <&i2c2_pins>;
	pinctrl-names = "default";
	clock-frequency = <400000>;
	status = "disabled";//禁用

	pca6408_2: pca6408_2@20 {
		compatible = "ti,pca6408";
		gpio-controller;
		#gpio-cells = <2>;
		reg = <0x20>;
		status = "disabled";//禁用
	};
	imx462_2: camera_2@1f {
		compatible = "imx462";
		reg = <0x1f>;
		clock-names = "xclk";
		clocks = <&clk_ext_camera>;
		clock-frequency = <24000000>;
		camera-mipi-clk = <800>; //Not used , but for future purpose
		camera-mipi-lanes = <4>; //Not used , but for future purpose
		vdddo-supply = <&imx462_vdddo_1v8>;
		vdda-supply = <&imx462_vdda_2v8>;
		vddd-supply = <&imx462_vddd_1v5>;
		/* Set dummy enable gpio */
		/* pwdn-gpios = <&pinctrl RZG2L_GPIO(6, 1) GPIO_ACTIVE_HIGH>; */
		/* reset-gpios = <&pinctrl RZG2L_GPIO(9, 2) GPIO_ACTIVE_HIGH>; */
		pwdn-gpios = <&pca6408_2 0 GPIO_ACTIVE_HIGH>;
		reset-gpios = <&pca6408_2 1 GPIO_ACTIVE_HIGH>;
		status = "disabled";//禁用
		port {
			imx462_to_csi22: endpoint {
				clock-lanes = <0>;
				data-lanes = <1 2 3 4>;
				remote-endpoint = <&csi22_in>;
			};
		};
	};
};

回到linux目录,重新编译设备树,然后重新烧录即可:

unset LD_LIBRARY_PATH LDFLAGS CFLAGS CXXFLAGS
source /opt/poky/3.1.31/environment-setup-aarch64-poky-linux
make ARCH=arm64 CROSS_COMPILE=aarch64-poky-linux- -j16 dtbs

,

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注