mcpField
P
platform-device-model

platform-device-model

github.com/mohitmishra786開発269298 回インストール18 週間前に更新
リポジトリ

platform-device-model について

Linux ドライバー開発者向けに、プラットフォームデバイスモデルを解説するスキルです。デバイスツリーの記述とドライバーコードをつなぐ、ライフサイクル、リソース管理、sysfs、プローブ遅延を扱います。

主な機能

  1. 01プラットフォームデバイスとドライバーのライフサイクル
  2. 02probe と remove の処理
  3. 03devm ヘルパーによるリソース取得
  4. 04DT と ACPI のデバイスプロパティ
  5. 05sysfs 属性とプローブ遅延
  6. 06sysfs と udevadm によるデバッグ

活用シーン

  1. 01platform_driver の実装やデバッグ
  2. 02ボードファイルのドライバーを DT platform_driver に変換
  3. 03sysfs によるドライバー状態の公開
  4. 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 — モジュールの読み込み

コメント