デバイスツリーでi2cデバイスを実装する方法は?

デバイスツリーでi2cデバイスを実装する方法は?

現在、Linuxデバイスツリーにmma8451Q加速度計を追加して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";
                        };
                };
        };
};

他のdtsiファイルのi2cノードなので、target = <&i2c0>を選択してください。他の理由はありません。間違っている可能性があります。

ベストアンサー1

解決策は、加速度計が接続されている正しいi2cバスをターゲットにすることです。結局i2c0ではなくi2c2になりました。これは私の問題を解決しました。正しい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";
                        };
                };
        };
};

おすすめ記事