platform-device-model について
Linux ドライバー開発者向けに、プラットフォームデバイスモデルを解説するスキルです。デバイスツリーの記述とドライバーコードをつなぐ、ライフサイクル、リソース管理、sysfs、プローブ遅延を扱います。
主な機能
- 01プラットフォームデバイスとドライバーのライフサイクル
- 02probe と remove の処理
- 03devm ヘルパーによるリソース取得
- 04DT と ACPI のデバイスプロパティ
- 05sysfs 属性とプローブ遅延
- 06sysfs と udevadm によるデバッグ
活用シーン
- 01platform_driver の実装やデバッグ
- 02ボードファイルのドライバーを DT platform_driver に変換
- 03sysfs によるドライバー状態の公開
- 04プローブ遅延やリソース競合の調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill platform-device-modelインストール後、Claude Code で/platform-device-modelを入力して読み込まれたか確認します。
詳細
プラットフォームデバイスモデル
目的
プラットフォームバス(および類似のバス)における Linux ドライバモデルについて説明します。対象は struct device、device_driver、probe/remove、リソースの取得、sysfs、遅延プローブです。デバイスツリーとドライバコードをつなぐ仕組みです。
使用する場面
platform_driverのライフサイクルを実装またはデバッグするとき- sysfs を介してドライバの状態を公開するとき
- uevent/
udevによるデバイスノードの作成を理解するとき skills/kernel-dev/writing-char-driversを使う前
ワークフロー
1. オブジェクト階層
bus_type (platform, amba, pci, i2c, spi)
├── struct device — hardware instance
└── struct device_driver — driver logic
└── probe(dev) / remove(dev)
プラットフォームデバイスは、多くの場合 DT(of_platform)またはレガシーなボードファイルから生成されます。
2. プラットフォームドライバのひな形
static int my_probe(struct platform_device *pdev)
{
struct resource *res;
void __iomem *base;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
base = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(base))
return PTR_ERR(base);
platform_set_drvdata(pdev, priv);
return 0;
}
static void my_remove(struct platform_device *pdev)
{
/* devm_* auto-cleanup on remove */
}
static struct platform_driver my_pdrv = {
.probe = my_probe,
.remove = my_remove,
.driver = {
.name = "my-dev",
.of_match_table = my_of_match,
},
};
module_platform_driver(my_pdrv);
自動的に後処理を行う devm_* ヘルパーを優先して使ってください。
3. デバイスプロパティ(DT/ACPI)
u32 speed;
device_property_read_u32(&pdev->dev, "clock-speed", &speed);
bool flag = device_property_present(&pdev->dev, "feature-x");
4. sysfs(ドライバの可視性)
static ssize_t status_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
return sysfs_emit(buf, "ok\n");
}
static DEVICE_ATTR_RO(status);
/* in probe */
device_create_file(&pdev->dev, &dev_attr_status);
5. 遅延プローブ
クロック、レギュレーター、またはバスの準備ができていない場合は -EPROBE_DEFER を返します。コアが後で再試行します。
6. デバッグ
ls /sys/bus/platform/devices/
ls /sys/bus/platform/drivers/
cat /sys/kernel/debug/devices_deferred # if debugfs enabled
udevadm monitor
7. エージェントの使用
/platform-device-model Convert legacy board file driver to DT platform_driver with devm_ioremap
よくある問題
| 症状 | 原因 | 対処方法 |
|---|---|---|
プローブ時に -EBUSY が発生する | リソースが二重に確保されている | status/重複したノードを確認する |
/dev ノードがない | キャラクタデバイスが登録されていない | writing-char-drivers を参照する |
| 遅延がいつまでも解消されない | サプライヤードライバがない | DT の依存関係を修正する |
| remove 時にクラッシュする | 手動解放と devm の不整合 | 一貫して devm を使う |
| 名前が一致しない | .name と compatible の不一致 | OF では of_match_table を使う |
関連スキル
skills/kernel-dev/device-tree— ハードウェアの記述skills/kernel/device-drivers— IRQ、DMA、regmap の詳細skills/kernel-dev/writing-char-drivers— ユーザー空間インターフェースskills/kernel-dev/bus-drivers-i2c-spi— その他のバスタイプskills/low-level-programming/linux-kernel-modules— モジュールの読み込み
コメント
Markdown 対応