Есть много ссылок на использование i2c_smbus_ функции при разработке встроенного программного обеспечения Linux для связи по шине I2C. когда i2c_smbus такие функции, как i2c_smbus_read_word_data упоминаются в программном проекте для ошибок процессора ARM8, таких как ‘i2c_smbus_read_word_data ’не был объявлен в этой области генерируются при компиляции.
Расследование следующих заголовочных файлов указывает на отсутствие большинства i2c_smbus определение функции.
Также в этой следующей ссылке i2c.h Файл имеет все определенные i2c_smbus.
Как можно решить эту проблему?
Научные ссылки
Потому что вы используете неправильный заголовочный файл для вашего приложения.
Если вы видите extern
на функции i2c_smbus_read_word_data()
в вашем заголовке, это файл заголовка для вашего ядро, но не для вашего приложение. Ядро Linux имеет i2c_smbus_read_word_data()
и другие функции i2c smbus для его внутреннего использования. Но они а) не являются системными вызовами или б) не доступны из вашего приложения.
Вместо этого получите i2c-инструменты от lm-сенсоров и установите его. Если вы используете 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
…но когда я попытался сделать кросс-компиляцию для ARM в более старой версии Ubuntu, я столкнулся с такими ошибками:
i2c_smbus_read_block_data was not declared in this scope
Оказывается, функции не определяется в эквивалентном специфичном для ARM месте:
/usr/arm-linux-gnueabi/include/linux/i2c-dev.h
При кросс-компиляции используется этот второй более старый заголовочный файл. Пришлось повторно объявить локально несколько встроенных функций i2c_smbus _…, чтобы обойти проблему.
От документация по ядру i2c Linux:
Обратите внимание, что существует два файла с именем «i2c-dev.h», один распространяется с ядром Linux и предназначен для включения из кода драйвера ядра, другой — с i2c-tools и предназначен для включены из пользовательских программ. Вы, очевидно, хотите второй здесь.
Так что вам нужно включить i2c-dev.h
из инструментов i2c, а не из ядра Linux.