Linux uio_pdrv_genirq 模块未创建设备

Linux uio_pdrv_genirq 模块未创建设备

我想使用uio_pdrv_genirqRaspberry Pi 4 Model B 上的驱动程序将一些 IRQ 公开给用户空间。但是,我遇到了一些问题,即设备/dev/uio0未创建(在第一次模块加载时)。

我使用的是内核为 5.2.2-v7l+ 的 raspbian,但是我从内核 4.19.57-v7l+ 开始,结果相同。

我已经准备好设备树覆盖:

/dts-v1/;
/plugin/;

/ {
        fragment@0 {
                target = <&gpio>;
                __overlay__ {
                        mfrc522_uio_pins: mfrc522_uio_pins {
                                brcm,pins = <4>;
                                brcm,function = <0>; //<BCM2835_FSEL_GPIO_IN>;
                                brcm,pull = <0>; //<BCM2835_PUD_OFF>;
                        };
                };
        };

        fragment@1 {
                target-path = "/";
                __overlay__ {
                        mfrc522_uio: mfrc522_uio {
                                compatible = "mfrc522-uio,generic-uio";
                                interrupt-parent = <&gpio>;
                                interrupts = <4 1>; // IRQ_TYPE_EDGE_RISING
                                pinctrl-names = "default";
                                pinctrl-0 = <&mfrc522_uio_pins>;
                                status = "okay";
                        };
                };
        };

        __overrides__ {
                gpiopin = <&mfrc522_uio_pins>,"brcm,pins:0",
                        <&mfrc522_uio>,"interrupts:0";
        };
};

编译者:

dtc -@ -I dts -O dtb -o mfrc522-uio-overlay.dt{bo,s}

并加载:

sudo dtoverlay mfrc522-uio-overlay.dtbo

模块加载后:

sudo modprobe uio_pdrv_genirq of_id="mfrc522-uio,generic-uio"

应该/dev/uio0出现,但是它才不是. 内核日志没有显示有关此情况的任何信息。

解决方法是删除模块:

sudo modprobe -r uio_pdrv_genirq

并再次加载。然后设备将出现在 中/dev

uio_pdrv_genirq如果我使用内置驱动的内核并添加到 bootargs 中,则没有问题uio_pdrv_genirq.of_id="mfrc522-uio,generic-uio"。但是,出于某些原因,我更喜欢使用发行版的预编译内核。

问题是:为什么我必须重新加载uio_pdrv_genirq模块才能获取/dev/uio0设备,以及如何解决此行为?

答案1

uio_pdrv_genirq 驱动程序中的空白 of_id 会产生意外的副作用,即导致用户空间将该模块视为每个平台设备的潜在匹配,因此 uio_pdrv_genirq 模块(如果存在)将始终在启动时自动加载。而且由于该模块已加载,尝试使用不同的设置对其进行 modprobe 不会产生任何效果(除非您先卸载该模块)。

解决方案是创建一个/etc/modprobe.d/uio_pdrv_genirq.conf包含

options uio_pdrv_genirq of_id=mfrc522-uio,generic-uio

这将使得 modprobe 在模块加载时自动应用您的设置。

相关内容