【I2C】基于Linux移植i2c-tool工具

文章目录

  • 1. 下载i2c-tool工具
  • 2. 编译i2c-tool源码
  • 3. i2cdetect的用法
  • 4. i2cdump的用法
  • 5. i2cget的用法
  • 6. i2cset的用法
  • 7. i2ctransfer的用法

1. 下载i2c-tool工具

i2c-tool工具下载地址:
https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/
【I2C】基于Linux移植i2c-tool工具_第1张图片

2. 编译i2c-tool源码

因为我这里需要将i2c-tool移植到imx6ull嵌入式平台,所以编译时肯定需要重新指定GCC。查看i2c-tool根目录下的Makefile文件,默认为系统GCC工具编译:

CC  ?= gcc
AR  ?= ar
STRIP   ?= strip

在ubuntu编译i2c-tool源码之前,首先设置imx6ull嵌入式平台的交叉工具链,可以直接在命令行输入如下命令:

export ARCH=arm
export CROSS_COMPILE=arm-none-linux-gnueabihf-
export PATH=$PATH:/opt/ToolChain/gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf/bin

make时指定GCC即可:

make CC=arm-none-linux-gnueabihf-gcc AR=arm-none-linux-gnueabihf-ar STRIP=arm-none-linux-gnueabihf-strip USE_STATIC_LIB=1  

添加USE_STATIC_LIB=1是为了静态编译,因为默认为动态编译,运行程序时还需要拷贝libi2c.so。

3. i2cdetect的用法

i2cdetect命令的使用方法:

# ./i2cdetect 
Error: No i2c-bus specified!
Usage: i2cdetect [-y] [-a] [-q|-r] I2CBUS [FIRST LAST]
       i2cdetect -F I2CBUS
       i2cdetect -l
  I2CBUS is an integer or an I2C bus name
  If provided, FIRST and LAST limit the probing range.

-f:强制模式,即使驱动程序已经注册该设备,也允许用户从寄存器读取/写入寄存器。
-y:默认输入yes,不再询问用户确认。

  • 列出I2C所有总线
    命令如下:

    ./i2cdetect -l
    

    输出结果如下:
    在这里插入图片描述

  • 列出I2Cx总线上所有的设备
    命令如下:

    ./i2cdetect -y -a 4
    

    输出结果如下:
    【I2C】基于Linux移植i2c-tool工具_第2张图片

    --表示没有该地址对应的设备,
    UU表示有该设备并且它已经有驱动程序,
    数值表示有该设备但是没有对应的设备驱动

4. i2cdump的用法

i2cdump命令的使用方法:

# ./i2cdump
Error: No i2c-bus specified!
Usage: i2cdump [-f] [-y] [-r first-last] [-a] I2CBUS ADDRESS [MODE [BANK [BANKREG]]]
  I2CBUS is an integer or an I2C bus name
  ADDRESS is an integer (0x08 - 0x77, or 0x00 - 0x7f if -a is given)
  MODE is one of:
    b (byte, default)
    w (word)
    W (word on even register addresses)
    s (SMBus block, deprecated)
    i (I2C block)
    c (consecutive byte)
    Append p for SMBus PEC

-f:强制模式,即使驱动程序已经注册该设备,也允许用户从寄存器读取/写入寄存器。
-y:默认输入yes,不再询问用户确认。

  • 显示I2C总线上社保的寄存器值
    显示I2C 4号总线上0x30设备的寄存器值,MODE为byte,命令如下:
    ./i2cdump -f -y 4 0x30 b
    
    输出结果如下:
    【I2C】基于Linux移植i2c-tool工具_第3张图片

5. i2cget的用法

i2cget命令的使用方法:

# ./i2cget
Usage: i2cget [-f] [-y] [-a] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE [LENGTH]]]
  I2CBUS is an integer or an I2C bus name
  ADDRESS is an integer (0x08 - 0x77, or 0x00 - 0x7f if -a is given)
  MODE is one of:
    b (read byte data, default)
    w (read word data)
    c (write byte/read byte)
    s (read SMBus block data)
    i (read I2C block data)
    Append p for SMBus PEC
  LENGTH is the I2C block data length (between 1 and 32, default 32)

