현재 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";
};
};
};
};