关于 bus-drivers-i2c-spi
bus-drivers-i2c-spi 是面向 Linux I2C 和 SPI 客户端驱动开发的 Agent 技能,涵盖总线 probe 模式、原始传输、regmap、设备树子节点及常见通信错误排查。
主要功能
- 01I2C 客户端驱动与 probe 模式
- 02SPI 驱动与同步传输
- 03使用 regmap 访问寄存器
- 04设备树总线子节点配置
- 05I2C 与 SPI 故障排查
适用场景
- 01为 I2C 传感器或 PMIC 编写驱动
- 02将裸机 SPI 寄存器访问迁移到内核
- 03用 regmap 处理多字节寄存器
- 04排查 NACK 或缺失 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)
用途
指导 Agent 编写 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 = ® },
{ .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. Agent 用法
/bus-drivers-i2c-spi Write regmap-based driver for I2C PMIC at 0x58
常见问题
| 症状 | 原因 | 修复方法 |
|---|---|---|
-EREMOTEIO | NACK — 地址错误 | 使用 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、运行时 PMskills/kernel-dev/device-tree— 总线子节点skills/baremetal/spi-i2c-baremetal— 寄存器级协议skills/kernel-dev/platform-device-model— 驱动程序模型的对应关系skills/kernel-dev/writing-char-drivers— 通过字符设备提供传感器
评论
支持 Markdown