i2c-tools安装与使用总结

2023-11-07

1 概述

最近调试了挺多款TP驱动,对I2C设备有了一定的了解,本篇文章主要讲解i2c-tools在linux和android中的安装编译和使用。i2c-tools软件包包含用于Linux的一组不同的I2C工具:总线探测工具,chip dumper,寄存器级SMBus访问帮助器,EEPROM解码脚本,EEPROM编程工具以及用于SMBus访问的python模块。 只要内核中包含I2C支持,就支持所有版本的Linux。

2 安装i2c-tools

可以访问i2c-tools官网获取一些信息
直接访问i2c-tools下载链接选择当前最新版本下载
i2c-tools download
或者通过git安装

 git clone git://git.kernel.org/pub/scm/utils/i2c-tools/i2c-tools.git

也可以指定版本

 git clone git://git.kernel.org/pub/scm/utils/i2c-tools/i2c-tools.git -b i2c-tools-3.1

2.1 ubuntu安装i2c-tools

下载好后解压进入i2c-tools-4.1目录,直接执行

make && make install

也可以编译成静态的

make USE_STATIC_LIB=1 && make install

需要交叉编译的话,修改Makefile中的CC、AR变量,改成自己的交叉编译工具链

CC	?= gcc
AR	?= ar

2.2 openwrt安装i2c-tools

添加packages/utils/i2c-tools/Makefile

#
# Copyright (C) 2007-2015 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#

include $(TOPDIR)/rules.mk

PKG_NAME:=i2c-tools
PKG_VERSION:=4.1
PKG_RELEASE:=3

PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
PKG_SOURCE_URL:=@KERNEL/software/utils/i2c-tools
PKG_HASH:=57b219efd183795bd545dd5a60d9eabbe9dcb6f8fb92bc7ba2122b87f98527d5

PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
PKG_LICENSE:=GPL-2.0-or-later LGPL-2.1-or-later
PKG_LICENSE_FILES:=COPYING COPYING.LGPL

PKG_BUILD_PARALLEL:=1
PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-i2c-tools-$(PKG_VERSION)

include $(INCLUDE_DIR)/package.mk
include ../../lang/python/python-package.mk
include ../../lang/python/python3-package.mk

PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xJf $(DL_DIR)/$(PKG_SOURCE)

define Package/i2c/Default
  URL:=https://i2c.wiki.kernel.org/index.php/I2C_Tools
  TITLE:=I2C
endef

define Package/libi2c
  $(call Package/i2c/Default)
  SECTION:=libs
  CATEGORY:=Libraries
  TITLE+=library for i2c-tools
  VARIANT:=bin
endef

define Package/i2c-tools
  $(call Package/i2c/Default)
  SECTION:=utils
  CATEGORY:=Utilities
  TITLE+=tools for Linux
  DEPENDS:=+libi2c
  VARIANT:=bin
endef

define Package/python-smbus
  $(call Package/i2c/Default)
  SUBMENU:=Python
  SECTION:=lang
  CATEGORY:=Languages
  TITLE:=Python bindings for the SMBUS
  DEPENDS:=+PACKAGE_python-smbus:libi2c +PACKAGE_python-smbus:python-light
  VARIANT:=python
endef

define Package/python3-smbus
  $(call Package/i2c/Default)
  SUBMENU:=Python
  SECTION:=lang
  CATEGORY:=Languages
  TITLE:=Python bindings for the SMBUS
  DEPENDS:=+PACKAGE_python3-smbus:libi2c +PACKAGE_python3-smbus:python3-light
  VARIANT:=python3
endef

define Package/libi2c/description
 This package contains i2c functionality needed by i2c-tools.
endef

define Package/i2c-tools/description
 This package contains an heterogeneous set of I2C tools for Linux. These tools
 were originally part of the lm-sensors package.
endef

define Package/python-smbus/description
 This package contain the python bindings for Linux SMBus access through i2c-dev.
endef

define Package/python3-smbus/description
 This package contain the Python3 bindings for Linux SMBus access through i2c-dev.
endef

ifeq ($(BUILD_VARIANT),bin)

define Build/Compile
	$(MAKE) -C $(PKG_BUILD_DIR) \
		LINUX="$(LINUX_DIR)" \
		CC="$(TARGET_CC)" \
		STAGING_DIR="$(STAGING_DIR)" \
		LDFLAGS="$(TARGET_LDFLAGS)" \
		CFLAGS="$(TARGET_CFLAGS)"
