我想使用uio_pdrv_genirq
Raspberry 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 在模块加载时自动应用您的设置。