Raspberry PiにおけるBASIC IRQペンディングレジスタの構成

Raspberry Piの割り込みでは、割り込みハンドラの中でペンディングレジスタを調べて適切な処理をする必要があります。
前回書いたように、ペンディングレジスタは各ビットが「未処理の割り込み要因」を表しています。
特に、BASICペンディングレジスタは主要な割り込み要因を集めてありますので、ここでその内容をまとめておきます。

CPUから見ると、割り込みというのは入力端子の一種です。リセットボタンがつながるリセット端子がその代表的なものです。
Raspberry Piでは32ビットのディングレジスタが3つありますが、各レジスタの1ビットが、割り込み信号線1本のHigh/Lowの状態を反映しています。

下の図は、左側が割り込み信号線で、それぞれの信号線が異なる割り込み要因を表しています。
マニュアル p110)

pending-regs.png

図は右側の3つのレジスタと左側の割り込み信号線の関係を表しています。
上から32本(IRQ32-63)はGPUからの割り込み信号で、その状態はIRQペンディングレジスタ2(図ではIRQ1となっていますが、マニュアルのこれ以降のページではIRQ2となっています)に反映されます。
この中の何本か(A few selected GPU IRQs)は、同時にBASICペンディングレジスタにも入力されていますので、どちらのレジスタからも状態を確認できます。

IRQ32-63のうち、BASICペンディングレジスタに入力されていない信号全てのORを取ったものが、BASICペンディングレジスタに入力されています。
これにより、BASICペンディングレジスタでは「IRQペンディングレジスタ2のどれかに割り込みがあったこと」を知ることができます。

次の32本(IRQ0-31)も同様に、Video Coreからの割り込み信号で、その状態はIRQペンディングレジスタ1に反映されます。
またこれらの信号全てのORを取ったものが、BASICペンディングレジスタに入力されています。

そしてBASICペンディングレジスタですが、マニュアルによると

「A few selected GPU IRQs」:10本(bit10-19)
IRQペンディングレジスタ2の全信号のOR(bit9)
IRQペンディングレジスタ1の全信号のOR(bit8)
ARM Timerなど8つの割り込み信号(bit0-7)

が入力信号となっています。

前回紹介したLinuxカーネルのソースコードを見ると、「A few selected GPU IRQs」の具体的な中身がわかります。
また、実際には10本ではなく、11本(bit10-20)がGPU IRQの信号となっているようです。
マニュアル(p114)の情報と、Linuxのカーネルソースコードの情報を合わせると、BASICペンディングレジスタの各ビットの意味は以下のようになっています(赤字はマニュアルには無い情報です)。

basic-pending-reg.png

I2CやSPIなど主要な入出力関係の割り込みは、このレジスタだけで把握できそうです。
なおbit 20の「ARASANSDIO」は、Arasan社製SDIOコントローラということで、マイクロSDカードで使用していないもう一つのSDIOインタフェース(GPIO22-27)からの割り込みです。

コメント