[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 メーリングリストの案内