endef

define Build/InstallDev
	$(INSTALL_DIR) $(1)/usr/include $(1)/usr/lib
	$(CP) $(PKG_BUILD_DIR)/include/i2c $(1)/usr/include/
	$(CP) $(PKG_BUILD_DIR)/lib/libi2c.{a,so*} $(1)/usr/lib/
endef

endif # ifeq

PYTHON_PKG_SETUP_ARGS:=
PYTHON3_PKG_SETUP_ARGS:=

PYTHON_PKG_SETUP_DIR:=py-smbus
PYTHON3_PKG_SETUP_DIR:=py-smbus

define Package/libi2c/install
	$(INSTALL_DIR) $(1)/usr/lib
	$(CP) $(PKG_BUILD_DIR)/lib/libi2c.so* $(1)/usr/lib/
endef

define Package/i2c-tools/install
	$(INSTALL_DIR) $(1)/usr/sbin
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/tools/i2cdetect $(1)/usr/sbin/
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/tools/i2cdump $(1)/usr/sbin/
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/tools/i2cset $(1)/usr/sbin/
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/tools/i2cget $(1)/usr/sbin/
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/tools/i2ctransfer $(1)/usr/sbin/
endef

$(eval $(call BuildPackage,libi2c))
$(eval $(call BuildPackage,i2c-tools))
$(eval $(call PyPackage,python-smbus))
$(eval $(call BuildPackage,python-smbus))
$(eval $(call Py3Package,python3-smbus))
$(eval $(call BuildPackage,python3-smbus))

2.3 android8.1安装i2c-tools

把解压的文件放到android/external/i2c-tools文件夹,然后在i2c-tools文件夹中新建Android.mk

LOCAL_PATH:= $(call my-dir)

################### i2c-tools #########################
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := eng
LOCAL_MODULE := i2c-tools

LOCAL_SRC_FILES := \
    tools/i2cbusses.c \
    tools/util.c \
    lib/smbus.c

LOCAL_C_INCLUDES += \
    $(LOCAL_PATH) \
    $(LOCAL_PATH)/include

#LOCAL_CFLAGS := -g -Wall -Werror -Wno-unused-parameter
include $(BUILD_STATIC_LIBRARY)

################### i2cdetect #########################
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := eng
LOCAL_MODULE:=i2cdetect

LOCAL_SRC_FILES:= \
    tools/i2cdetect.c
    
LOCAL_C_INCLUDES += \
    $(LOCAL_PATH) \
    $(LOCAL_PATH)/include

LOCAL_SHARED_LIBRARIES:= \
    libc
LOCAL_STATIC_LIBRARIES := \
    i2c-tools
    
LOCAL_CPPFLAGS += -DANDROID

include $(BUILD_EXECUTABLE)

#################### i2cget ###########################
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := eng
LOCAL_MODULE:=i2cget

LOCAL_SRC_FILES:= \
    tools/i2cget.c
    
LOCAL_C_INCLUDES += \
    $(LOCAL_PATH) \
    $(LOCAL_PATH)/include

LOCAL_SHARED_LIBRARIES:= \
    libc
LOCAL_STATIC_LIBRARIES := \
    i2c-tools
    
LOCAL_CPPFLAGS += -DANDROID

include $(BUILD_EXECUTABLE)

##################### i2cset ##########################
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := eng
LOCAL_MODULE:=i2cset

LOCAL_SRC_FILES:= \
    tools/i2cset.c
    
LOCAL_C_INCLUDES += \
    $(LOCAL_PATH) \
    $(LOCAL_PATH)/include

LOCAL_SHARED_LIBRARIES:= \
    libc
LOCAL_STATIC_LIBRARIES := \
    i2c-tools

LOCAL_CPPFLAGS += -DANDROID

include $(BUILD_EXECUTABLE)

##################### i2cdump #########################
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := eng
LOCAL_MODULE:=i2cdump

LOCAL_SRC_FILES:= \
    tools/i2cdump.c
    
LOCAL_C_INCLUDES += \
    $(LOCAL_PATH) \
    $(LOCAL_PATH)/include

LOCAL_SHARED_LIBRARIES:= \
    libc
LOCAL_STATIC_LIBRARIES := \
    i2c-tools

