Может создавать только 1 устройство типа generic-uio
Я пытаюсь выставить прерывания в пространстве пользователя с помощью драйвера uio_pdrv_genirq. Однако я могу создать только одно устройство в devicetree, все последующие устройства не пройдут проверку. Система представляет собой zynq-7000, а версия ядра - 3.9.0-xilinx.
Девичник:
/ {
...
amba@0 {
...
gic: intc@f8f01000 {
interrupt-controller;
compatible = "arm,cortex-a9-gic";
#interrupt-cells = <3>;
reg = <0xf8f01000 0x1000>,
<0xf8f00100 0x0100>;
};
interrupt_91@0x43C90000 {
compatible = "generic-uio";
reg = < 0x43C90000 0x1000 >;
interrupts = < 0 59 1 >; //add 32 to get the interrupt number
interrupt-parent = <&gic>;
} ;
interrupter_90@0x43CA0000 {
compatible = "generic-uio";
reg = < 0x43CA0000 0x1000 >;
interrupts = < 0 58 1 >; //add 32 to get the interrupt number
interrupt-parent = <&gic>;
} ;
...
};
вывод dmesg:
dmesg | grep uio
uio_pdrv_genirq 43ca0000.interrupter_90: unable to register uio device
uio_pdrv_genirq: probe of 43ca0000.interrupter_90 failed with error 1
Конфигурация ядра:
CONFIG_UIO=y
# CONFIG_UIO_CIF is not set
CONFIG_UIO_PDRV_GENIRQ=y
# CONFIG_UIO_DMEM_GENIRQ is not set
# CONFIG_UIO_AEC is not set
# CONFIG_UIO_SERCOS3 is not set
# CONFIG_UIO_PCI_GENERIC is not set
# CONFIG_UIO_NETX is not set
Я уверен, что раньше я работал над Zedboard, я понятия не имею, в чем проблема может быть здесь.
1 ответ
Хорошо, это оказалось проблемой в исходном коде ядра, который я использовал.
Линии:
if (ret)
goto err_get_minor;
в драйверах / uio / uio.c и в строках:
if (ret) {
dev_err(&pdev->dev, "unable to register uio device\n");
goto bad1;
}
в drivers/uio/uio_pdrv_genirq.c оба должны быть изменены так, чтобы оператор if читал if (ret < 0)
,
Причина этого заключается в том, что uio_get_minor
Функция (чье возвращаемое значение ret они используют) возвращает назначенный младший номер. Это 0, 1, 2, ... и т. Д. Понятно, что первое устройство (младший идентификатор = 0) зарегистрировано нормально, но второе устройство (младший идентификатор = 1) вышло из строя. Это объясняет сообщение об ошибке "ошибка с ошибкой 1", которая была второстепенным идентификатором, а не EPERM, как я изначально предполагал.
Я использую репозиторий https://github.com/Trenz-Electronic/linux-te-3.9 для дальнейшего использования.
РЕДАКТИРОВАТЬ: На самом деле, такая же проблема существует в основном ядре, я выложу патч.