我目前尝试通过将 mma8451Q 加速度计添加到 Linux 设备树来实现 mma8452 驱动程序。
目前,我正在采取创建设备树覆盖文件 (dtbo) 的方法,其中包含描述加速度计的设备树的添加内容。它在启动时正确加载并正确拉入指定的 mma8452 驱动程序。然而,驱动程序在启动时在我的 dmesg 日志中返回以下错误:
[ 23.2352] mma8452: probe of 0-001c failed with error -121
有谁知道这意味着什么或如何解决它?也许覆盖不是执行此操作的正确方法,我应该创建 dtsi 文件或修改源 dts 文件?我可以使用 SA0 地址 0x1C 处的 i2c-tools 包从控制台访问加速度计。
NXP 提供的驱动程序可以在这里找到mma8452.c驱动程序
我的 dtbo 文件如下所示:
/*
* MIRA custom cape device tree overlay
* Supports MMA8451Q Accelerometer
*/
/dts-v1/;
/plugin/;
#include <dt-bindings/interrupt-controller/irq.h>
/ {
/*
* Helper to show loaded overlays under: /proc/device-tree/chosen/overlays/
*/
fragment@0 {
target-path="/";
__overlay__ {
chosen {
overlays {
MIRA_EXTENSIONS = __TIMESTAMP__;
};
};
};
};
fragment@1 {
target = <&i2c0>;
__overlay__ {
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
accel@1C {
compatible = "fsl,mma8451";
reg = <0x1C>;
interrupt-parent = <&gpio1>;
interrupts = <16 IRQ_TYPE_EDGE_RISING>;
interrupt-names = "INT1";
};
};
};
};
选择 target = <&i2c0> 只是因为它是另一个 dtsi 文件中的 i2c 节点。没有其他原因。可能是错的。
答案1
解决方案是针对加速计连接到的正确 i2c 总线。最终是 i2c2,而不是 i2c0。这解决了我的问题。正确的dtbo文件如下所示:
/*
* MIRA custom cape device tree overlay
* Supports MMA8451Q Accelerometer
*/
/dts-v1/;
/plugin/;
#include <dt-bindings/interrupt-controller/irq.h>
/ {
/*
* Helper to show loaded overlays under: /proc/device-tree/chosen/overlays/
*/
fragment@0 {
target-path="/";
__overlay__ {
chosen {
overlays {
MIRA_EXTENSIONS = __TIMESTAMP__;
};
};
};
};
fragment@1 {
target = <&i2c2>;
__overlay__ {
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
accel@1C {
compatible = "fsl,mma8451";
reg = <0x1C>;
interrupt-parent = <&gpio1>;
interrupts = <16 IRQ_TYPE_EDGE_RISING>;
interrupt-names = "INT1";
};
};
};
};