LOCAL_CPPFLAGS += -DANDROID

include $(BUILD_EXECUTABLE)

################### i2ctransfer #######################
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := eng
LOCAL_MODULE:=i2ctransfer

LOCAL_SRC_FILES:= \
    tools/i2ctransfer.c
    
LOCAL_C_INCLUDES += \
    $(LOCAL_PATH) \
    $(LOCAL_PATH)/include

LOCAL_SHARED_LIBRARIES:= \
    libc
LOCAL_STATIC_LIBRARIES := \
    i2c-tools

LOCAL_CPPFLAGS += -DANDROID

include $(BUILD_EXECUTABLE)

然后在该目录下执行mm即可编译出应用i2cdetect、i2cdump、i2cset、i2cget、i2ctransfer,然后通过adb将生成的文件push到/system/bin目录下即可,或者重新打包固件烧录

3 i2c-tools使用

3.1 i2cdetect

i2cdetect用來列举I2C bus和上面所有的设备,可接受的参数有

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.

-V:输出当前版本号

root@Linux:/# i2cdetect -V
i2cdetect version 4.1

-l:输出所有 i2c 总线,如下总线编号有twi1和twi2,或者1和2

root@Linux:/# i2cdetect -l
i2c-1   i2c             twi1                                    I2C adapter
i2c-2   i2c             twi2                                    I2C adapter
root@Linux:/# ls -l /dev/i2c-*
crw-------    1 root     root       89,   1 Jan  1 23:11 /dev/i2c-1
crw-------    1 root     root       89,   2 Jan  1 23:11 /dev/i2c-2

I2CBUS:i2c总线编号
-F:此 i2c 支持的功能

root@Linux:/# i2cdetect -F 1
Functionalities implemented by /dev/i2c-1:
I2C                              yes
SMBus Quick Command              yes
SMBus Send Byte                  yes
SMBus Receive Byte               yes
SMBus Write Byte                 yes
SMBus Read Byte                  yes
SMBus Write Word                 yes
SMBus Read Word                  yes
SMBus Process Call               yes
SMBus Block Write                yes
SMBus Block Read                 no
SMBus Block Process Call         no
SMBus PEC                        yes
I2C Block Write                  yes
I2C Block Read                   yes

-y:指令执行自动yes,否则会提示确认执行Continue? [Y/n] Y,不加参数y会有很多执行提示,可以帮助判断
-a:输出总线上所有地址(00-7f),没有 -a,只显示 08-77,UU 表示该设备在驱动中已使用,如下0x38的地址有设备

root@Linux:/# i2cdetect -a 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x00-0x7f.
Continue? [Y/n] Y
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

root@Linux:/# i2cdetect -y -a 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

root@Linux:/# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         

-q:快速写指令,-q和-r不能同时使用
-r:读指令,-q和-r不能同时使用

3.2 i2cdump

i2cdump读取设备上所有寄存器的值,可接受的参数有

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 (0x03 - 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)
    i (I2C block)
    c (consecutive byte)
    Append p for SMBus PEC

-V:输出当前版本号
-f:强制使用此设备地址,即使此设备地址已经被使用;若不添加此参数,地址可能写失败
-y:指令执行自动 yes,否则会提示确认执行Continue? [Y/n] Y,不加参数y会有很多执行提示,可以帮助判断
-r:读取从 first-last 之间的寄存器值
-a:读取0x00-0xff范围的地址
I2CBUS:i2c总线编号
ADDRESS:设备地址,建议使用十六进制
MODE:不知道干嘛的

