如何在设备树中实现i2c设备?

如何在设备树中实现i2c设备?

我目前尝试通过将 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";
                        };
                };
        };
};

相关内容