字符设备:选择设备读/写
问题描述:
我发现了良好的代码作为例如用于一个字符设备模块:https://github.com/euspectre/kedr/blob/master/sources/examples/sample_target/cfake.c字符设备:选择设备读/写
我不修改的代码和我测试。我获得了两个设备(/ dev/cfake0和/ dev/cfake1),但我想了解一些内容。
有两个设备导出,但只有一个读取功能,如何指定哪个读取功能用于每个设备(如果实现了两个读取功能)?
最后我想在同一个模块上有两个字符设备(一个用于I2C通信,另一个用于SPI),模块和用户空间需要通信,所以我需要导出它们两个。
答
你有你的文件中的每个调用一个函数:
- 开放
- 阅读
- 写
- 关闭
- ...
但是,所有的功能都一个struct file
作为参数。
该结构 - 包含有关文件的信息 - 由模块在内核中加载时创建。 (请参阅static int __init cfake_init_module(void);
函数)。
最后,我想有两个字符设备(一个用于I2C通信,另一个用于SPI)
你可以有东西做到这样:
在这个例子中你给,每个文件创建一个minor device number
(见cfake_construct_device()
)。您可以使用此编号来选择设备是SPI还是I2C设备。
你read
功能可能看起来像:
ssize_t
cfake_read(struct file *filp, char __user *buf, size_t count,
loff_t *f_pos)
{
/* reading minor device number */
unsigned int mn = iminor(filp->f_inode);
/* select specialized function to use */
if (0 == mn)
return cfake_read_i2c(filp, buf, count, f_pos);
else
return cfake_read_spi(filp, buf, count, f_pos);
}
说,我不认为这是有一个模块(除非这两个设备必须共享数据)在两个不同的协议是个好主意:在模块崩溃,您将失去两个通信通道,并且模块将难以调试。
感谢您的提示,我知道这不是一个好的理想,但我有一个FPGA在SPI通信,我需要共享数据到一个摄像头,在I2C通信。 – PierreOlivier