ZYNQ Linuxが動作するPS部への割り込み

ZYNQはPL部とPS部に分かれており, PL(Programmable Logic)部はFPGA,
PS(Processing System)部はARMのCPUコアです.
PL部のモジュールからPS部のCPUに対して割り込みをかける必要が出てきたのですが
どのような接続と記述をすればいいのか分かりづらかったので備忘録としてメモ.

今回は以下の状況を想定しています.

  • Linuxを動かしているZynq-7000
  • デバイスツリーにPLのモジュールを記述

割り込み信号の必要性

基本的にはPLとPS部はAXIバス経由で通信をしています.
PS->PLに関してはPL側で対処すれば即応答でき(るはず)ますが,
PL->PSではPS側のLinuxに認識してもらうためにも別途割り込み信号を入力します.

今回はVirtIOをデバイスツリーに記述してLinux側から
認識してもらうための記述中に割り込み信号が必要となりました.

Virtual I/O Device (VIRTIO) Version 1.1 / 4.2.1 MMIO Device Discovery

// EXAMPLE: virtio_block device taking 512 bytes at 0x1e000, interrupt 42. 
virtio_block@1e000 { 
        compatible = "virtio,mmio"; 
        reg = <0x1e000 0x200>; 
        interrupts = <42>; 
}

PS の割り込み端子

PS部の割り込みはIRQ_F2P[0:0]という端子です.
表示上は[0:0]ですが接続したワイヤに合わせて自動で拡張されるので気にする必要はありません.

デフォルトでは表示されないのでZYNQをダブルクリックして詳細設定画面を表示します.
Interrupts -> Fabric Interrupts -> PL-PS Interrupt Ports -> IRQ_F2P[15:0]
チェックを入れると有効化されます.

割り込み信号とデバイスツリー

割り込み信号の番号はIDに表示されている[91:84], [68:61]が
元になるのですがそのままでは使えません.
GIC(General Interrupt Controller)と呼ばれるARM内部の
割り込みコントローラに対応する番号は32を引いたものになるため
IRQ_F2P[0:0]の[0]に接続した場合の割り込み番号は29となります.

デバイスツリーの記述は以下のファイルを編集しました.

<Petalinux Dir>/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi

割り込みコントローラはintcです.
割り込み信号の詳細はARM Generic Interrupt Controllerを参考にしました.
1番目は割り込み種別, 2番目は割り込み番号, 3番目は割り込み信号のトリガーとなっています.
以下は例として記述しました.

&userdev_0 {
	compatible = "virtio,mmio";
	reg = <0x7aa00000 0x10000>;
	interrupt-parent = <&intc>;
	interrupts = <0 29 1>;
};

まとめ

ZYNQで割り込みを使用するためには以下の2点に気をつけることが必要です.

  • 設定画面でIRQ_F2P[0:0]を有効化する
  • デバイスツリーではIRQ_F2P[0:0]のポート番号から32を引いた番号を指定する

参考文献

ZYBOの割り込みで時間管理してみた

コメント

タイトルとURLをコピーしました