//0x38设备地址
root@Linux:/proc# i2cdump -f -y -a 1 0x38
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 00 00 00 40 a8 00 b0 00 00 ff ff ff ff ff ff ff    ...@?.?.........
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
50: ff ff ff 18 18 00 00 00 00 00 00 00 00 ff ff ff    ...??...........
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
80: 1e 00 19 00 00 c8 01 1e 0a 28 00 00 00 00 00 00    ?.?..????(......
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 26    ...............&
a0: 01 30 0d 64 01 00 01 00 88 19 00 00 00 00 00 01    ?0?d?.?.??.....?
b0: 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00    ............?...
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
d0: 00 ff ff 00 00 ff ff ff ff ff 00 00 ff ff ff ff    ................
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
f0: ff ff ff ff ff ff ff ff ff ff ff ff 01 ff ff ff    ............?...

//0x38设备地址,只读取0x50-0x7f寄存器范围的值
root@Linux:/proc# i2cdump -f -y -r 0x50-0x7f 1 0x38
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
50: ff ff ff 18 18 00 00 00 00 00 00 00 00 ff ff ff    ...??...........
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................

通过i2cdump读取寄存器的值有什么用呢,比如在某款TP驱动里,可以看看驱动里面对应寄存器的值是什么含义

#define MAX_ID                          0x0F
#define TOUCH_X_H_POS                   3
#define TOUCH_X_L_POS                   4
#define TOUCH_Y_H_POS                   5
#define TOUCH_Y_L_POS                   6
#define TOUCH_PRE_POS                   7
#define TOUCH_AREA_POS                  8
#define TOUCH_POINT_NUM                 2
#define TOUCH_EVENT_POS                 3
#define TOUCH_ID_POS                    5
#define COORDS_ARR_SIZE                 4

#define TOUCH_DOWN      0
#define TOUCH_UP        1
#define TOUCH_CONTACT   2

event->point_num = buf[TOUCH_POINT_NUM] & 0x0F;
event->au8_touch_event[i] =buf[TOUCH_EVENT_POS + ONE_TCH_LEN * i] >> 6;

可以从上面读取的值,看到FTS_TOUCH_POINT_NUM 0x02的值是00,表示0个手指,FTS_TOUCH_EVENT_POS 0x03的值是40,驱动里面可以看到40>>6之后是1,也就是FTS_TOUCH_UP,然后还可以读取x,y坐标的值

3.3 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 (0x03 - 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

-V:输出当前版本号
-f:强制使用此设备地址,即使此设备地址已经被使用;若不添加此参数,地址可能写失败
-y:指令执行自动 yes,否则会提示确认执行Continue? [Y/n] Y,不加参数y会有很多执行提示,可以帮助判断
-m:添加掩码
-r:回显,显示是否写入成功,要写的值和读取的值
-a:允许使用0x00-0x02和0x78-0x7f之间的地址
I2CBUS:i2c总线编号
CHIP-ADDRESS:设备地址
DATA-ADDRESS:要写入的寄存器地址
VALUE:要写入的值
MODE:数据长度类型

//0x38设备地址,0x04要写入的寄存器,0x03要写入的值,从结果来看没有写入成功
root@Linux:/# i2cset -f -m 0xff -r 1 0x38 0x04 0x03
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will write to device file /dev/i2c-1, chip address 0x38, data address
0x04, data 0x03 (masked), mode byte.
Continue? [Y/n] 
Old value 0x45, write mask 0xff: Will write 0x03 to register 0x04
Continue? [Y/n] 
Warning - data mismatch - wrote 0x03, read back 0x45

3.4 i2cget

i2cget读取设备上寄存器的值,可接受的参数有

Usage: i2cget [-f] [-y] [-a] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]]
  I2CBUS is an integer or an I2C bus name
  ADDRESS is an integer (0x03 - 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)
    Append p for SMBus PEC

-V:输出当前版本号
-f:强制使用此设备地址,即使此设备地址已经被使用;若不添加此参数,地址可能写失败
-y:指令执行自动 yes,否则会提示确认执行Continue? [Y/n] Y,不加参数y会有很多执行提示,可以帮助判断
-a:允许使用0x00-0x02和0x78-0x7f之间的地址
I2CBUS:i2c总线编号
CHIP-ADDRESS:设备地址
DATA-ADDRESS:要读取的寄存器地址
MODE:数据长度类型

//0x38设备地址,0x04要读取的寄存器
root@Linux:/# i2cget -f -y 1 0x38 0x04
0x45

3.5 i2ctransfer

i2ctransfer通过一次传输发送用户定义的I2C消息,用于创建I2C消息并将其作为一次传输合并发送。对于已读消息,已接收缓冲区的内容被打印到stdout,每条已读消息一行

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) 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-

