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

takashi nakajima email@hidden
2012年 1月 4日 (水) 17:58:07 JST


中島(なかじま)です。

まず、EDKのビルドログを見ると

C_KIND_OF_INTR =  0b00000000000000000000000000000010
C_KIND_OF_EDGE = 0b00000000000000000000000000000010

となっていて、console_uart_interruptのみ立ち上がりエッジで検出しており
phy_mii_int、fifo_int、int_a、int_b、int_rstはレベルで検出しているように見えました。

そこで、int_a、int_b、int_rstは立ち上がりエッジで検出してほしいので、mhsファイルに

C_KIND_OF_INTR =  0b00000000000000000000000000111010
C_KIND_OF_EDGE = 0b00000000000000000000000000111010

を追記する代わりに、同義の

C_KIND_OF_INTR =  0x0000003A
C_KIND_OF_EDGE = 0x0000003A

を追記してみたところ、次のようなWARNINGがでました

WARNING:EDK:1557 - IPNAME:xps_intc INSTANCE:intc_system -
   C:\user\ntsc_ip_send\sz410-20090427\xps_proj.mhs line 161 - PARAMETER
   C_KIND_OF_INTR has value 0x0000003A specified in MHS, but tcl is 
overriding
   the value to 0b00000000000000000000000000000010
WARNING:EDK:1557 - IPNAME:xps_intc INSTANCE:intc_system -
   C:\user\ntsc_ip_send\sz410-20090427\xps_proj.mhs line 162 - PARAMETER
   C_KIND_OF_EDGE has value 0x0000003A specified in MHS, but tcl is 
overriding
   the value to 0b00000000000000000000000000000010

ということで、謎のtclファイルがmhsファイルの記述を採用してくれないので、
謎のtclとはなんぞと思ってしらべましたところどうやらmpdファイルらしいことがわかりました。
ところが,\Xilinx\11.2\EDK\hw\XilinxprocessorPlib\Pcores\hoge_interrupt_controler_v.1.0.0.a\data
にはpaoファイルがあるだけでmpdファイルはありませんでした。
paoファイルをみると割込みのセンスの記述がありましたが、それらしい記述はありませんでした。

EDKのバージョンは11.2で、PowerPC405の周辺割込みコントローラxps_intc_v1.0.0.aを使っています。

そこで新しい質問ですがパラメータ
C_KIND_OF_INTRとC_KIND_OF_EDGEをmhsに追記したとき、それを反映させないtclファイルは
どこにあるかわかる方いらっしゃいますでしょうか?

変な質問で申し訳ありませんが、どうかよろしくお願い致します。

 *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
 〒221-0031
 神奈川県横浜市神奈川区新浦島町1-1-32
 ニューステージ横浜 13F

 NTTエレクトロニクス株式会社

 デジタル映像事業本部
 第一製品事業部
 設計部 モジュール開発部門

 中島 孝

 E-mail nakajima-takashi@ntt-el.com
 TEL 045-414-9465

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*


----- Original Message ----- 
From: "takashi nakajima" <email@hidden>
To: "SUZAKU general discussion list" <email@hidden>
Sent: Wednesday, January 04, 2012 9:50 AM
Subject: [Suzaku:02136] Re: SZ410の割込み


> 中島(なかじま)です。
> あけましておめでとうございます。
> さっそくのレス有難う御座います。
>
>> - Level Pass Through(non-inverted)
>> - Level Pass Through(inverted input)
>> - Rising Edge Detect
>> - Falling Edge Detect
>>
>> などの種類がありますが、どれで検出していますか?
>
> についてですが、下記のmhsファイルの抜粋のように、
> 信号エッジで検出するか、信号レベルで検出するか
> のパラメータ指定をしていません。すると、Xilinxのxps_intcの
> データシートに書いてあるようににデフォルト立ち上がりエッジで検出
> が選ばれると考えました。
> ドライバのソースの中でprintkを殺して、cat ./proc/interrupts
> を表示させると、問題になっている割込みはレベル検出になっており
> 10000回の割込みを受け付けた状態から変化はありませんでした。
> ご教示いただいたhttp://lists.atmark-techno.com/pipermail/suzaku/2009-April/001450.html
> の過去ログの方も
> 同様に、mhsファイルにて、インタラプトセンスのパラメータ記述がない状態で
> レベルセンスになっていたので、mhsで明示的に立ち上がりエッジで割込み
> 検出させないといけないのかもしれないと思いました。
> まず、当方ではこの点を今日やってみます。
> その前に、EDKでのビルドログをながめてみます。
>
> ところで、割込みがボタンをおさないと出ない状態なのに、割込みを検出
> しているということは、まだ、他に問題がありそうです。
>
> なお割込み信号は、パルス幅40nsの正極性パルスで、ボタンを
> 1回押して離すごとに単発パルスがでます。
>
> 過去ログのリンク紹介ありがとうございました。
>
> 以上、進展がありましたら、また報告致します。
>
> <<<<<<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
>
>
> *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
> 〒221-0031
> 神奈川県横浜市神奈川区新浦島町1-1-32
> ニューステージ横浜 13F
>
> NTTエレクトロニクス株式会社
>
> デジタル映像事業本部
> 第一製品事業部
> 設計部 モジュール開発部門
>
> 中島 孝
>
> E-mail nakajima-takashi@ntt-el.com
> TEL 045-414-9465
>
> *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
>
> ----- Original Message ----- 
> From: "mio" <email@hidden>
> To: <email@hidden>
> Sent: Thursday, December 29, 2011 10:32 AM
> Subject: [Suzaku:02135] Re: SZ410の割込み
>
>
>> 中島(なかしま)です。
>>
>> (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 mailing list
>> email@hidden
>> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/suzaku
>
> _______________________________________________
> suzaku mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/suzaku 



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