3

uio_pdrv_genirq ドライバーを使用して、割り込みをユーザー空間に公開しようとしています。ただし、デバイス ツリーで 1 つのデバイスしかインスタンス化できず、後続のデバイスはすべてプローブに失敗します。システムは 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 でこれを機能させたと確信していますが、ここで何が問題なのかわかりません。

4

1 に答える 1

4

わかりました、これは私が使用していたカーネル ソースの問題であることが判明しました。

台詞:

if (ret)
    goto err_get_minor;

drivers/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、... などです。最初のデバイス (マイナー ID = 0) は正常に登録されましたが、2 番目のデバイス (マイナー ID = 1) が失敗したことは明らかです。これは、最初に想定した EPERM ではなく、マイナー ID であった「エラー 1 で失敗しました」というエラー メッセージを説明しています。

私が使用しているリポジトリは、今後の参考のためにhttps://github.com/Trenz-Electronic/linux-te-3.9です。

編集: 実際には、メインライン カーネルにも同じ問題が存在します。パッチを投稿します。

于 2015-02-18T05:17:01.590 に答える