mcpField
B
bus-drivers-i2c-spi

bus-drivers-i2c-spi

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

bus-drivers-i2c-spi について

bus-drivers-i2c-spiは、LinuxのI2CおよびSPIクライアントドライバー開発向けのエージェントスキルです。バス固有のprobe、転送、regmap、デバイスツリーの子ノード、通信エラーの調査を扱います。

主な機能

  1. 01I2Cクライアントドライバーとprobeパターン
  2. 02SPIドライバーと同期転送
  3. 03regmapによるレジスターアクセス
  4. 04デバイスツリーのバス子ノード設定
  5. 05I2CとSPIのトラブルシューティング

活用シーン

  1. 01I2CセンサーやPMICのドライバー作成
  2. 02ベアメタルのSPIレジスターアクセスをカーネルへ移行
  3. 03regmapによる複数バイトレジスター処理
  4. 04NACKやACK欠落の調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill bus-drivers-i2c-spi

インストール後、Claude Code で/bus-drivers-i2c-spiを入力して読み込まれたか確認します。

詳細

バスドライバー(I2C と SPI)

目的

Linux の I2C および SPI のクライアントドライバーについて、バス登録、i2c_transfer / spi_sync、regmap による抽象化、バス上の子ノードにおける DT の compatible、probe のパターンをエージェントに案内します。skills/kernel/device-drivers のプラットフォーム MMIO ドライバーを補完します。

使用する場面

  • I2C/SPI バス上のセンサーまたは PMIC
  • ベアメタルの SPI レジスター読み取りをカーネルドライバーに変換する場合
  • 複数バイトのレジスターアクセスに regmap を使用する場合
  • -EREMOTEIO または ACK がない問題のデバッグ

ワークフロー

1. I2C クライアントドライバー
#include <linux/i2c.h>
#include <linux/mod_devicetable.h>

static int my_probe(struct i2c_client *client)
{
    struct regmap *map;

    map = devm_regmap_init_i2c(client, &my_regmap_config);
    if (IS_ERR(map))
        return PTR_ERR(map);

    dev_info(&client->dev, "probed at 0x%02x\n", client->addr);
    return 0;
}

static const struct of_device_id my_of_id[] = {
    { .compatible = "vendor,sensor" },
    { }
};
MODULE_DEVICE_TABLE(of, my_of_id);

static const struct i2c_device_id my_id[] = {
    { "mysensor", 0 },
    { }
};
MODULE_DEVICE_TABLE(i2c, my_id);

static struct i2c_driver my_driver = {
    .probe    = my_probe,
    .remove   = my_remove,
    .driver   = { .name = "mysensor", .of_match_table = my_of_id },
    .id_table = my_id,
};
module_i2c_driver(my_driver);

DT 子ノード:

i2c1 {
    sensor@48 {
        compatible = "vendor,sensor";
        reg = <0x48>;
    };
};
2. 生の I2C 転送
u8 reg = 0x0F, val;
struct i2c_msg msgs[] = {
    { .addr = client->addr, .flags = 0,       .len = 1, .buf = &reg },
    { .addr = client->addr, .flags = I2C_M_RD, .len = 1, .buf = &val },
};
ret = i2c_transfer(client->adapter, msgs, 2);
3. SPI ドライバー
static int spi_probe(struct spi_device *spi)
{
    spi->mode = SPI_MODE_0;
    spi->bits_per_word = 8;
    spi_setup(spi);

    struct spi_transfer t = {
        .tx_buf = tx,
        .rx_buf = rx,
        .len    = len,
    };
    struct spi_message m;
    spi_message_init(&m);
    spi_message_add_tail(&t, &m);
    return spi_sync(spi, &m);
}

static struct spi_driver spi_drv = {
    .probe  = spi_probe,
    .driver = { .name = "my-spi", .of_match_table = my_of_match },
};
module_spi_driver(spi_drv);
4. regmap(レジスターマップには推奨)
static const struct regmap_config my_regmap_config = {
    .reg_bits   = 8,
    .val_bits   = 8,
    .max_register = 0x7F,
};

regmap_read(map, REG_STATUS, &val);
regmap_write(map, REG_CTRL, CTRL_ENABLE);
regmap_update_bits(map, REG_CTRL, MASK, ENABLE);
5. デバッグ
i2cdetect -y 1
i2cdump -y 1 0x48
cat /sys/bus/i2c/devices/i2c-1/1-0048/name
6. エージェントの使用方法
/bus-drivers-i2c-spi Write regmap-based driver for I2C PMIC at 0x58

よくある問題

症状原因対処方法
-EREMOTEIONACK — アドレスが誤っているi2cdetect を実行し、DT の reg を確認します
SPI モードが誤っているCPOL/CPHA の不一致データシートと spi->mode を一致させます
Probe の遅延レギュレーター/クロックの供給元-EPROBE_DEFER を返します
regmap -EIOレジスターが 16 ビットか 8 ビットかの不一致reg_bits、val_bits を設定します
DMA が使用されない小さい場合は spi_sync で問題ありません大量転送には spi_sync_transfer を使用します

関連するスキル

  • skills/kernel/device-drivers — IRQ、DMA、PM runtime
  • skills/kernel-dev/device-tree — バスの子ノード
  • skills/baremetal/spi-i2c-baremetal — レジスターレベルのプロトコル
  • skills/kernel-dev/platform-device-model — ドライバーモデルとの共通点
  • skills/kernel-dev/writing-char-drivers — センサーを char デバイスとして公開

コメント