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

email@hidden
2010年 10月 29日 (金) 11:29:27 JST


初めまして、清水と申します。
Armadillo-300の割込み処理について質問があり投稿させて頂きました。

現在、Armadillo-300に外部から信号を入力し、
それを割込みとして処理するシステムを作成したいと考えています。
しかし、信号入力しても、期待する割込みが発生しない状況です。


以下、自分で調査した結果も含めた詳細になります。


割込み信号の入力には拡張バスCON12のピン46、
EXT_INT(拡張バス割込み)を使用しています。
このピンはNS9750のgpio[11]ピンに接続されており、
同ピンにはExt IRQ2機能があることを確認しました。
Ext IRQ2のInterrupts IDは30なので、
ピンに信号入力をすると、IRQ番号30の発生が
/proc/interruptsで発生することを期待しています。
ところが実際に信号入力してもIRQ番号30の発生が確認できません。

レジスタ設定が割込み用の設定でないことを疑い、
簡単なドライバモジュールを作成して以下のレジスタを確認しましたが、
正しく設定されているようです。
物理アドレス:レジスタ:読み出し値:備考
0x6000_0002:Interrupt Mask Reg.       :0x00          :割込みマスクなし
0x6000_0008:Extension Bus Control Reg.:0x08          :拡張バス有効
0x9060_0014:GPIO Configuration Reg.   :0001(bit15-11):bit12-11がgpio[11]の機能選択でExt IRQ2に設定

他に関連するレジスタがないか確認したところ、
NS9750のマニュアルにInterrupt Configuration Reg.
(物理アドレス:0x0A90_0144)があったので、
この設定を確認するため、上記レジスタ確認で用いた
モジュールのアドレス部分を変更して組み込みました。
以下がそのコードです。

--------------------------------------------------------
#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/io.h>	//メモリアクセスで必要

#define THISMOD "iotestmod"	//モジュール名

#define REMAP_SIZE 16	//仮想メモリ割り当てサイズ

//レジスタの物理メモリマップ
static unsigned int int_conf_reg = 0xA0900144;	//Interrupt Service Reg.

//モジュール組み込み関数
int init_module(void)
{
	void *cookie;	//割当てる仮想メモリのポインタ

	unsigned char byte_data;	//byteデータ格納
	unsigned short word_data;	//wordデータ格納

	printk("loaded %s\n", THISMOD);

	//Interrupt Service Reg.確認
	//指定したアドレスをサイズREMAP_SIZEの仮想メモリに割当てる
	cookie = ioremap(int_conf_reg, REMAP_SIZE);
	byte_data = readb(cookie);	//仮想メモリから1byte読込み
	printk("Int Conf Reg.\n\tadd:%x, data:%x\n", int_conf_reg, byte_data);
	iounmap(cookie);	//仮想メモリの開放
	return 0;
}

//モジュール削除関数
void cleanup_module(void)
{
	printk("unloaded %s\n", THISMOD);
}
--------------------------------------------------------

すると、以下のエラーメッセージが出ました。
Armadillo-300のHWマニュアルのメモリマップに
System Control Moduleと定義されている領域に
アクセスする場合は同様のエラーが出ることを確認しています。

--------------------------------------------------------
Using iotestmod.ko
loaded iotestmod
Unhandled fault: external abort on non-linefetch (0x008) at 0xc4818144
pgd = c3e24000
[c4818144] *pgd=00445011, *pte=a09000a3, *ppte=a0900552
Internal error: Oops: 0 [#1]
Modules linked in: iotestmod
CPU: 0
PC is at init_module+0x34/0x64 [iotestmod]
LR is at __ioremap+0x210/0x230
pc : [<bf000058>]    lr : [<c004b64c>]    Tainted: P
sp : c3cc5e60  ip : 00000000  fp : c3cc5e74
r10: c003fd90  r9 : c4811000  r8 : c481156c
r7 : c003fdac  r6 : bf000320  r5 : a0900144  r4 : c0334f1c
r3 : 00000144  r2 : 00000004  r1 : a0900144  r0 : c4818144
Flags: nzcv  IRQs on  FIQs on  Mode SVC_32  Segment user
Control: 5317F  Table: 03E24000  DAC: 00000015
Process busybox (pid: 1195, stack limit = 0xc3cc4194)
Stack: (0xc3cc5e60 to 0xc3cc6000)
5e60: c0334f1c c0334f0c c3cc5fa4 c3cc5e78 c0072c78 bf000034 00000000 bf00032c
5e80: bf000000 00000000 00000000 00000000 00000000 00000004 00000000 00000000
5ea0: 00000000 00000000 c481178c c3deca20 c481151c c4811454 c4811544 00000000
5ec0: 0000001c 0000001c c0173088 c38a8000 c38a39cc c38a8000 c3cc5f08 c3cc5ee8
5ee0: c48112f4 0000000d 0000000b 0000000e 0000000a c0333004 00000000 c3cc5f58
5f00: c3cc5f0c c017087c c018e4a8 00000000 c38a8000 c00862fc 60000013 c0398f90
5f20: 0000000a c0333004 40093288 beb83d94 4001d000 c3cc5f58 c3cc5f44 c0054a38
5f40: c00549a8 00000000 00000000 c3cc5f6c c3cc5f5c c005d878 c0054a1c 00000001
5f60: c3cc5f88 c3cc5f70 c005d698 c005d810 ffffffff 00000000 00000000 00000004
5f80: 00000000 00000000 00000080 c0043f64 c3cc4000 00000002 00000000 c3cc5fa8
5fa0: c0043de0 c00719e8 00000000 00000000 00900080 401de000 00000814 001b8080
5fc0: 00000004 00000000 00000000 001b8068 00000000 00000000 00000002 beb85ab4
5fe0: beb83dcc beb83dc0 0003cf64 4017baf0 60000010 00900080 ffff4a54 ffff6624
Backtrace:
[<bf000024>] (init_module+0x0/0x64 [iotestmod]) from [<c0072c78>] (sys_init_module+0x12a0/0x1460)
 r5 = C0334F0C  r4 = C0334F1C
[<c00719d8>] (sys_init_module+0x0/0x1460) from [<c0043de0>] (ret_fast_syscall+0x0/0x2c)
Code: e3a02000 e1a00005 eb412cf9 e1a01005 (e5d02000)
 Segmentation fault
--------------------------------------------------------


以上の状態を踏まえ、以下の質問をさせて下さい。
--------------------------------------------------------
1. そもそも、Armadillo-300で外部からピンに信号入力して
割込みを発生させることが可能でしょうか?

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


linuxの中身に踏み込んで何かをする、というのが今回初めての経験なので、
不勉強な面があるかと思いますが、何卒皆様のお力添えを頂ければ幸いです。



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