-f:强制模式,即使驱动程序已经注册该设备,也允许用户从寄存器读取/写入寄存器。
-y:默认输入yes,不再询问用户确认。

  • 从某个寄存器里面读取一个byte数据
    从i2c总线4上的0x30设备读取寄存器0x85的值,大小为1byte。默认模式的为b,这里可以省略。命令如下:
    i2cget -f -y 4 0x30 0x85
    
  • 从某个寄存器里面读取一个word数据
    从i2c总线4上的0x30设备读取寄存器0x85的值,大小为1word(1word = 2byte)。命令如下:
    i2cget -f -y 4 0x30 0x85 w
    

6. i2cset的用法

i2cset命令的使用方法:

# ./i2cset 
Usage: i2cset [-f] [-y] [-m MASK] [-r] [-a] I2CBUS CHIP-ADDRESS DATA-ADDRESS [VALUE] ... [MODE]
  I2CBUS is an integer or an I2C bus name
  ADDRESS is an integer (0x08 - 0x77, or 0x00 - 0x7f if -a is given)
  MODE is one of:
    c (byte, no value)
    b (byte data, default)
    w (word data)
    i (I2C block data)
    s (SMBus block data)
    Append p for SMBus PEC

-f:强制模式,即使驱动程序已经注册该设备,也允许用户从寄存器读取/写入寄存器。
-y:默认输入yes,不再询问用户确认。

  • 往某个寄存器里面写入一个byte数据
    往i2c总线4上的0x30设备寄存器0x85写入0x23,大小为1byte。默认模式的为b,这里可以省略。命令如下:
    i2cget -f -y 4 0x30 0x85 0x23
    
  • 往某个寄存器里面写入一个word数据
    往i2c总线4上的0x30设备读取寄存器0x85写入0x2345,大小为1word(1word = 2byte)。命令如下:
    ./i2cset -f -y 4 0x30 0x85 0x2345 w
    

7. i2ctransfer的用法

i2cgeti2cset命令使用的是SMBus协议i2ctransfer命令使用的是I2C协议。SMBus是基于I2C协议的,SMBus要求更严格,SMBus是I2C协议的子集。

i2ctransfer使用方法如下:

# ./i2ctransfer 
Usage: i2ctransfer [-f] [-y] [-v] [-V] [-a] I2CBUS DESC [DATA] [DESC [DATA]]...
  I2CBUS is an integer or an I2C bus name
  DESC describes the transfer in the form: {r|w}LENGTH[@address]
    1) read/write-flag 2) LENGTH (range 0-65535, or '?')
    3) I2C address (use last one if omitted)
  DATA are LENGTH bytes for a write message. They can be shortened by a suffix:
    = (keep value constant until LENGTH)
    + (increase value by 1 until LENGTH)
    - (decrease value by 1 until LENGTH)
    p (use pseudo random generator until LENGTH with value as seed)

Example (bus 0, read 8 byte at offset 0x64 from EEPROM at 0x50):
  # i2ctransfer 0 w1@0x50 0x64 r8
Example (same EEPROM, at offset 0x42 write 0xff 0xfe ... 0xf0):
  # i2ctransfer 0 w17@0x50 0x42 0xff-

-f:强制模式,即使驱动程序已经注册该设备,也允许用户从寄存器读取/写入寄存器。
-y:默认输入yes,不再询问用户确认。

  • 往某个寄存器里面写入多个数据
    往i2c总线4上的0x30设备写入3个byte数据,命令如下:

    i2ctransfer -y -f 4 w3@0x30 0x85 0x01 0x10
    

    具体说明如下:
    【I2C】基于Linux移植i2c-tool工具_第4张图片

  • 从某个寄存器里面读取多个数据
    往i2c总线4上的0x30设备0x8501寄存器读取3个byte数据,命令如下:

    i2ctransfer -y -f 4 w2@0x30 0x85 0x01 r3
    

    具体说明如下:
    【I2C】基于Linux移植i2c-tool工具_第5张图片

你可能感兴趣的:(Linux,linux,arm开发)