在 OpenBMC 中,你可以使用 `i2cdetect` 命令来查看 I2C 设备的 bus 和地址。这个命令是 OpenBMC 系统中集成好的,可以直接使用。
具体分为两个步骤:
🔍 第一步:列出所有 I2C 总线
首先,需要知道系统里有哪些可用的 I2C 总线。执行以下命令:
```bash
i2cdetect -l
```
这个命令会列出所有 I2C 总线控制器及其编号。输出会类似这样:
-
`i2c-0 i2c i2c-0-mux (chan_id 0) I2C adapter`
-
`i2c-1 i2c i2c-0-mux (chan_id 1) I2C adapter`
-
`i2c-5 i2c i2c-6-mux (chan_id 0) I2C adapter`
记下你想要探测的总线号,比如 `5`。
🎯 第二步:扫描指定总线上的设备
知道总线号后,就可以扫描该总线上连接了哪些设备了。使用以下命令:
```bash
i2cdetect -y <总线号>
```
例如,扫描总线 `5`:
```bash
i2cdetect -y 5
```
执行后,你会看到一个地址表格。表格中的每个格子代表一个可能的 7 位设备地址(十六进制表示)。不同符号的含义如下:
| 表格符号 | 含义 |
| :--- | :--- |
| **数字** (如 `4c`) | 在这个地址上**发现了一个设备**,且未被内核驱动占用,可直接用工具访问。 |
| **`UU`** | 在这个地址上**有设备**,但**已被内核驱动占用**,无法直接用 `i2cget` 等用户空间工具访问。 |
| **`--`** | 该地址**没有设备响应**。 |
> **注意**:硬件原理图中的地址(如 `0x98`)通常是 8 位格式,需要**右移一位**才是软件命令中要用的 7 位地址(如 `0x4c`)。
💡 高级技巧:处理复杂总线拓扑
在复杂的服务器硬件中,I2C 总线经常通过多路复用器(Mux)扩展出多条子总线。如果扫描结果一片空白,可能是因为设备挂在 Mux 的某个下游通道上,而默认通道没有开启。OpenBMC 社区提供了一个 Python 脚本 `tree.py`,可以解析 `i2cdetect -l` 的输出,并以树状图的形式直观展示总线之间的父子关系,帮你理清复杂的拓扑结构。
**实战小贴士**:例如,你想读取 EEPROM 的 MAC 地址,如果知道设备挂在总线 `1` 且地址为 `0x50`,可以先扫描确认设备存在(显示 `50` 或 `UU`),再使用 `i2cget` 命令读取数据。