bus-drivers-i2c-spi — скилл для Claude Code: драйверы I2C и SPI
Помогает писать клиентские драйверы Linux для датчиков и PMIC на шинах I2C и SPI: регистрация, regmap, привязка к device tree.
npx skills add mohitmishra786/low-level-dev-skills --skill bus-drivers-i2c-spi -a claude-codeЧто делает bus-drivers-i2c-spi
Скилл ведёт агента по клиентским драйверам I2C и SPI в ядре Linux. Внутри — рабочие шаблоны: i2c_driver с probe, of_device_id и i2c_device_id, сырой обмен через i2c_transfer с двумя сообщениями (запись адреса регистра, затем чтение), драйвер spi_driver с настройкой spi->mode и spi->bits_per_word. Отдельный блок про regmap: конфигурация с reg_bits, val_bits и max_register, вызовы regmap_read, regmap_write, regmap_update_bits.
Есть разбор типовых сбоев с причинами. -EREMOTEIO — это NACK, чаще всего из-за неверного адреса, лечится i2cdetect и проверкой reg в device tree. Неверный режим SPI — расхождение CPOL/CPHA с даташитом. -EPROBE_DEFER приходит, когда регулятор или клок ещё не готовы. Ошибка -EIO в regmap обычно значит, что перепутаны разрядности регистра и значения.
Для отладки скилл даёт команды i2cdetect -y 1, i2cdump -y 1 0x48 и чтение имени устройства из /sys/bus/i2c/devices/. Вызов из агента — слэш-команда /bus-drivers-i2c-spi с описанием задачи. Драйверы MMIO на платформенной шине сюда не входят, для них есть отдельный скилл device-drivers.
Какие задачи решает
- написать клиентский драйвер I2C для датчика или PMIC
- перевести чтение регистров SPI с голого железа в драйвер ядра
- настроить regmap для доступа к многобайтовым регистрам
- разобраться, почему обмен падает с
-EREMOTEIO - привязать устройство на шине через
compatibleв device tree
Примеры запросов агенту
- /bus-drivers-i2c-spi напиши драйвер на regmap для I2C PMIC по адресу 0x58
- /bus-drivers-i2c-spi добавь spi_driver для датчика, режим SPI_MODE_0, 8 бит на слово
- /bus-drivers-i2c-spi почему probe возвращает -EREMOTEIO на i2c-1?
Как установить bus-drivers-i2c-spi
1Через Skills CLI (Vercel)
npx skills add mohitmishra786/low-level-dev-skills --skill bus-drivers-i2c-spi -a claude-code2Вручную: положить файлы
~/.claude/skills/bus-drivers-i2c-spi/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/bus-drivers-i2c-spi/
1Через Skills CLI (Vercel)
npx skills add mohitmishra786/low-level-dev-skills --skill bus-drivers-i2c-spi -a codex2Вручную: положить файлы
.agents/skills/bus-drivers-i2c-spi/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add mohitmishra786/low-level-dev-skills --skill bus-drivers-i2c-spi -a cursor2Вручную: положить файлы
.cursor/skills/bus-drivers-i2c-spi/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install mohitmishra786/low-level-dev-skills bus-drivers-i2c-spi2Вручную: положить файлы
.github/skills/bus-drivers-i2c-spi/SKILL.md1Через Skills CLI (Vercel)
npx skills add mohitmishra786/low-level-dev-skills --skill bus-drivers-i2c-spi -a gemini-cli2Командой платформы
gemini skills install https://github.com/mohitmishra786/low-level-dev-skills --path skills/kernel-dev/bus-drivers-i2c-spiВручную: положить файлы
.devin/skills/bus-drivers-i2c-spi/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add mohitmishra786/low-level-dev-skills --skill bus-drivers-i2c-spi -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Из того же набора62
Похожие
Рядом в теме «Языки программирования»
Все скиллы по теме «Языки программирования» →Вопросы о bus-drivers-i2c-spi
Как установить bus-drivers-i2c-spi в Claude?
Выполните npx skills add mohitmishra786/low-level-dev-skills --skill bus-drivers-i2c-spi -a claude-code. После этого файл скилла лежит в ~/.claude/skills/bus-drivers-i2c-spi/SKILL.md.
Что делает bus-drivers-i2c-spi?
Проводит агента по написанию клиентских драйверов I2C и SPI в Linux: регистрация драйвера, обмен через i2c_transfer и spi_sync, работа с regmap, привязка к device tree. Плюс таблица типовых ошибок с причинами.
Чем этот скилл отличается от device-drivers?
device-drivers про платформенные MMIO-драйверы, IRQ, DMA и управление питанием. Здесь речь только о клиентах на шинах I2C и SPI.
Исходный текст
SKILL.md · MIT
---
name: bus-drivers-i2c-spi
description: I2C and SPI bus driver skill for Linux client drivers. Use when writing i2c_driver or spi_driver, register access over bus, DMA SPI transfers, or ACPI/DT client binding. Activates on queries about i2c_client, spi_driver, regmap I2C, SPI transfer, or Linux I2C SPI subsystem.
---
# 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
```c
#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:
```dts
i2c1 {
sensor@48 {
compatible = "vendor,sensor";
reg = <0x48>;
};
};
```
### 2. Raw I2C transfer
```c
u8 reg = 0x0F, val;
struct i2c_msg msgs[] = {
{ .addr = client->addr, .flags = 0, .len = 1, .buf = ® },
{ .addr = client->addr, .flags = I2C_M_RD, .len = 1, .buf = &val },
};
ret = i2c_transfer(client->adapter, msgs, 2);
```
### 3. SPI driver
```c
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)
```c
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
```bash
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
| Symptom | Cause | Fix |
|---------|-------|-----|
| `-EREMOTEIO` | NACK — wrong address | `i2cdetect`; check `reg` in DT |
| SPI mode wrong | CPOL/CPHA mismatch | Match datasheet + `spi->mode` |
| Probe defer | Regulator/clock supplier | Return `-EPROBE_DEFER` |
| regmap -EIO | 16-bit vs 8-bit reg | Set `reg_bits`, `val_bits` |
| DMA not used | Small `spi_sync` OK | `spi_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
© mohitmishra786 · MIT · mohitmishra786/low-level-dev-skills