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

takashi nakajima email@hidden
2011年 12月 28日 (水) 11:58:59 JST


中島です。

自己レスします。
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発でました。
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
  To: 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にしています。

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

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

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

   中島 孝

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

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


------------------------------------------------------------------------------


  _______________________________________________
  suzaku mailing list
  email@hidden
  http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/suzaku
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://lists.atmark-techno.com/pipermail/suzaku/attachments/20111228/e59e5d35/attachment-0001.html>


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