如果遇到明明代码完全没问题,但是出现运行一会儿就会卡死的现象,可以聚焦这篇博客。微机原理指出,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
