我制作了一个作为工业 I/O (IIO) “生产者”的驱动程序(它提供 ADC 读数)。我已经将它编译为一个模块。我有另一个驱动程序,它是一个 IIO“消费者”,它使用来自第一个驱动程序的 ADC 输入(它调用iio_channel_get()
它的probe()
函数)。
这两个驱动程序都编译为模块,并且可以很好地协同工作。但是我发现rmmod
第一个驱动程序是可能的,即使加载了第二个驱动程序并因此使用它的 ADC,这似乎令人惊讶,因为它被第二个驱动程序“使用”。最好是防止在第二个驱动程序使用它时卸载第一个驱动程序。也就是说,在第二个驱动程序调用时增加第一个模块的值refcnt
,并在第二个驱动程序调用时iio_channel_get()
递减值。这在概念上类似于 char 设备的模块,每个打开它的进程都会增加它的值,因此在所有进程都关闭打开的 char 设备文件之前不能卸载它。refcnt
iio_channel_release()
refcnt
但是我看不到为 IIO 生产者实现此目的的方法(例如,我看不到任何可能在第二个驱动程序调用时调用的 ops 函数iio_channel_get()
)。那怎么可能呢?
请注意,这不是经典意义上的模块依赖,其中一个模块依赖于另一个模块提供的函数/符号。这是一个 IIO 消费者/生产者依赖项。从一个到另一个的依赖关系是特定于硬件的,并且在硬件的设备树中指定。在不同的硬件上,消费者/生产者依赖可能涉及不同的 IIO 生产者模块。