mcpField
B
bus-drivers-i2c-spi

bus-drivers-i2c-spi

github.com/mohitmishra786Development269314 installsUpdated 18w ago
Repository

About bus-drivers-i2c-spi

bus-drivers-i2c-spi is a skill for agents developing Linux I2C and SPI client drivers. It covers bus-specific probe patterns, raw transfers, regmap, device-tree child nodes, and debugging common communication errors.

Key features

  1. 01I2C 客户端驱动与 probe 模式
  2. 02SPI 驱动与同步传输
  3. 03使用 regmap 访问寄存器
  4. 04设备树总线子节点配置
  5. 05I2C 与 SPI 故障排查

Use cases

  1. 01为 I2C 传感器或 PMIC 编写驱动
  2. 02将裸机 SPI 寄存器访问迁移到内核
  3. 03用 regmap 处理多字节寄存器
  4. 04排查 NACK 或缺失 ACK

Install

Copy the command and run it in a terminal.

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

After installing, type/bus-drivers-i2c-spiin Claude Code to confirm it loaded.

Details

From the project README

Bus Drivers (I2C and SPI)

Purpose

Guide agents through Linux I2C and SPI client drivers: bus registration, i2c_transfer / spi_sync, regmap abstraction, DT compatible on bus children, and probe patterns — complementing platform MMIO drivers in skills/kernel/device-drivers.

When to Use

  • Sensor or PMIC on I2C/SPI bus
  • Converting bare-metal SPI register reads to kernel driver
  • Using regmap for multi-byte register access
  • Debugging -EREMOTEIO or missing ACK

Workflow

1. I2C client driver
#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 child:

i2c1 {
    sensor@48 {
        compatible = "vendor,sensor";
        reg = <0x48>;
    };
};
2. Raw I2C transfer
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 driver
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 (preferred for register maps)
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. Debug
i2cdetect -y 1
i2cdump -y 1 0x48
cat /sys/bus/i2c/devices/i2c-1/1-0048/name
6. Agent usage
/bus-drivers-i2c-spi Write regmap-based driver for I2C PMIC at 0x58

Common Problems

SymptomCauseFix
-EREMOTEIONACK — wrong addressi2cdetect; check reg in DT
SPI mode wrongCPOL/CPHA mismatchMatch datasheet + spi->mode
Probe deferRegulator/clock supplierReturn -EPROBE_DEFER
regmap -EIO16-bit vs 8-bit regSet reg_bits, val_bits
DMA not usedSmall spi_sync OKspi_sync_transfer for bulk

Related Skills

  • skills/kernel/device-drivers — IRQ, DMA, PM runtime
  • skills/kernel-dev/device-tree — bus child nodes
  • skills/baremetal/spi-i2c-baremetal — register-level protocol
  • skills/kernel-dev/platform-device-model — driver model parallels
  • skills/kernel-dev/writing-char-drivers — expose sensor via char dev

Comments

Markdown supported