[Suzaku:02135] Re: SZ410の割込み

mio email@hidden
2011年 12月 29日 (木) 10:32:19 JST


中島(なかしま)です。

(2011/12/28 11:58), takashi nakajima wrote:
> 中島です。
> 自己レスします。
> bus errorは,ポインタに関する初歩的なミスでオフセットを4倍にしていました。
> オフセットを1/4にしたら、bus errorは、消えました。
> 現在のドライバソースは以下の通りです。
> MSBをbit0,LSBをbit31とすると
> 0x38000000は、bit2,3,4が立っているとしてよいのでしょうか?
> 私方では,bit0,1,2が,UARTLITEとMAC,PHYの割込みで
> bit3がint_a,bit4がint_b,bit5がint_rstだろうと解釈しているのですが
> 下記ソースのように、割込みステータスレジスタ0xf0ff3000のbit3(int_aの割 
> 込み要因)
> が立っているとき、割込みアクノリッジレジスタ0xf0ff300cのbit3に1を書いて
> 要因をクリアしているのですが、実機でためしてみると
> ボタンをおさないと出ないはずのint_a割込みが、ひっきりなしに起こっている
> ように見えることがわかりました。
> (tondayo!!がLogに連続して次々表示されるため)
> オシロスコープでint_a割込みの元の信号を観測してみましたが
> ボタンをおさないと割込みはでないことを確認しました。
> ボタンを1回おしてはなすと正極性のパルスが1発でました。

割り込みがはいりっぱなしとなると、
割り込みの検出方法が気になります。

- Level Pass Through(non-inverted)
- Level Pass Through(inverted input)
- Rising Edge Detect
- Falling Edge Detect

などの種類がありますが、どれで検出していますか?

過去ログを調べてみたのですが、割り込みについて少し参考になりそうなスレッ
ドがいくつかありそうです。

http://lists.atmark-techno.com/pipermail/suzaku/2009-April/001450.html
http://lists.atmark-techno.com/pipermail/suzaku/2009-August/001581.html

