장치 트리에서 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";
                        };
                };
        };
};

관련 정보