Почему функция i2c_smbus недоступна? (I2C — встроенный Linux)

Есть много ссылок на использование i2c_smbus_ функции при разработке встроенного программного обеспечения Linux для связи по шине I2C. когда 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. Использование I2C из пространства пользователя в Linux
  2. Связь I2C из Linux Userspace — Часть II
  3. Интерфейс разработчика I2C

7

Решение

Потому что вы используете неправильный заголовочный файл для вашего приложения.

Если вы видите 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;
}
11

Другие решения

Я столкнулся с этим сегодня. 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 _…, чтобы обойти проблему.

2

От документация по ядру i2c Linux:

Обратите внимание, что существует два файла с именем «i2c-dev.h», один распространяется с ядром Linux и предназначен для включения из кода драйвера ядра, другой — с i2c-tools и предназначен для включены из пользовательских программ. Вы, очевидно, хотите второй здесь.

Так что вам нужно включить i2c-dev.h из инструментов i2c, а не из ядра Linux.

1