次のデバイスが私のクリエーターCI20のドライバーに設定されていない理由を理解しようとしています。参考までに、私はLinuxカーネルv4.13.0を使用して、ローカルでコンパイルを行っています。
make ARCH=mips ci20_defconfig
make -j8 ARCH=mips CROSS_COMPILE=mipsel-linux-gnu- uImage
実行中のシステムから私は見ることができます:
ci20@ci20:~# find /sys | grep rng
/sys/firmware/devicetree/base/jz4780-cgu@10000000/rng@d8
/sys/firmware/devicetree/base/jz4780-cgu@10000000/rng@d8/compatible
/sys/firmware/devicetree/base/jz4780-cgu@10000000/rng@d8/name
/sys/bus/platform/drivers/jz4780-rng
/sys/bus/platform/drivers/jz4780-rng/bind
/sys/bus/platform/drivers/jz4780-rng/unbind
/sys/bus/platform/drivers/jz4780-rng/uevent
したがって、デバイスは実行時にカーネルに表示されますが、欠けている部分がドライバーがバインドされない理由です。私はこのようなものを期待していました:
/sys/bus/platform/drivers/jz4780-rng/100000d8.rng
私は実行中のシステムをデバッグする方法を説明する他のいくつかの投稿を見つけました、例えば:
- /programming/28406776/driver-binding-using-device-tree-without-compatible-string-in-the-driver
- /programming/35580862/device-tree-mismatch-probe-never-called
- /programming/41446737/platform-device-driver-autoloading-mechanism
- 実行中のカーネルの/ sysを使用してデバイスツリーの情報を取得することは可能ですか?
これらの投稿の情報は正確ですが、私にはあまり役に立ちません。私はカーネルをローカルでビルドしているので(ドライバーprintk
のプローブ機能に追加しましたjz4780-rng
)、代わりに私の質問は次のとおりです。
- カーネルが
jz4780-rng
ドライバーのプローブ関数の呼び出しの失敗に関する正確な情報を出力するように、コンパイル時にどのオプションをオンにする必要がありますか? - 特に、テスト済みのバス/ドライバーの完全なリストをどのように印刷し
driver_probe_device
ますか?
printk
これをデバッグするためにコードのどこにでも追加できます。問題はむしろです:どの関数がデバイスツリーをトラバースし、probe / init関数を呼び出していますか?
参考のために:
$ dtc -I fs -O dts /sys/firmware/devicetree/base | grep -A 1 rng
rng@d8 {
compatible = "ingenic,jz4780-rng";
};
互換性のある文字列は次のように宣言されます。
cgu: jz4780-cgu@10000000 {
compatible = "ingenic,jz4780-cgu", "syscon";
reg = <0x10000000 0x100>;
clocks = <&ext>, <&rtc>;
clock-names = "ext", "rtc";
#clock-cells = <1>;
rng: rng@d8 {
compatible = "ingenic,jz4780-rng";
};
};
そしてドライバーとして:
static const struct of_device_id jz4780_rng_dt_match[] = {
{
.compatible = "ingenic,jz4780-rng",
},
{ },
};
MODULE_DEVICE_TABLE(of, jz4780_rng_dt_match);
static struct platform_driver jz4780_rng_driver = {
.driver = {
.name = "jz4780-rng",
.of_match_table = jz4780_rng_dt_match,
},
.probe = jz4780_rng_probe,
.remove = jz4780_rng_remove,
};
module_platform_driver(jz4780_rng_driver);
Update1:
でカーネルをビルドするとCONFIG_DEBUG_DRIVER=y
、次のようになります。
# grep driver_probe_device syslog
Sep 6 10:08:07 ci20 kernel: [ 0.098280] bus: 'platform': driver_probe_device: matched device 10031000.serial with driver ingenic-uart
Sep 6 10:08:07 ci20 kernel: [ 0.098742] bus: 'platform': driver_probe_device: matched device 10033000.serial with driver ingenic-uart
Sep 6 10:08:07 ci20 kernel: [ 0.099209] bus: 'platform': driver_probe_device: matched device 10034000.serial with driver ingenic-uart
Sep 6 10:08:07 ci20 kernel: [ 0.106945] bus: 'platform': driver_probe_device: matched device 1b000000.nand-controller with driver jz4780-nand
Sep 6 10:08:07 ci20 kernel: [ 0.107282] bus: 'platform': driver_probe_device: matched device 134d0000.bch with driver jz4780-bch
Sep 6 10:08:07 ci20 kernel: [ 0.107470] bus: 'platform': driver_probe_device: matched device 16000000.dm9000 with driver dm9000
Sep 6 10:08:07 ci20 kernel: [ 0.165618] bus: 'platform': driver_probe_device: matched device 10003000.rtc with driver jz4740-rtc
Sep 6 10:08:07 ci20 kernel: [ 0.166177] bus: 'platform': driver_probe_device: matched device 10002000.jz4780-watchdog with driver jz4740-wdt
Sep 6 10:08:07 ci20 kernel: [ 0.170930] bus: 'platform': driver_probe_device: matched device 1b000000.nand-controller with driver jz4780-nand
だけ:
# grep rng syslog
Sep 6 10:08:07 ci20 kernel: [ 0.166842] bus: 'platform': add driver jz4780-rng
Sep 6 10:08:42 ci20 kernel: [ 54.584451] random: crng init done
補足として、rng
トップレベルのnode:cgu
はここでは参照されていませんが、jz4780-cgu
ドライバーがあります。
Update2:
rng
ノード宣言をトップレベルcgu
ノードの外に移動すると、少なくともいくつかのバインディングが最後に発生するのを確認できます。
# grep rng /var/log/syslog
Sep 6 10:30:57 ci20 kernel: [ 0.167017] bus: 'platform': add driver jz4780-rng
Sep 6 10:30:57 ci20 kernel: [ 0.167033] bus: 'platform': driver_probe_device: matched device 10000000.rng with driver jz4780-rng
Sep 6 10:30:57 ci20 kernel: [ 0.167038] bus: 'platform': really_probe: probing driver jz4780-rng with device 10000000.rng
Sep 6 10:30:57 ci20 kernel: [ 0.167050] jz4780-rng 10000000.rng: no pinctrl handle
Sep 6 10:30:57 ci20 kernel: [ 0.167066] devices_kset: Moving 10000000.rng to end of list
Sep 6 10:30:57 ci20 kernel: [ 0.172774] jz4780-rng: probe of 10000000.rng failed with error -22
Sep 6 10:31:32 ci20 kernel: [ 54.802794] random: crng init done
使用:
rng: rng@100000d8 {
compatible = "ingenic,jz4780-rng";
};
私も確認できます:
# find /sys/ | grep rng
/sys/devices/platform/10000000.rng
/sys/devices/platform/10000000.rng/subsystem
/sys/devices/platform/10000000.rng/driver_override
/sys/devices/platform/10000000.rng/modalias
/sys/devices/platform/10000000.rng/uevent
/sys/devices/platform/10000000.rng/of_node
/sys/firmware/devicetree/base/rng@100000d8
/sys/firmware/devicetree/base/rng@100000d8/compatible
/sys/firmware/devicetree/base/rng@100000d8/status
/sys/firmware/devicetree/base/rng@100000d8/reg
/sys/firmware/devicetree/base/rng@100000d8/name
/sys/bus/platform/devices/10000000.rng
/sys/bus/platform/drivers/jz4780-rng
/sys/bus/platform/drivers/jz4780-rng/bind
/sys/bus/platform/drivers/jz4780-rng/unbind
/sys/bus/platform/drivers/jz4780-rng/uevent