platform device
この質問は、内蔵ドライバが起動時にどのように初期化されるかを理解しようとする試みからのものです。
私はSoC(ARM + FPGA)で組み込みLinuxディストリビューション(Yocto)を使用しています。デバイスドライバは、platform device
プラットフォームデバイスとして説明されているデバイスツリーに見られるIP用に作成されます。 「互換性」プロパティはCドライバと一致し、これまでは非常に良いです。
プラットフォームデバイスのカーネルドキュメントを参照してください。[1]、
一般に、「互換性」属性を持つすべてのノードは一種のデバイスを表すと仮定します。2番目に、ツリールートのすべてのノードはプロセッサバスに直接接続したり、プロセッサバスに接続できない他のデバイスと見なすことができます。システムは他の方法で説明できません。各ノードに対して、Linuxはplatform_deviceを割り当てて登録します。これは順番にplatform_driverにバインドできます。
だけでなく
2.4 デバイス数
マザーボードが認識され、初期設定データが解析されると、カーネルの初期化が正常に進行する可能性があります。 [...]これは、ARMのmachine_desc .init_early()、.init_irq()、および.init_machine()フックなどのシステム固有の設定フックが呼び出される時間でもあります。
[...]
DT コンテキストで最も興味深いフックは .init_machine() です。これは主にプラットフォームのデータでLinuxデバイスモデルを埋めることを担当します。
最終的に(Tegraボードの文書例に従う)
.init_machine()時に、TegraボードサポートコードはこのDTを確認し、platform_devicesを生成するノードを決定する必要があります。
もちろん、調査arch/arm
[2init_machine
]デバイスツリーを「表示」する機能があります。ただし、arm64アーキテクチャにはこの機能はありません。machine_desc
構造腕の弓にのみ適用されます。。
ソースコードを調べると、デバイスツリーでsetup_machine_fdt [で発生するわかりやすい操作のいくつかを見つけることができました。4early_dt_scan
] これをダンと呼ぶ。デバイスを満たしていないようです。:
/* Retrieve various information from the /chosen node */
rc = of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);
/* Initialize {size,address}-cells info */
of_scan_flat_dt(early_init_dt_scan_root, NULL);
/* Setup memory, calling early_init_dt_add_memory_arch */
of_scan_flat_dt(early_init_dt_scan_memory, NULL);
ここでの問題は、ブートストラッププロセスを続行すると、最終的にdo_basic_setup
呼び出すことです。driver init
bus_init
platform_bus_init
of_core_init
「devicetree」と呼ばれるksetを生成する最後の項目の希望があります。しかし、ここでツリーが実際に解析されるかどうかはわかりません。
その後initcalls
呼び出されます。これはドライバの初期化が起こることを意味しますが、ここに関連するDT解析はどうですか? 「互換性」プロパティは実際にどこで使用されますか?もう一度ドキュメントから:
秘密は、カーネルがツリーのルートから始まり、「互換性のある」属性を持つノードを見つけることです。まず、一般に「互換性」属性を持つすべてのノードがデバイスの一種を表すと仮定し、第二に、ツリールートのすべてのノードがプロセッサバスに直接接続されるか、または他のデバイスであると仮定できます。他の方法では説明できないシステムデバイスです。各ノードについてLinuxはplatform_deviceを割り当てて登録します。これはplatform_driveにバインドできます。
「プラットフォームドライバにバインド」部分は、ドライバコードで定義されているinitcallによって実行されます。私が理解していないのは、「プラットフォームデバイスの割り当てと登録」です。
[2]ロボットアームの初期化