i2c-stub模拟I2C器件

I2C-Stub模拟I2C器件

在有时候没有I2C器件,但是需要通过I2C器件完成某些特定功能的时候,比如最近想使用libmctp库来开发MCTP的相关功能,Linux提供了I2C-Stub驱动来模拟I2C器件。这篇文章主要是用来记录I2C-Stub的使用。

1 编译I2C-Stub驱动

在Linux源码目录下执行:

make menuconfig

然后在选择下面的选项,编译内核时才会编译I2C-Stub驱动

Device Drivers -> I2C support -> I2C/SMBus Test Stub

2 I2C-Stub使用

2.1 加载I2C-Stub驱动

modprobe i2c-stub chip_addr=0x1c

其中chip_addr是指定的入参,模拟的器件地址。如果不知道I2C-Stub有哪些入参可以通过modinfo查询:

modinfo i2c-stub   
filename:       /lib/modules/5.15.0-139-generic/kernel/drivers/i2c/i2c-stub.ko
license:        GPL
description:    I2C stub driver
author:         Mark M. Hoffman <mhoffman@lightlink.com>
srcversion:     FAD521AE505AA2363583925
depends:        
retpoline:      Y
intree:         Y
name:           i2c_stub
vermagic:       5.15.0-139-generic SMP mod_unload modversions 
sig_id:         PKCS#7
signer:         Build time autogenerated kernel key
sig_key:        54:17:5F:ED:84:7C:3C:F0:BA:A4:80:AC:DD:8C:5A:F4:EC:90:C6:7E
sig_hashalgo:   sha512
signature:      B6:4D:7A:F1:27:F2:AD:39:37:D4:EA:CA:67:13:38:15:E4:59:7B:CF:
                F0:86:60:4B:2E:5C:06:44:06:04:D3:C5:5B:12:88:C5:F6:A6:02:3A:
                B6:32:5C:C7:23:BD:49:DD:03:41:92:EE:E5:F6:07:EF:AD:8B:81:6E:
                99:03:1E:E9:20:5D:17:76:59:BD:09:E5:86:66:F7:AB:FB:1C:3D:49:
                32:56:DD:89:4F:9E:48:CF:C3:EF:2E:79:6B:53:6E:16:C6:70:61:1E:
                7B:DC:55:EA:BE:75:76:35:B9:E1:07:57:01:BC:25:C6:63:37:0E:5C:
                49:69:A3:EC:77:38:7D:11:61:64:FA:7E:AD:1C:F8:3F:67:35:20:CE:
                02:F0:F6:37:25:67:35:1E:41:FB:A7:FF:32:A9:B5:B4:63:19:E6:FC:
                47:BF:E8:10:99:E3:A5:26:56:DB:27:49:51:F1:DE:BB:BD:D8:63:79:
                CD:C5:28:80:B7:15:F0:91:3B:FF:03:C2:1C:36:B0:67:FB:10:46:D5:
                7E:2A:77:3B:F1:97:E0:A8:8C:D0:95:29:EC:DD:45:28:5F:13:E7:27:
                9F:F5:E7:5E:13:AA:88:85:27:33:75:07:6B:9B:B3:4D:93:30:EB:07:
                41:F8:7D:8B:10:24:C8:A9:CE:24:20:D4:33:C9:58:19:E9:F7:59:5E:
                97:AF:1B:9A:12:E1:9E:EA:B2:81:79:EF:68:94:1B:0D:1A:3D:24:8E:
                D6:C1:79:07:AE:41:3E:F5:DA:E3:AE:60:58:8F:08:CA:15:9B:93:8F:
                AC:A5:7E:DF:59:72:8A:99:72:D3:97:C8:08:B5:E3:1C:6E:F6:5E:80:
                14:06:BD:6A:50:36:F7:48:E7:95:CE:09:DA:5B:F2:3F:13:2D:A2:A7:
                4C:C6:BD:D2:D5:53:3F:9A:E4:1A:83:E3:A5:25:0E:43:E7:10:33:1F:
                85:37:F8:83:05:32:3A:77:D8:DA:52:53:D9:24:5E:4D:9F:07:CA:B6:
                33:78:4B:82:24:47:A3:97:58:7D:81:06:B1:A8:9C:7D:8A:D6:40:D0:
                B0:6F:F9:51:7F:3E:42:3B:89:0F:0A:4E:55:D3:DD:21:0F:C3:DA:D7:
                A8:A4:D4:9C:7A:17:FB:EE:9F:8E:00:49:67:9B:27:A8:40:00:79:E2:
                18:0A:22:C2:53:1E:65:4B:52:46:1C:3D:7D:FA:DA:44:94:F7:2F:B8:
                6C:D9:56:4E:7D:93:22:F4:76:F3:5E:E5:F3:78:20:F7:A2:B4:E8:63:
                DF:0F:1F:A0:90:9F:EF:7C:20:54:E4:9D:C6:D2:1D:FF:0E:AA:73:C6:
                CB:B2:4D:49:CC:7F:1B:E8:E3:6F:8F:8C
parm:           chip_addr:Chip addresses (up to 10, between 0x03 and 0x77) (array of ushort)
parm:           functionality:Override functionality bitfield (ulong)
parm:           bank_reg:Bank register (array of byte)
parm:           bank_mask:Bank value mask (array of byte)
parm:           bank_start:First banked register (array of byte)
parm:           bank_end:Last banked register (array of byte)

会列出所有参数(param这几个就是列举的所有参数),并注释给入参的含义。

2 读写模拟的I2C器件

i2cset 4 0x1C 0x07 0x04 b #在bus-4的0x1c地址,偏移为0x7处,写入0x4

i2cset 4 0x1C 0x22 0x64 w #在bus-4的0x1c地址,偏移为0x22处,写入0x0064

i2cset传入的第一个参数4,是i2c-stub驱动虚拟出来的i2c总线。每个环境不一样,需要根据实际情况,可以使用i2cdetect -l进行查询:

$ i2cdetect -l
...
i2c-7  unknown    SMBus stub driver    N/A    <<--- Here it is!

3 Reference

1 ubuntu - How can I emulate an I2C device on Linux? - Stack Overflow

2 Using the I2C-Stub to Emulate a Device – Rachel's Blinking LEDs

posted @ 2025-08-19 20:56  cockpunctual  阅读(67)  评论(0)    收藏  举报