1

Zynq AXI DMA 用のデバイス固有の DMA ドライバーを作成しています。ドライバーは実際にはラッパー ドライバーであり、次のように DMA エンジン ドライバー フレームワークの下でザイリンクス DMA ドライバーを使用します。

  +------------------+
  | | ラッパードライバー |
  +------------------+
  | | DMA フレームワーク |
  +------------------+
  | | ザイリンクス DMA ドライバー|
  +------------------+
  + カーネル +
  +------------------+

転送完了には割り込み 61 を使用し、受信完了には 62 を使用します。ザイリンクス DMA ドライバーの割り込みハンドラーが正しくインストールされています (/proc/interrupts を確認しました)。ただし、次のように表示することで、ドライバーが割り込みを適切に処理していないようです。

ここに画像の説明を入力

/proc/interrupts を確認しました。IRQ62 は扱いません。割り込みが登録されているコードは次のとおりです。

0986     /* find the IRQ line, if it exists in the device tree */
0987     chan->irq = irq_of_parse_and_map(node, 0);
0988     err = devm_request_irq(xdev->dev, chan->irq, dma_intr_handler,
0989                    IRQF_SHARED,
0990                    "xilinx-dma-controller", chan);

cat /proc/interrupt の出力は次のとおりです。

ここに画像の説明を入力

2 つの質問があります。

1) ザイリンクス DMA ドライバーの割り込みハンドラーのみをインストールし、ラッパー ドライバーはインストールしない場合、ラッパー ドライバーを char デバイスとして使用すると、ザイリンクス DMA ドライバーで割り込みが処理されません。

2) その場合、ザイリンクス DMA ドライバーで割り込みを処理するにはどうすればよいですか。「irqpoll」が唯一の解決策ですか? ポーリングではなく直接割り込み処理と比較して、パフォーマンスの問題はありますか?

4

1 に答える 1

0

デバイスツリー、より正確にはファイルが良くありませんpl.dtsi。私のplファイルは次のようになります:

amba_pl: amba_pl {
    #address-cells = <1>;
    #size-cells = <1>;
    compatible = "simple-bus";
    ranges ;
    axi_dma_0: dma@40400000 {
        compatible = "xlnx,axi-dma";
        interrupt-parent = <&intc>;
        interrupts = <0 29 4 0 30 4>;
        reg = <0x40400000 0x10000>;
        xlnx,include-sg ;
        dma-channel@40400000 {
            compatible = "xlnx,axi-dma-mm2s-channel";
            interrupts = <0 29 4>;
            xlnx,datawidth = <0x20>;
            xlnx,device-id = <0x0>;
        };
        dma-channel@40400030 {
            compatible = "xlnx,axi-dma-s2mm-channel";
            interrupts = <0 30 4>;
            xlnx,datawidth = <0x20>;
            xlnx,device-id = <0x0>;
        };
    };

};
于 2015-06-08T13:50:39.630 に答える