내 장치 트리의 spi-gpio 버스에서 MCP2515 CAN 컨트롤러가 작동하도록 노력했지만 MCP251x 드라이버의 프로브 기능이 실제로 호출되지 않는 것 같습니다. 하지만 이상한 점은 어딘가에서 일부 프로브 함수가 반환될 때 호출된다는 것입니다 -EPROBE_DEFER
.
/drivers/base/dd.c
나는 실제로 어디에서 돌아왔는지 알아내기 위해 여러 개의 dev_dbg 인쇄 호출을 수정했습니다 .
https://github.com/torvalds/linux/blob/v4.14/drivers/base/dd.c
라인 416은 드라이버 프로브가 연기되는 곳입니다.
else if (drv->probe) {
ret = drv->probe(dev);
if (ret)
goto probe_failed;
}
drv
디버그 문을 추가하면 변수 이름이 MCP251x이고 드라이버와 일치하는 것을 볼 수 있습니다 .
dev_dbg(dev, "%s line %d ret: %d\n", drv->name, __LINE__,ret);
그래서 MCP251x 드라이버의 mcp251x_can_probe
기능에 디버깅 문을 추가했습니다.https://github.com/torvalds/linux/blob/v4.14/drivers/net/can/spi/mcp251x.c
MCP251x 프로빙 기능에 대한 디버그 출력은 전혀 볼 수 없습니다. 왜? 이 프로브 함수가 호출되지 않는 이유를 이해할 수 없지만 무언가가 을 반환하려고 합니다 -EPROBE_DEFER
.
내가 모르는 중간 spi 프로브 기능이 호출되는지는 모르겠지만 MCP251x의 프로브에는 도달하지 않습니다.
만약을 대비해 내 장치 트리의 관련 조각은 다음과 같습니다.
spi1{
compatible = "spi-gpio";
status="okay";
#address-cells = <0x1>;
ranges;
gpio-sck = <&gpio0 4 0>;
gpio-miso = <&gpio0 5 0>;
gpio-mosi = <&gpio0 19 0>;
cs-gpios = <&gpio0 18 1>;
num-chipselects = <1>;
can0: mcp2515@0 {
compatible = "microchip,mcp2515";
reg = <0>;
status = "okay";
clocks = <&mcp2515_clk>;
interrupt-parent = <&gpio0>;
interrupts = <11 0x2>; //falling edge
spi-max-frequency = <10000000>;
mcp2515_clk: oscillator {
#clock-cells = <0>;
compatible = "fixed-clock";
clock-frequency = <8000000>; //8MHz
};
};
};
답변1
저는 Linux의 Xilinx Zynq에서 MCP2515를 실행하려고 노력해 왔습니다.
똑같은 문제를 겪으면서 귀하의 게시물을 찾았습니다.
나는 프로브가 실패한 위치를 찾기 위해 mpc251x 드라이버에 printk를 흩어 놓고 당신과 똑같은 경로를 갔지만 호출되지 않았습니다.
대신 드라이버 spi.c의 프로브 기능이 dd.c에서 호출됩니다.
지연 오류는 다음에서 반환됩니다.
https://github.com/torvalds/linux/blob/master/drivers/spi/spi.c#L397
내 경우에는 내가 정의한 인터럽트를 찾을 수 없기 때문에 발생했습니다.
나에게는 인터럽트 컨트롤러 드라이버가 로드되지 않아 인터럽트를 찾을 수 없기 때문이었습니다.
인터럽트 컨트롤러 드라이버를 구축하고 mcp251x 드라이버의 모든 프린트가 활성화되어 있는지 확인했습니다.
도움이 되었기를 바랍니다!
행운을 빌어요,
필