您对文件的每个调用都有一个函数:
但是所有函数都有一个struct file
as 参数。
这个包含文件信息的结构是由模块在内核加载时创建的。(见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);
}
话虽如此,我认为在一个模块中有两种不同的协议不是一个好主意(除非两个设备必须共享数据):在模块崩溃时,您将失去两个通信通道,并且模块将难以调试.