如何找到I2c设备的地址以及读写寄存器
以下是从 反编译 DTB 文件为 DTS 文件、找到 I2C 总线地址,再到 利用 i2ctransfer
读取或写入设备寄存器 的完整流程:
1. 反编译 DTB 文件为 DTS 文件
DTB 文件是设备树的二进制形式,我们需要先将其反编译为设备树源文件(DTS 文件)来分析硬件配置信息。
步骤:
-
安装
dtc
工具:
在 Linux 系统上,使用如下命令安装:sudo apt-get install device-tree-compiler
-
反编译
dtb
文件:
使用dtc
工具将.dtb
文件反编译为.dts
文件。dtc -I dtb -O dts -o output_file.dts input_file.dtb
input_file.dtb
是要反编译的设备树二进制文件。output_file.dts
是输出的设备树源文件。
-
查看
dts
文件:
使用文本编辑器(如vim
、nano
等)打开output_file.dts
,查找设备的 I2C 配置。vim output_file.dts
2. 找到 I2C 总线和设备地址
在 dts
文件中,查找关键字 i2c
,可以定位到设备树中与 I2C 相关的配置。通常,I2C 总线的配置会包含以下信息:
- I2C 总线编号:通常在
i2c@
节点下。 - 设备地址:I2C 设备的地址是十六进制表示的,通常在
reg = <...>
字段中。
示例:
你可能会在 dts
文件中看到类似如下的配置:
i2c@1a000 {compatible = "i2c-designware";reg = <0x1a000>; // I2C 总线的基地址...device@1a {compatible = "some-device";reg = <0x1a>; // I2C 设备地址...};
};
在这个例子中:
i2c@1a000
表示 I2C 总线的基地址(这里是总线 1)。device@1a
表示 I2C 设备的地址为0x1A
。
在你找到 I2C 总线并想确认设备是否连接到指定总线上时,使用 i2cdetect
工具来扫描 I2C 总线,找到所有连接在该总线上的 I2C 设备及其地址。
i2cdetect
命令格式:
i2cdetect -y -r <总线号>
-y
:跳过用户确认提示,直接执行扫描。-r
:使用读模式扫描设备(大多数情况下,推荐使用-r
,它避免一些可能干扰设备操作的写操作)。<总线号>
:I2C 总线的编号(例如总线 1 则填1
)。
示例:
如果你想扫描 I2C 总线 1
上的设备,运行以下命令:
i2cdetect -y -r 1
输出结果将显示一个 7 位地址表,其中包含已连接到该 I2C 总线的所有设备地址。如果在地址 0x1A
处发现设备,说明该地址的设备是连接在该总线上的。其中UU是DTB定义的设备
3. 使用 i2ctransfer
读取或写入设备的寄存器
找到 I2C 总线和设备地址后,使用 i2ctransfer
工具与 I2C 设备通信。
读取寄存器
假设设备在 I2C 总线 1
上,设备地址为 0x1A
,需要读取寄存器地址 0x10
的值,使用如下命令:
i2ctransfer -y 1 w1@0x1A 0x10 r1@0x1A
w1@0x1A 0x10
:写入 1 个字节0x10
(寄存器地址)到设备0x1A
。r1@0x1A
:从设备0x1A
读取 1 个字节(寄存器中的值)。
写入寄存器
如果需要向寄存器 0x10
写入值 0xFF
,使用如下命令:
i2ctransfer -y 1 w2@0x1A 0x10 0xFF
w2@0x1A 0x10 0xFF
:向设备地址0x1A
写入两个字节:寄存器地址0x10
和数据0xFF
。
4. 总结操作流程
-
反编译 DTB 文件:
- 使用
dtc
反编译.dtb
文件,生成.dts
文件。
- 使用
-
找到 I2C 总线和设备地址:
- 在
.dts
文件中查找与 I2C 相关的节点,确定设备的总线编号和设备地址。
- 在
-
使用
i2ctransfer
进行通信:- 使用
i2ctransfer
命令读取或写入指定寄存器的值。
- 使用
这套流程帮助你从设备树信息中找到 I2C 设备的相关信息,并使用 Linux 系统的 I2C 工具与设备通信。