为什么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。
如何解决这个问题?
研究参考
- 在Linux中使用来自用户空间的I2C
- Linux用户空间的I2C通信 – 第二部分
- 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内核。