gpt4 book ai didi

字符设备 : choose the device to read/write

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:03 24 4
gpt4 key购买 nike

我找到了一个很好的代码作为字符设备模块的例子: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); 函数)。

In the end I would like to have two character devices (one for I2C communication, another one for SPI)

你可以让这些东西这样做:

在您提供的示例中,每个文件都是使用次设备编号 创建的(参见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);
}

也就是说,我不认为在一个模块中使用两种不同的协议(protocol)是个好主意(除非这两个设备必须共享数据):在模块崩溃时,您将失去两个通信 channel ,并且模块将难以调试。

关于字符设备 : choose the device to read/write,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44655105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com