私のデバイスツリーの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ドライバのすべてのプリントが有効になっていることを確認しました。
役に立ったことを願っています!
頑張って、
フィル