i2c-stub¶
描述¶
这个模块是一个非常简单的伪 I2C/SMBus 驱动程序。它实现了六种类型的 SMBus 命令:快速写、(读/写)字节、(读/写)字节数据、(读/写)字数据、(读/写)I2C 块数据和 (读/写)SMBus 块数据。
加载此驱动程序时,您需要提供芯片地址作为模块参数,然后它只会响应发送到这些地址的 SMBus 命令。
此模块不需要或不关联任何硬件。它将接受发送到指定地址的快速写命令;它将通过从内存中的数组读取或写入来响应其他命令(也发送到指定地址)。它还会为处理的每个命令向内核日志发送垃圾信息。
为所有字节操作实现了一个带有自动递增功能的指针寄存器。这允许连续字节读取,例如 EEPROM 支持的那些。
默认情况下禁用 SMBus 块命令支持,必须通过在功能模块参数中设置相应的位 (0x03000000) 显式启用。
必须写入 SMBus 块命令,以便为 SMBus 块操作配置 SMBus 命令。写入可以是部分的。块读取命令始终返回到目前为止最大的写入所选择的字节数。
典型用例如下
加载此模块
使用 i2cset (来自 i2c-tools 项目) 预加载一些数据
加载目标芯片驱动程序模块
在内核日志中观察其行为
i2c-tools 包中有一个名为 i2c-stub-from-dump 的脚本,它可以从芯片转储中自动加载寄存器值。
参数¶
- int chip_addr[10]
模拟芯片的 SMBus 地址。
- unsigned long functionality
功能覆盖,禁用某些命令。有关合适的值,请参阅 <linux/i2c.h> 中的 I2C_FUNC_* 常量。 例如,值 0x1f0000 将仅启用快速、字节和字节数据命令。
- u8 bank_reg[10], u8 bank_mask[10], u8 bank_start[10], u8 bank_end[10]
可选的银行设置。 它们告诉哪个寄存器中的哪些位选择活动银行,以及已组寄存器的范围。
注意事项¶
如果您的目标驱动程序轮询某些字节或字等待其更改,则 stub 可能会将其锁定。使用 i2cset 来解锁它。
如果您足够频繁地发送垃圾信息,printk 可能会丢失。此模块真的需要类似 relayfs 的东西。