-V:输出当前版本号
-f:强制使用此设备地址,即使此设备地址已经被使用;若不添加此参数,地址可能写失败
-y:指令执行自动 yes,否则会提示确认执行Continue? [Y/n] Y,不加参数y会有很多执行提示,可以帮助判断
-v:启用详细输出
-a:允许使用0x00-0x02和0x78-0x7f之间的地址
I2CBUS:i2c总线编号
DESC:{r|w}<消息长度>[@设备地址]

  • {r|w}指定消息是读还是写
  • <消息长度>指定在此消息中读取或写入的字节数。它被解析为一个无符号的16位整数
  • [@设备地址]指定此消息要访问的芯片的7位地址,并且是整数。如果省略,请重用以前的地址。通常,将阻止0x03-0x77范围之外的地址以及附加了内核驱动程序的地址。通过-f(强制),可以使用所有地址

如果I2C消息是写操作,则随后是带有要写数据的数据块。它由<消息长度> 个字节组成,这些字节可以用十六进制,八进制等的常用前缀进行标记。为了更轻松地轻松创建较大的数据块,该数据字节可以带有一个后缀

=	保持值恒定直到消息结束(即0 =表示0、0、0,...)
+	将值增加1直到消息结束(即0+表示0、1、2,...)
-	将值减1直到消息结束(即0xff-表示0xff,0xfe,0xfd等)
p	将值用作8位伪随机序列的种子(即0p表示0x00、0x50、0xb0等)
//在总线0上,从地址0x50的EEPROM读取偏移量0x64的8个字节
//(第一条消息写入一个字节以将存储器指针设置为0x64,第二条消息从同一芯片读取)
#i2ctransfer 0 w1@0x50 0x64 r8

//对于相同的EEPROM,在偏移量0x42处写入0xff 0xfe ... 0xf0
//(一条写入消息;第一个字节将存储器指针设置为0x42,0xff是第一个数据字节,所有随后的数据字节均减一)
#i2ctransfer 0 w17@0x50 0x42 0xff-
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

