как использовать драйвер i2c в пространстве ядра

Я написал символьный драйвер для управления моим встроенным оборудованием с помощью моего приложения. В моем драйвере есть функция для отправки команды на устройство I2C, которое подключено к моему встроенному устройству.

в командной строке я могу отправить на свое устройство следующий код:

i2cset  -y 0 0x2c 0x00 0x05

Я хочу сделать то же самое в пространстве ядра в моем драйвере, но я не нашел образца, все, что у меня было, было в пространстве пользователя, как я могу сделать это в пространстве ядра?

редактировать:

Я знаю, что с помощью функции « i2c_master_send » или « i2c_smbus_read_byte » я могу отправлять данные на устройства i2c, но эта функция получает структуру под названием « i2c_client », я не знаю, как мне предположить, что эту структуру можно заполнить для отправки данных. Это может быть действительно глупо, но я не мог понять, как мне заполнить эту структуру.

# kernel i2c
Источник
  • 1
    Вам нужно понять, как писать драйверы устройств для Linux в целом, а затем понять специфику подсистемы I2C в ядре Linux, описанную вkernel.org/doc/html/latest/i2c/writing-clients.html
  • 0
    Можете ли вы поделиться подробностями об оборудовании? Это индивидуальное или массовое производство? Есть ссылки на таблицы? Вполне возможно, что драйвер уже есть, если он серийный.
  • 0
    LucaCeresoli и 0andriy благодарим вас за ответ, я уже читал упомянутую вами статью, но не понял, как мне заполнить i2c_client, и нет описания того, как это сделать. мое устройство находится на i2c0, и я могу помещать данные прямо на него. так что нет необходимости использовать какой-либо драйвер, я полагаю ... Я видел некоторые драйверы для устройств i2c, в этих драйверах функции, о которых я упоминал ранее, использовались для отправки данных на шину i2c, но также не описывали, как заполнять структуру клиента ...
  • 0
    На самом деле использование встроенного в ядро драйвера - это правильно.
Codelisting
за -1 против
Лучший ответ

Я достиг своей цели с помощью следующего кода в моем драйвере:

**** Пожалуйста, прочтите мою правку перед использованием этого кода *****

#define VOL1_CHIP_ADDRESS 0x2c
#define VOL1_DATA_ADDRESS 0

struct i2c_client *clientstr;
struct file * fp;

...

mm_segment_t oldfs;

oldfs = get_fs();
set_fs(KERNEL_DS);
fp = filp_open("/dev/i2c-0",O_RDWR,0);
clientstr = (struct i2c_client *)fp->private_data;
clientstr->addr=VOL1_CHIP_ADDRESS;
i2c_smbus_write_byte_data(clientstr,VOL1_DATA_ADDRESS,0x05);
filp_close(fp,NULL);
set_fs(oldfs);

РЕДАКТИРОВАТЬ:

Итак, я сделал то, что хотел в ядре, открыв файл в пространстве ядра, несмотря на любые предложения не делать этого.

Но мне нужно было открыть файл в модуле ядра ...

Так почему же все сказали: не открывайте файлы пользовательского пространства в ядре? В этих двух статьях есть несколько причин не использовать файлы в ядре, эта ссылка и эта ссылка .

есть несколько причин, например: 1 - модуль ядра может потерять процессор в любой момент, а файл, открытый ядром, может закрыться.

2- Я не совсем уверен в этом, но они сказали, что файлы должны иметь процесс, чтобы оставаться открытыми, но сам модуль ядра не является процессом (возможно, я ошибаюсь!).

3- Если при работе с файлами (открытие / закрытие / чтение / запись) происходит какая-либо ошибка, модуль ядра не может ее обработать и вызывает панику ядра ...

У меня было много проблем с ядром только при открытии и закрытии файла, с которым я хотел работать. Это некоторые из причин, по которым вы не должны использовать файлы в модулях ядра. Как уже было сказано ранее: «Если вам нужно использовать файлы в модуле ядра, вы, вероятно, сделали что-то не так в своем коде!»

  • 0
    @ 0andriy, ты сказал, что это неправильно ... спасибо за помощь и время. теперь я точно знаю, почему это неправильный подход.
  • 0
    Вы храните в секрете оборудование, чем мы можем здесь помочь, кроме как указать на неправильный подход? Я уже говорил вам, что вам нужно использовать драйвер в ядре для вашего конкретного оборудования. Приведенный выше код - это не то, что называется драйвером клиента I²C, это ... см. Первый комментарий.
  • 0
    О, мальчик, я могу увидеть сарказм там, где на самом деле ничего не применялось ... Извини.
Codelisting
Популярные категории
На заметку программисту