i2c-stub¶
描述¶
这个模块是一个非常简单的伪造的I2C/SMBus驱动程序。它实现了六种类型的SMBus命令:快速写,(r/w) 字节,(r/w) 字节数据,(r/w) 字数据,(r/w) I2C块数据,以及 (r/w) 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]
可选的bank设置。 它们指示哪个寄存器中的哪些位选择活动bank,以及bank寄存器的范围。
注意事项¶
如果你的目标驱动轮询某个字节或字,等待它改变,stub可能会锁住它。 使用 i2cset 来解锁它。
如果你用力发送垃圾信息,printk可能会丢失信息。 这个模块真的需要像 relayfs 这样的东西。