i2c-tools安装与使用总结 的相关文章

  • 对于客户端服务器程序,并行接收多个客户端连接请求的最佳方法是什么?

    该程序是在 Linux 上用 C 语言开发的客户端服务器套接字应用程序 每个客户端都连接到一个远程服务器并将其自身记录为在线 在任何给定时间点很可能有多个客户端在线 所有客户端都尝试连接到服务器以将自己记录为在线 忙碌 空闲等 那么服务器如
  • 在 4.x 内核上的 64 位内存中查找系统调用表

    我正在尝试编写一个简单的内核模块来查找 Linux 中的 sys call table 但遇到了一些麻烦 我在这里找到了 32 位 Linux 的基本指南 https memset wordpress com 2011 03 18 sysc
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能
  • 无法使用 tar -cvpzf 解压完整目录

    把我的头敲在这上面 I used tar cvpzf file tar gz压缩一个完整的目录 我将文件移动到另一台服务器 并尝试解压缩复制存档的目录 无法使其发挥作用 bash 3 2 tar xvpzf news tar gz tar
  • C 标准库函数与系统调用。哪个是“open()”?

    I know fopen 在C标准库中 所以我绝对可以调用fopen C 程序中的函数 我感到困惑的是为什么我可以打电话给open 功能也一样 open 应该是系统调用 所以它不是标准库中的C函数 因为我能够成功地调用open 函数 我调用
  • 打破条件变量死锁

    我遇到这样的情况 线程 1 正在等待条件变量 A 该变量应该由线程 2 唤醒 现在线程 2 正在等待条件变量 B 该变量应该由线程 1 唤醒 在我使用的场景中条件变量 我无法避免这样的死锁情况 我检测到循环 死锁 并终止死锁参与者的线程之一
  • 检查上次更改密码的时间[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • Bash 脚本错误 [重复]

    这个问题在这里已经有答案了 我想知道下面的脚本有什么错误 我收到错误为 command not foundh line 1 command not foundh line 2 其连续的 我试过添加 但现在工作请告诉我该怎么做 bin bas
  • 如何从 swagger 文档生成静态 html 文件?

    我创建了一个 Swagger 文档yaml文件位于 api swagger swagger yaml 现在我想分享一个静态 HTML 文档及其定义 但它已在招摇项目 https github com swagger api swagger
  • Tomcat 中的 403 访问被拒绝

    我有以下内容tomcat users xml
  • pip 找不到满足要求的版本 django==2.2.1

    我刚刚将操作系统更改为 linux 并且想安装 django 但我无法安装最新版本的 django 我努力了 pip install django 但是它安装了 django 1 11 11 这不是我需要的 我还将我的 pip 升级到了 1
  • tcmalloc/jemalloc 和内存池之间有什么区别(以及选择的理由)?

    tcmalloc jemalloc是改进的内存分配器 还引入了内存池以更好地分配内存 那么它们之间有什么区别以及在我的应用中如何选择它们呢 这取决于您的程序的要求 如果您的程序有更多的动态内存分配 那么您 需要从可用的分配器中选择一个内存分
  • 如何每周日运行 crontab 作业

    我想弄清楚如何每周周日运行 crontab 作业 我认为以下应该可行 但我不确定我是否理解正确 下面的说法正确吗 5 8 6 这是 crontab 格式的解释 1 Entry Minute when the process will be
  • python 的 fcntl.flock 函数是否提供文件访问的线程级锁定?

    Python 的 fcnt 模块提供了一种名为 flock 1 的方法来证明文件锁定 其描述如下 对文件执行锁定操作op 描述符 fd 文件对象提供 fileno 方法被接受为 出色地 请参阅 Unix 手册集群 2 了解详情 在某些系统上
  • 如何在Linux中获取带有图标的活动应用程序

    我想找到一种方法获取活动应用程序的列表及其名称和图标 实际上 我正在使用此命令来获取所有活动进程 wmctrl lp 示例输出 0x03800002 0 3293 user notebook XdndCollectionWindowImp
  • C:运行系统命令并获取输出? [复制]

    这个问题在这里已经有答案了 我想在 Linux 中运行一个命令并获取其输出内容的返回文本 但我do not想要将此文本打印到屏幕上 有没有比制作临时文件更优雅的方法 你想要 popen http linux die net man 3 po
  • 当下一条(跳过)指令是变量定义时,Shellcode 中的 JMP 意外行为

    Purpose 我试图利用 x86 64 中的 RIP 模式 尽管程序集本身按预期执行 但 shellcode 却没有 问题 简而言之 我尝试过的是这样的 jmp l1 str1 db some string l1 other code l
  • pip install reportlab 错误:命令“x86_64-linux-gnu-gcc”失败,退出状态为 1

    使用 ubuntu 虚拟环境 我尝试安装reportlab 命令是 pip install reportlab 在这个目录下 company2 stefano stefano X550EP htdocs company2 错误是 error
  • Powershell从Linux客户端连接到Windows远程

    我正在尝试从我的 Linux 工作站远程连接到 Windows 计算机 我在 Arch Linux 工作站上安装了 powershell 目前正在尝试连接到主机 在主机上 Enable PSRemoting 然后允许所有主机Set Item
  • Linux 内核中是否使用了扩展指令集(SSE、MMX)?

    好吧 它们带来 至少应该带来 性能的巨大提升 不是吗 所以 我还没有看到任何 Linux 内核源代码 但很想问 它们是否以某种方式被使用 在这种情况下 对于没有此类指令的系统 必须有一些特殊的 代码上限 SSE 和 MMX 指令集在音频 视

随机推荐

  • git上传项目和拉取项目

    一 git上传项目和拉取项目 github创建仓库完成后 默认有两个仓库分别是main和master 默认拉取和上传操作针对于main仓库 是可以更改默认仓库的 至于如何更改默认仓库详情百度 1 在github上创建仓库 之前没有创建仓库的
  • 【猿人学WEB题目专解】猿人学第6题

    据说 看我文章时 关注 点赞 收藏 的 帅哥美女们 心情都会不自觉的好起来 前言 作者简介 大家好我是 user from future 意思是 来自未来的用户 寓意着未来的自己一定很棒 个人主页 点我直达 在这里肯定能找到你想要的 专栏介
  • 安卓Termux搭建web服务器【公网远程手机Android服务器】

    文章目录 概述 1 搭建apache 2 安装cpolar内网穿透 3 公网访问配置 4 固定公网地址 5 添加站点 概述 Termux是一个Android终端仿真应用程序 用于在 Android 手机上搭建一个完整的Linux 环境 能够
  • 前端发送Fetch请求实现流式请求、模拟打字机效果等

    前端需要接收后端的流式返回数据 并实时渲染 普通的xhr请求都是等http协议数据包一次性返回之后才渲染 类似于ChatGPT的Http接口内容类型为text event stream 这种内容类型需要与浏览器建立持久连接并持续监听服务器返
  • java和c++中父类指针(或引用)指向子类对象的一点理解

    c 如果Animal类中存在一个speak 函数 当子类Dog重写了speak 函数后 使用一个父类指针 Animal animal new Dog 指向子类时 子类调用speak 实际上调用的是父类中的speak 函数 地址早绑定 必须将
  • Linux使用HTTP隧道代理代码示例模版

    以下是一个使用HTTP隧道代理的示例代码模板 python import requests def send request url proxy host proxy port 设置代理 proxies http f http proxy
  • Docker 可以共享主机的参数

    命令 docker run it ipc host ubuntu latest bin bash docker run it net host ubuntu latest bin bash docker run it pid host ub
  • Python基础编程练习(1)编写程序,生一个成包含1000个0~100之间的随机整数的列表

    Python基础编程练习 1 编写程序 生一个成包含1000个0 100之间的随机整数的列表 编写程序 生一个成包含1000个0 100之间的随机整数的列表 要求 1 统计每个整数出现的次数 2 将前500个元素升序排列 后500个降序排列
  • ssm(spring+springMVC+Mybatis)框架集成Mongodb

    1 开发环境 JDK 1 6 ssm框架关联jar包 aopalliance jar aspectjrt jar aspectjweaver jar commons beanutils 1 9 2 jar commons codec 1 9
  • 推荐系统公平性论文阅读(六)

    做为最后一篇论文阅读记录 我决定对我目前为止粗读和精读的论文进行一次总结 然后陈述一些个人对该研究领域的见解和想法 论文总结归纳 推荐系统中的偏差和不公平现象是随着推荐算法的诞生就与生俱来的 而不是人为故意产生的 目前我读过的论文中包括的一
  • 弹出页面之间传值

    弹出页面之间传值 假如A页面需要弹出B页面 在比页面关闭时 A页面要拿到B页面的需要值 思路可以认为是 1 在A页面中利用Window Open 方法
  • 页面埋点方案

    前段时间调查了下页面埋点方案 参考http blog csdn net hxyascx article details 53373916 1 在页面加入一段js 该js可以远程加载获取信息的js脚本 2 该脚本创建Image对象 3 暂时脚
  • 48种世间哲学,其中值得借鉴的有10个

    无图片版 1 绝对主义 absolutism 色盲 绝对主义认为在任何一种学说里 某种观点必定是绝对正确或者绝对错误的 点评 没什么可说的 连影视剧都已经放弃了绝对主义 2 荒诞主义 absurdism 恶搞 荒诞主义 是对人生的极端反叛
  • USB触摸屏的驱动

    我们都知道410c没有配套的触摸屏 如果有屏的话 在调试或者其他方面就方便多了 所以我们自己买了一个usb触摸屏 现在让我们看看usb触摸屏的驱动 驱动路经 drivers input touchscreen usbtouchscreen
  • c++实现信号槽

    本人虽不用Qt框架 但对其中的信号槽机制很感兴趣 近期读了csdn几篇关于信号槽的文章 从自身角度理解记录如下 用c 实现信号槽机制 signal slot 信号槽机制的个人理解 信号槽是在两个c 类对象之间建立联系的通道 其中一个对象可称
  • 初探C语言程序样貌

    要点 本文介绍了一个基于C语言的程序 通过详细解释程序中各个语句的功能 可更深入地理解C语言程序的执行过程 掌握C语言编程技巧 核心文章 include
  • 串口中断接收函数

    用来实现读取接收FIFO中的数据 void ReceiveByteUart0 U8 ch U32 i if GetUartCmdFlag 1 return 完成读取 comRbuf UartDataPointer ch 读取一个字节 Hav
  • 哥德巴赫猜想(C语言)

    洛谷 P1304 哥德巴赫猜想 include
  • 一个实现obsidian三端同步的思路

    工具生产出来是用来提高效率 不是用来折腾的 之前用ob 多端同步很麻烦就没再用 后来的notion 用了一段时间 那个网络真的太烦人了 又用回了ob 想到这个同步的思路 用了之后还是ob香啊 思路 ios Android Windows 在
  • i2c-tools安装与使用总结

    1 概述 最近调试了挺多款TP驱动 对I2C设备有了一定的了解 本篇文章主要讲解i2c tools在linux和android中的安装编译和使用 i2c tools软件包包含用于Linux的一组不同的I2C工具 总线探测工具 chip du