[Suzaku:01603] Re: SZ410 FPGA側で発生させた割り込み信号がlinux側で認識できない件

mizo email@hidden
2009年 8月 18日 (火) 13:23:14 JST


溝渕です。

Miyamoto wrote:
> SZ410のデフォルトを元にして、SZ410-SILを参考にカスタマイズしました。
> そのため、JP1をショート時にはinterrupt_initやinterrupt_cleanが呼ばれてい 
> ます。
> 
> SZ410のデフォルトでは呼ばれないと言う事は、
> FPGAの割り込み信号をlinux側で認識するためにinterrupt_〜系の関数の呼び出 
> しは不要という事でしょうか?
> main.cはデフォルトのままでもOSが起動すれば割り込みは有効になると考えてよ 
> ろしいでしょうか?

はい。
[SUZAKU]# cat /proc/interrupts
と入力すると、シリアルやLANの割り込みが入っていることを確認できると思い
ます。

> 以下が自作したデバイスドライバのrequest_irq()を呼んでいる部分、並びにハ 
> ンドラのソースです。
> 
> よろしくお願いします。
> 
> //変数
> static char sync_device_name[] = "sync";
> static int irq = 3;
> static char *id = "Sync SCI interrupt";
> //ハンドラ
> static void sync_irq(int irq, void *dev_id, struct pt_regs *regs)
> {
> printk("!\n");
> }
> //ドライバのインストール
> int init_module(void)
> {
> int r;
> 
> printk("sync: start driver\n");
> 
> sync_addr = (void *)ioremap_nocache(SYNC_BASE + 4, 1);
> sync_addrW = (void *)ioremap_nocache(SYNC_BASE, 1);
> 
> r = register_chrdev(sync_major, sync_device_name, &sync_fops);
> if (r < 0) {
>  printk("sync: can't get major %d failed\n", r);
> }
> spin_lock_init(&sync_spinlock);
> 
> if (request_irq(irq, sync_irq, 0, sync_device_name, id)) {
>  printk("sync:request_irq failed\n");
> }
> 
> return 0;
> }

init_module()を以下のようにしてみるとどうなりますか?ちなみにrequest_irq
()の第5引数に値を設定していましたが、割り込みは共有していますか?

ビルドしてみていないので正確なコードではないかもしれませんが試してみてく
ださい。

int init_module(void)
{
	int r;

	printk("sync: start driver\n");

	sync_addr = (void *)ioremap_nocache(SYNC_BASE + 4, 1);
	sync_addrW = (void *)ioremap_nocache(SYNC_BASE, 1);

	r = request_irq(irq, sync_irq, SA_INTERRUPT, sync_device_name, NULL);
	if (r < 0) {
		printk(KERN_ERR "sync:request_irq failed\n");
		goto fail1;
	}

	r = register_chrdev(sync_major, sync_device_name, &sync_fops);
	if (r < 0) {
		printk(KERN_ERR "sync: can't get major %d failed\n", r);
		goto fail2;
	}

	spin_lock_init(&sync_spinlock);

	return 0;

fail2:
	free_irq(irq, NULL);
fail1:
	return r;
}



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