[Armadillo:06044] Re: Armadillo-300 の拡張バス EXT_INT 信号からの割込み

Masahiro Hanada email@hidden
2010年 10月 29日 (金) 15:50:06 JST


花田です。

At 29 Oct 2010 11:29:27 +0900 email@hidden wrote:
> 割込み信号の入力には拡張バスCON12のピン46、
> EXT_INT(拡張バス割込み)を使用しています。
> このピンはNS9750のgpio[11]ピンに接続されており、
> 同ピンにはExt IRQ2機能があることを確認しました。

その通りです。
調査されていた通り、このピンは初期状態でEXT2割り込みとして
使えるように初期化されています。
こうなっていれば最早GPIOではないので、Linuxでの割り込みとして
有効化してあげるだけです。

簡単に、使えることを確認してみました。
適当なドライバを作って、以下のように記述します。

static irqreturn_t
ns9750_ext2_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
	return IRQ_HANDLED;
}

# ↓ドライバ初期化関数内でコール
	request_irq(IRQ_EXT_2, ns9750_ext2_interrupt, SA_INTERRUPT, "EXT2",
		    NULL);

ns9750_ext2_interruptが割り込みハンドラ(上記は何もしないで戻るだけ)で、
それをドライバ初期化時に目的のIRQ番号に結び付けているだけです。

これ素のArmadillo-300で使うと、ドライバの初期化(request_irqコール)時に
カーネルが停止(割り込み入りっぱなし状態)になります。
Ext.BUSの46番ピンを落としてあげると、動作状態に戻ります。

cat /proc/interruptすると、期待通り
 30:  107651966   EXT2
のような感じになっているはずです。

> 2. メモリマップのSystem Control Module領域にアクセスするには
> どうすればいいでしょうか?
> 何かカーネルからIFが提供されていたりするのでしょうか?

Interrupt Service Reg.のある領域は、カーネルの中で常に使用しているので
既にMMUで別のアドレスにマップされている状態です。
直接触りたければ、特に再マップはせずに

  readl(NS_SYS_INT_CFG_BASE);

のようにするだけです。
# include/asm-arm/arch-ns9750/ns9750_sys.hで、
  #define NS_SYS_MODULE_BASE		(0xFA900000) /* virtual address */
  #define NS_SYS_INT_CFG_BASE		(NS_SYS_MODULE_BASE + 0x0144)
  のような形でマクロ定義されています。

____________________________________________________

    花田 政弘 (はなだ まさひろ)

      (株)アットマークテクノ 開発部
        TEL: 011-207-6550    FAX: 011-207-6570
        URL: http://www.atmark-techno.com/

    E-mail: email@hidden
____________________________________________________




armadillo メーリングリストの案内