> INTCへの割込み信号の接続を前の書き込みのmhsの抜粋のようにしたとき
> 割込み要因レジスタを16進数であらわしたとき6本の割込みが全部同時に発生し 
> たなら
> 0xfc000000になるのでしょうか?
> 引き続き、回答をお待ちしています。
> どうかよろしくお願い致します。
> #include <linux/module.h>
> #include <linux/types.h>
> #include <linux/kernel.h>
> //#include <linux/errno.h>
> #include <linux/string.h>
> //#include <linux/mm.h>
> //#include <linux/vmalloc.h>
> //#include <linux/slab.h>
> //#include <linux/delay.h>
> //#include <linux/fb.h>
> //#include <linux/init.h>
> #include <linux/interrupt.h>
> #include <linux/ioctl.h>
> //#include <linux/uaccess.h>
> //#include <linux/platform_device.h>
> //#include <linux/device.h>
> #include <linux/cdev.h>
> #include <asm/io.h>
> static char IRQNAME[9] = "TEST_IRQ";
> static int irq = 3;
> static unsigned int *BASE_ADDDR;
> static int FLAG;
> 
> static irqreturn_t
> test_irq(int irq, void *dev_id, struct pt_regs *r)
> {
> unsigned int temp;
> temp = ioread32(BASE_ADDDR/*0xf0ff3000*/);
> if(FLAG == 0){
> printk("interrupt status reg=%x\n",temp);
> FLAG = 1;
> }
> if((temp & 0x10000000)==0x10000000){
> iowrite32(0x10000000,BASE_ADDDR+3/*0xf0ff300c*/);
> printk("tondayo!!\n");
> return IRQ_HANDLED;
> } else {
> return IRQ_NONE;
> }
> }
> int init_module(void)
> {
> int ret;
> printk("IRQ TEST driver initializing!!!!\n");
> BASE_ADDDR = (unsigned int*)ioremap_nocache(0xf0ff3000,0x14);
> printk("BASE_ADDRESS=%x\n",BASE_ADDDR);
> ret = request_irq(irq, test_irq, SA_INTERRUPT/*IRQF_SHARED*/, IRQNAME, 
> NULL);
> if(ret < 0){
> printk("IRQ NOT REGISTERED!!\n");
> } else {
> iowrite32(0xf0000000,BASE_ADDDR+2/*0xf0ff3008*/);/*INTA INTB default int 
> ENABLE*/
> }
> FLAG=0;
> return 0;
> }
> /*void cleanup_module(void)
> {
> printk("cleaned up module!!\n");
> iounmap(BASE_ADDDR);
> }*/
> MODULE_LICENSE("GPL v2");
> *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
> 〒221-0031
> 神奈川県横浜市神奈川区新浦島町1-1-32
> ニューステージ横浜 13F
> NTTエレクトロニクス株式会社
> デジタル映像事業本部
> 第一製品事業部
> 設計部 モジュール開発部門
> 
> 中島 孝
> 
> E-mail nakajima-takashi@ntt-el.com
> TEL 045-414-9465
> *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
> 
>     ----- Original Message -----
>     *From:* takashi nakajima <mailto:email@hidden>
>     *To:* email@hidden
>     <mailto:email@hidden>
>     *Sent:* Tuesday, December 27, 2011 1:10 PM
>     *Subject:* [Suzaku:02133] SZ410の割込み
> 
>     はじめまして、お世話になります。
>     中島といいます。
>     現在SZ410とsz410-20090427プロジェクトを使い
>     割込みコントローラへの割込み信号を追加した
>     回路を組みました。
>     お手製割込みハンドラにとばすことまでできています。
>     しかし、割込み要因レジスタに0x38000000という値が読めていて
>     0x38を2進数で書くと00111000bですが、どのビットがどの要因かの
>     対応がビッグエンディアンがよくわかっていないため、わからないでいます。
>     という点と、下記ログのようにまだ問題があるようで,bus errorがでています。
>     ドライバの記述に問題があるのでしょうか?
>     以上、どなたか親切な方がいらっしゃたら、ヒントだけでもいただけたら幸
>     いです。
>     mhsファイルの抜粋は、下記の通りです。
>     BEGIN xps_intc
>     PARAMETER INSTANCE = intc_system
>     PARAMETER HW_VER = 1.00.a
>     PARAMETER C_BASEADDR = 0xF0FF3000
>     PARAMETER C_HIGHADDR = 0xF0FF30FF
>     BUS_INTERFACE SPLB = plb_peripheral
>     PORT Irq = EICC405EXTINPUTIRQ
>     PORT Intr =
>     int_rst&int_b&int_a&phy_mii_int&console_uart_interrupt&fifo_int
>     END
>     int_rst、int_b、int_aの3本の割込み信号を追加しています。
>     テスト用のドライバは、次の通りです
>     #include <linux/module.h>
>     //#include <linux/types.h>
>     #include <linux/kernel.h>
>     //#include <linux/errno.h>
>     #include <linux/string.h>
>     //#include <linux/mm.h>
>     //#include <linux/vmalloc.h>
>     //#include <linux/slab.h>
>     //#include <linux/delay.h>
>     //#include <linux/fb.h>
>     //#include <linux/init.h>
>     #include <linux/interrupt.h>
>     #include <linux/ioctl.h>
>     //#include <linux/uaccess.h>
>     //#include <linux/platform_device.h>
>     //#include <linux/device.h>
>     #include <linux/cdev.h>
>     #include <asm/io.h>
>     static char IRQNAME[9] = "TEST_IRQ";
>     static int irq = 3;
>     static unsigned int *BASE_ADDDR;
>     static int FLAG;
> 
>     static irqreturn_t
>     test_irq(int irq, void *dev_id, struct pt_regs *r)
>     {
>     int temp;
>     temp = ioread32(BASE_ADDDR/*0xf0ff3000*/);
>     if(FLAG == 0){
>     printk("interrupt status reg=%x\n",temp);
>     FLAG = 1;
>     }
>     // if((temp & 0x80000000)==0x80000000){
>     // iowrite32(0x80000000,BASE_ADDDR+0x0c/*0xf0ff300c*/);
>     // printk("tondayo!!\n");
>     // return IRQ_HANDLED;
>     // } else {
>     return IRQ_NONE;
>     // }
>     }
>     int init_module(void)
>     {
>     int ret;
>     printk("IRQ TEST driver initialiing!!!!\n");
>     BASE_ADDDR = (unsigned int*)ioremap_nocache(0xf0ff3000,0x14);
>     ret = request_irq(irq, test_irq, SA_INTERRUPT/*IRQF_SHARED*/,
>     IRQNAME, NULL);
>     if(ret < 0){
>     printk("IRQ NOT REGISTERED!!\n");
>     } else {
>     iowrite32(0xffffffff,BASE_ADDDR+0x8/*0xf0ff3008*/);/*INTA INTB
>     default int ENABLE*/
>     }
>     FLAG=0;
>     return 0;
>     }
>     /*void cleanup_module(void)
>     {
>     printk("cleaned up module!!\n");
>     iounmap(BASE_ADDDR);
>     }*/
>     MODULE_LICENSE("GPL v2");
> 
>     PowerPCのアドレス空間上のアドレス0xf0ff3000が割込みコントローラの
>     ベースアドレスです
>     0xf0ff3000 がinterrupt status registerのアドレスです
>     以下が上記ドライバをOSにリンクしたときのログです。
>     IRQ TEST driver initialiing!!!!
>     interrupt status reg=38000000
>     irq 3: nobody cared (try booting with the "irqpoll" option)
>     Call Trace:
>     [C3D1DBB0] [C00099DC] show_stack+0x4c/0x1b0 (unreliable)
>     [C3D1DBE0] [C0045230] __report_bad_irq+0x30/0xc0
>     [C3D1DC00] [C00453A4] note_interrupt+0xe4/0x2b0
>     [C3D1DC30] [C0044814] __do_IRQ+0x124/0x130
>     [C3D1DC50] [C0007484] do_IRQ+0xc4/0xd0
>     [C3D1DC60] [C000353C] ret_from_except+0x0/0x18
>     [C3D1DD20] [00000000] 0x0
>     [C3D1DD40] [C00447B0] __do_IRQ+0xc0/0x130
>     [C3D1DD60] [C0007484] do_IRQ+0xc4/0xd0
>     [C3D1DD70] [C000353C] ret_from_except+0x0/0x18
>     [C3D1DE30] [C0044F08] setup_irq+0x1a8/0x200
>     [C3D1DE50] [C004501C] request_irq+0xbc/0xd0
>     [C3D1DE80] [C50040C4] init_module+0x54/0x180 [IRQ_TEST2]
>     [C3D1DE90] [C0042444] sys_init_module+0x174/0x1590
>     [C3D1DF40] [C0002EF4] ret_from_syscall+0x0/0x3c
>     handlers:
>     [<c5004000>] (test_irq+0x0/0x70 [IRQ_TEST2])
>     Disabling IRQ #3
>     Data machine check in kernel mode.
>     Oops: machine check, sig: 7 [#1]
>     NIP: C0042444 LR: C0042444 CTR: 00000000
>     REGS: c0205f50 TRAP: 0202 Not tainted (2.6.18-at7)
>     MSR: 00029030 <EE,ME,IR,DR> CR: 33005593 XER: E000007F
>     TASK = c0524830[158] 'exe' THREAD: c3d1c000
>     GPR00: C0042444 C3D1DE90 C0524830 00000000 00000014 00000000
>     C3E1E608 00000000
>     GPR08: 00000014 C5000000 00000000 FFFFFFFF 000014FC 100417C0
>     0000000F C5002AB0
>     GPR16: C057EA40 C5002720 00000124 00000000 C0041350 C5002434
>     C5002770 C5004548
>     GPR24: C5002000 00000011 00000011 C5004500 C052F6D8 C5004500
>     C01C8CDC C052F6B0
>     NIP [C0042444] sys_init_module+0x174/0x1590
>     LR [C0042444] sys_init_module+0x174/0x1590
>     Call Trace:
>     [C3D1DE90] [C0042444] sys_init_module+0x174/0x1590 (unreliable)
>     [C3D1DF40] [C0002EF4] ret_from_syscall+0x0/0x3c
>     Instruction dump:
>     7fc3f378 481509c9 3c60c01d 38800001 7f65db78 38638ce8 4bfef815 801b00dc
>     2f800000 419e0014 7c0903a6 4e800421 <7c7f1b79> 418000b4 3d20c01d
>     3be00000
>     Bus error
>     上記ログより,ハンドラの登録はできているようです。
>     32本の割込み(26本は、無効)をイネーブルにしています。
>     cat ./proc/interruptsの内容は次の通りです。
>     # cat ./proc/interrupts
>     CPU0
>     0: 56 Xilinx Interrupt Controller Level eth0
>     1: 271 Xilinx Interrupt Controller Edge uartlite
>     3: 100000 Xilinx Interrupt Controller Level TEST_IRQ
>     BAD: 0
>     # # cat ./proc/interrupts
>     CPU0
>     0: 56 Xilinx Interrupt Controller Level eth0
>     1: 278 Xilinx Interrupt Controller Edge uartlite
>     3: 100000 Xilinx Interrupt Controller Level TEST_IRQ
>     BAD: 0
>     # # cat ./proc/interrupts
>     CPU0
>     0: 56 Xilinx Interrupt Controller Level eth0
>     1: 285 Xilinx Interrupt Controller Edge uartlite
>     3: 100000 Xilinx Interrupt Controller Level TEST_IRQ
>     BAD: 0
>     #
>     TEST_IRQの割込み発生回数ですが、予定では0になるはずでした。
>     ボタンをおすと,インクリメントしていく予定でした。
>     EDKがはきだしたxparameters.hの抜粋は次の通りです。
>     #define XPAR_INTC_SINGLE_BASEADDR 0xF0FF3000
>     #define XPAR_INTC_SINGLE_HIGHADDR 0xF0FF30FF
>     #define XPAR_INTC_SINGLE_DEVICE_ID XPAR_INTC_SYSTEM_DEVICE_ID
>     #define XPAR_OCM_TEMAC_CNTLR_FIFO_INT_MASK 0X000001
>     #define XPAR_INTC_SYSTEM_OCM_TEMAC_CNTLR_FIFO_INT_INTR 0
>     #define XPAR_UART_CONSOLE_INTERRUPT_MASK 0X000002
>     #define XPAR_INTC_SYSTEM_UART_CONSOLE_INTERRUPT_INTR 1
>     #define XPAR_OCM_TEMAC_CNTLR_PHY_MII_INT_MASK 0X000004
>     #define XPAR_INTC_SYSTEM_OCM_TEMAC_CNTLR_PHY_MII_INT_INTR 2
>     #define XPAR_SYSTEM_INTA_MASK 0X000008
>     #define XPAR_INTC_SYSTEM_SYSTEM_INTA_INTR 3
>     #define XPAR_SYSTEM_INTB_MASK 0X000010
>     #define XPAR_INTC_SYSTEM_SYSTEM_INTB_INTR 4
>     #define XPAR_SYSTEM_INTRST_MASK 0X000020
>     #define XPAR_INTC_SYSTEM_SYSTEM_INTRST_INTR 5
>     XPAR_INTC_SYSTEM_SYSTEM_INTA_INTR 3という記述をもとに
>     IRQ番号を3にしています。




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