как использовать драйвер i2 c в пространстве ядра - PullRequest
0 голосов
/ 20 апреля 2020

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

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

i2cset  -y 0 0x2c 0x00 0x05

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

edit:

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

1 Ответ

0 голосов
/ 25 апреля 2020

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

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

#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- Если во время работы с файлами возникает какая-либо ошибка (открытие / закрытие / чтение / запись), модуль ядра не может ее обработать и вызывает ошибку ядра c. ..

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

...