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函数定义.
同样在以下参考i2c.h文件中定义了所有i2c_smbus.
如何解决这个问题?
研究参考
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)