Я достиг своей цели с помощью следующего кода в моем драйвере:
**** Пожалуйста, прочитайте мою редакцию перед использованием этого кода *****
#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. ..
Я испытал много паники ядра только при открытии и закрытии файла, с которым я хотел работать. Это некоторые из причин, по которым вам не следует использовать файлы в модулях ядра, поэтому, как уже говорилось в каждом тексте: «Если вам нужно использовать файлы в модуле ядра, вы, вероятно, сделали что-то не так в своем коде!»