如何在内核中使用 i2c 驱动 space

how to use i2c driver in kernel space

我已经编写了一个字符驱动程序来通过我的应用程序控制我的嵌入式硬件,在我的驱动程序中有一个功能可以向连接到我的嵌入式设备的 I2C 设备发送命令。

在命令行中,我可以将以下代码发送到我的设备:

i2cset  -y 0 0x2c 0x00 0x05

我想在驱动程序的内核 space 中做同样的事情,但我没有找到示例,我得到的只是在用户 space 中,我如何在内核中做到这一点 space?

编辑:

我知道用“i2c_master_send" or "i2c_smbus_read_byte" function I can send data to i2c devices, bu this function gets a structure called "i2c_client”,我不知道应该如何填充这个结构来发送数据。这可能真的很愚蠢,但我不知道如何填充这个结构。

我已经通过驱动程序中的以下代码实现了我的目标:

****请在使用此代码前阅读我的编辑*****

#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);

编辑:

所以我在内核中做了我想做的,在内核中打开了一个文件space,不管任何建议不要这样做。

但是我需要在内核模块中打开一个文件...

那么为什么每个人都说不要在内核中打开用户 space 文件? 在这两篇文章中有一些不在内核中使用文件的原因,this link and this link.

有一些原因,例如: 1- 内核模块可能随时丢失 CPU 并且内核打开的文件可能会关闭。

2- 我对此不太确定,但他们说文件需要有一个进程才能保持打开状态,但内核模块本身不是一个进程(也许我错了!)。

3- 如果在处理文件时发生任何错误(open/close/read/write),内核模块将无法处理它并导致内核崩溃...

只有在打开和关闭我想要使用的文件时,我才经历过很多内核恐慌。这些是你不应该在内核模块中使用文件的一些原因,正如每个人之前所说 "If you need to use files in kernel module you probably did something wrong in your code!"