<Linux开发> linux开发工具-之-I2C TOOLS工具使用
<Android开发> Android开发工具- 之-I2C TOOLS工具使用
<Linux开发>驱动开发 -之- Linux I2C 驱动
一 前言
在笔者的另一篇文章 <Android开发> Android开发工具- 之-I2C TOOLS工具使用讲解过,如何在android上使用I2C TOOLS工具。本文主要是分析如何在linux开发板上使用I2C TOOLS工具,整体使用和android基本一致,差一点主要在编译这一块。毕竟不同项目编译还是有一定差异的;接下来我们就来看看如何将I2C TOOLS工具移植到linux开发板上。
二 获取I2C工具源码
下载地址:I2C_TOOLS
打开后如下:
笔者选择了4.3版本,如下:
下载得到的是一个源码包。
读者根据自己想要的版本下来即可,下载完成后使用如下命令解压:
tar -xvf i2c-tools-4.3.tar.gz
解压后内容如下:
三 编译I2C工具源码
前面获取得到源码后,我们就需要使用交叉编译工具,进行编译,然后将编译后生成的执行文件放到设备中,即可。
整体的流程其实和平常Linux开发的流程基本是一样的。
接下来我们看看如何编译i2c-tools。
下载i2c-tools并解压后如下图:
使用编辑工具打开Makefile文件,笔者使用vscode。
打开后根据Linux板子的类型选择32位还是64位的交叉编译工具。然后新增以下内容:
32位设备添加:
bindir += /usr/local/arm/gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf/bin
ARCH = arm
CC = arm-linux-gnueabihf-gcc
64位设备添加:
bindir += /usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin
ARCH = arm
CC = aarch64-linux-gnu-gcc
第28行:指定包含交叉工具的路径,交叉编译工具下载:linaro;下载后解压到指定目录下;笔者使用“tar -xvf gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf.tar.xz -C /usr/local/arm
”解压到该目录。
第29行:执行架构,Linux开发板,当然是arm了;
第30行:指定gcc编译工具,这里指向交叉编译工具。即 /usr/local/arm/gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
第33行:指定包含交叉工具的路径,交叉编译工具下载:linaro;下载后解压到指定目录下;笔者使用“tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /usr/local/arm
”解压到该目录。
第34行:执行架构,Linux开发板,当然是arm了;
第35行:指定gcc编译工具,这里指向交叉编译工具。即 /usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
添加好编译参数后,打开终端,并执行"make",如下:
可看到输出内容,在tools目录下生成我们所需要的工具文件。
进入tools目录查看文件信息;
使用file命令可查看文件属性,可看出 生成的i2cset是 32位,ARM的可执行文件。
如果是用64位交叉编译则是如下图:
编译得到的工具文件有:i2cdetect、i2cset、i2cdump、i2cget、i2ctransfer这几个工具文件,我们将这几个文件放到设备中即可使用。
四 I2C工具使用
3.1 准备工具文件
将2cdetect、i2cset、i2cdump、i2cget、i2ctransfer这几个工具文件放到设备中,我们将其放到系统bin目录下;以及libi2c.so,命令如下:
//移植执行文件
cd i2c-tools-4.3/tools
cp i2cdetect ../../../nfs/buildrootfs/bin/
cp i2cset ../../../nfs/buildrootfs/bin/
cp i2cdump ../../../nfs/buildrootfs/bin/
cp i2cget ../../../nfs/buildrootfs/bin/
cp i2ctransfer ../../../nfs/buildrootfs/bin/
//移植libi2c.so
cd ../lib
cp libi2c.so ../../../nfs/buildrootfs/lib/
cp libi2c.so.0 ../../../nfs/buildrootfs/lib/
cp libi2c.so.0.1.1 ../../../nfs/buildrootfs/lib/
3.2 i2c-tool使用测试
本次测试是基于I.MX6ULL平台验证。笔者设备上i2c-0挂了一个三合一环境传感器:AP3216C,详细可查看:<Linux开发>驱动开发 -之- Linux I2C 驱动
1)用i2cdetect检测有几组i2c总线在系统上
命令:
i2cdetect -l
所查询的两个I2C控制器 与设备树中描述一致。
2)用i2cdetect检测挂载在i2c-1总线上器件,
命令:
i2cdetect -r -y 1
其中:
1:表示检测i2c-1上的挂载情况
检测i2c-0上的挂载情况
3)用i2cdump查看器件所有寄存器的值,这个命令可以查看器件所有寄存器的值,在实际测试时很好用
命令:
i2cdump -f -y 0 0x1e
其中 :
0: 表示I2C-0这个总线;
0x1e:表示总线上 设备地址为0x1e的这个设备;
4)用i2cset来设置单个寄存器值
命令:
i2cset -f -y 0 0x1e 0x00 0x04 //复位器件
i2cset -f -y 0 0x1e 0x00 0x03 //启动三合一环境传感器转换
其中 :
0: 表示I2C-0这个总线;
0x1e:表示总线上 设备地址为0x1e的这个设备;
0x00:操作的寄存器地址
0x04:当前操作的寄存器到写入的值
进行上述配置后传感器会启动数据转换,接着使用“i2cdump -f -y 0 0x1e”
查看转换后的数据即可,如下:
0X0A 0X0B 寄存器:红外线强度(IR)、0x0C 0X0D寄存器:环境光强度(ALS)、0X0E 0X0F寄存器:接近距离(PS) 这三个环境参数。
4)用i2cget来获取单个寄存器值
命令:
i2cget -f -y 0 0x1e 0x0A
i2cget -f -y 0 0x1e 0x0B
i2cget -f -y 0 0x1e 0x0C
i2cget -f -y 0 0x1e 0x0D
i2cget -f -y 0 0x1e 0x0E
i2cget -f -y 0 0x1e 0x0F
其中 :
0: 表示I2C-0这个总线;
0x1e:表示总线上 设备地址为0x1e的这个设备;
0x0A:操作的寄存器地址
5)i2ctransfer 使用,i2ctransfer支持16位/32位寄存器的读写,i2cset和i2cget只能读取8位的寄存器。所以i2ctransfer可以替代i2cset和i2cget
(1) 往i2c-0上0x1E器件 0x0000寄存器 写0x01
$i2ctransfer -f -y 0 w3@0x1E 0x00 0x00 0x01
(2) 在i2c-0上0x1E器件 0x000A寄存器 读取6个字节数据
i2ctransfer -f -y 0 w2@0x1E 0x00 0x0A r6
因为笔者使用的外设是8位寄存器的所以就没有演示了。
五 总结
善于使用工具可以有效提交我们测试验证外设的可用性 和错误性。帮助我们快速开发外设使用。