为什么i2c_smbusfunction不可用? (I2C – 嵌入式Linux)

在开发嵌入式Linux软件以在I2C总线上进行通信时,有许多参考使用i2c_smbus_函数。 当在软件项目中引用i2c_smbus函数(例如i2c_smbus_read_word_data)时, ARM8处理器错误(如“ i2c_smbus_read_word_data”)未在此范围内声明,则在编译时生成。

对以下头文件的研究表明缺少大多数i2c_smbus函数定义。

  • /usr/arm-linux-gnueabi/include/linux/i2c.h
  • /usr/arm-linux-gnueabi/include/linux/i2c-dev.h

同样在以下参考i2c.h文件中定义了所有i2c_smbus。

如何解决这个问题?

研究参考

  1. 在Linux中使用来自用户空间的I2C
  2. Linux用户空间的I2C通信 – 第二部分
  3. I2C开发接口

因为您的应用程序使用了错误的头文件。

如果在标题中看到函数i2c_smbus_read_word_data()extern ,它是内核的头文件,但不适用于您的应用程序 。 Linux内核有i2c_smbus_read_word_data()和其他i2c smbus函数供内部使用。 但它们是a)不是系统调用,或b)无法从您的应用程序访问。

相反, 从lm-sensors获取i2c-tools并安装它。 如果你正在使用Debian,那就是

 sudo apt-get install libi2c-dev 

并使用i2c_smbus_read_word_data()或它们提供的任何其他接口。 i2c-dev是一个仅包含头的包,意味着没有要链接的库。 所有函数都是使用ioctl()定义的内联函数。

例如)

 static inline __s32 i2c_smbus_access(int file, char read_write, __u8 command, int size, union i2c_smbus_data *data) { struct i2c_smbus_ioctl_data args; args.read_write = read_write; args.command = command; args.size = size; args.data = data; return ioctl(file,I2C_SMBUS,&args); } : static inline __s32 i2c_smbus_read_word_data(int file, __u8 command) { union i2c_smbus_data data; if (i2c_smbus_access(file,I2C_SMBUS_READ,command, I2C_SMBUS_WORD_DATA,&data)) return -1; else return 0x0FFFF & data.word; } 

我今天碰到了这个。 i2c_smbus_*函数定义如下:

 /usr/include/linux/i2c-dev.h 

…但是当我尝试在较旧版本的Ubuntu上为ARM交叉编译时,我遇到了以下错误:

 i2c_smbus_read_block_data was not declared in this scope 

事实certificate,函数在等效的ARM特定位置中定义:

 /usr/arm-linux-gnueabi/include/linux/i2c-dev.h 

交叉编译时,第二个较旧的头文件是使用的文件。 不得不在本地重新声明一些内联i2c_smbus _…函数来解决问题。

从i2c Linux内核文档 :

请注意,有两个名为“i2c-dev.h”的文件,其中一个是随Linux内核一起分发的,应该包含在内核驱动程序代码中,另一个是随i2c-tools一起分发的,意思是包含在用户空间程序中。 你显然想要第二个。

所以你需要在i2c-dev.h包含i2c-dev.h而不是Linux内核。