2017-06-20 75 views
1

我发现了良好的代码作为例如用于一个字符设备模块:https://github.com/euspectre/kedr/blob/master/sources/examples/sample_target/cfake.c字符设备:选择设备读/写

我不修改的代码和我测试。我获得了两个设备(/ dev/cfake0和/ dev/cfake1),但我想了解一些内容。

有两个设备导出,但只有一个读取功能,如何指定哪个读取功能用于每个设备(如果实现了两个读取功能)?

最后我想在同一个模块上有两个字符设备(一个用于I2C通信,另一个用于SPI),模块和用户空间需要通信,所以我需要导出它们两个。

回答

2

你有你的文件中的每个调用一个函数:

  • 开放
  • 阅读
  • 关闭
  • ...

但是,所有的功能都一个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); 
} 

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

+0

感谢您的提示,我知道这不是一个好的理想,但我有一个FPGA在SPI通信,我需要共享数据到一个摄像头,在I2C通信。 – PierreOlivier