为什么i2c_smbus功能不可用?(I2C - 嵌入式Linux)

Mah*_*ena 9 c c++ arm i2c embedded-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开发接口

Yas*_*oji 13

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

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

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

sudo apt-get install libi2c-dev
Run Code Online (Sandbox Code Playgroud)

和使用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;
}
Run Code Online (Sandbox Code Playgroud)