[Armadillo:03554] Re: Armadilo-500 GPIOピンを利用した割り込みについて

山本 慎二郎 email@hidden
2008年 10月 16日 (木) 16:04:09 JST


山本です。
いつもお世話になっております。

#まず、MLで特定の人に対して質問をするのは、
#使い方を間違っているように思います。

カーネルソースを追っていないので憶測ですが、
14bit目が1なのは、Lowレベル割り込みだからでは
ないのでしょうか。

  Lowレベル割り込みでICRが1になる
   ↓
  IMRで割り込み無効なので無視される
   ↓
  何もしないので1のまま

同様に13bit目が0なのは、Riseエッジにし、
割り込みを有効にしているからだと思います。

  Riseエッジ割り込みでICRが1になる
   ↓
  IMRで割り込み有効なので、該当bit変化を拾う
   ↓
  カーネルは変化を認識したらICRを0にする
   ↓
  次の0→1が発生するまでは、ICRに変化なし

上記なら、Lowレベル割り込み設定で、
Lowのままだと、ICRの0→1の繰り返しで
割り込みが延々と発生する現象にも
辻褄が合うと思います。

#あくまで憶測ですので、確証を得たいのであれば、
#ソースコードを自分で解析してみて下さい。

よろしくお願い致します。

以上

On Thu, 16 Oct 2008 15:13:56 +0900
g-kihara <email@hidden> wrote:

> 山本 様
> 
> お世話になっています。
> 
> 割り込みハンドラ内で
> ISR(GPIO Interrupt Status Register)レジスタ
> を読み出したところ、
> 0xf5080
> で、14bit目が1, 13bit目が0
> となっていました。
> 動作は期待した動作をしており問題はありませんが、
> GPIO3_14は割り込みピンとして使用していないのに、なぜ1がたっている
> のでしょうか?
> GPIO3_13は割り込みピンとして使用しているのに、割り込み発生時、なぜ0なのか
> わかりません。
> 初期処理の中で、以下のようにして、
> 13bit目だけを割り込み許可にしてもやはり結果は同じでした。
> 
> --------------------------------------------------------------
>     //MX31_PIN_CSI_D14
>     gpio3_base = (unsigned char *)ioremap(0x53FA4000,0x30);
> 
>     // GPIO3 IMR (Interrupt Mask Register)
>     Reg=0x00000000;
>     writel((Reg | 0x01 << 13), gpio3_base + 0x53FA4014 - 0x53FA4000);
> --------------------------------------------------------------
> 
> 
> 
> 以上
> 
> 
> 
> ----- Original Message ----- 
> From: "山本 慎二郎" <email@hidden>
> To: "Armadillo series general discussion list"
> <email@hidden>
> Sent: Wednesday, October 15, 2008 6:17 PM
> Subject: [Armadillo:03548] Re: Armadilo-500 GPIOピンを利用した割り込みについて 
> 
> 
> 
> 
> > 山本です。
> > いつもお世話になっております。
> >
> > #試していませんので、憶測ですが。。。
> >
> >>     request_irq(INT_GPIO3_13, irq_handler, SA_INTERRUPT, "inttest",
> >> NULL);
> >>     set_irq_type(INT_GPIO3_13, IRQT_RISING);
> >
> > 上記は手順が逆なのではないでしょうか?
> >
> > (1)set_irq_type(INT_GPIO3_13, IRQT_RISING);
> > (2)request_irq(INT_GPIO3_13, irq_handler, SA_INTERRUPT, "inttest", NULL);
> >
> > の手順で設定するのが正しいのではないかと。
> >
> > IRQの割り込みのデフォルトはLOWレベル割り込みで、
> > set_irq_type()でRISINGを設定する前にrequest_irq()で
> > 割り込みを有効にすると、信号がLOWなので、
> > ノンストップで割り込みが上がってきているように思えます。
> >
> > #割り込みの方が優先順位高いので、request_irq()の関数すら
> > #抜けられていない状態かもしれないですね
> >
> >> ONにすると、割り込みは停止します。
> >
> > とあるので、スイッチ変更でHighになって、LOWレベル割り込みが止まって、
> > request_irq()を抜け、set_irq_type()でRISINGに設定できた結果、
> > 以降は正常に動作する、ということなら辻褄が合うと思います。
> >
> > よろしくお願い致します。
> >
> > 以上
> >
> > On Wed, 15 Oct 2008 17:58:49 +0900
> > g-kihara <email@hidden> wrote:
> >
> >> お世話になっています。
> >>
> >>
> >> 割り込みがかかるようになったものの、
> >> デバイスドライバをinsmodすると、
> >> ずっと割り込みがかかりっぱなしになります。
> >> ただ、その割り込みがかかりっぱなしのときに、
> >> 下記の【テスト環境】の説明に記したスイッチを
> >> ONにすると、割り込みは停止します。
> >> その後、スイッチをOFF -> ONに切り替えごとに、
> >> 割り込みハンドラがよばれ、期待した動作(立ち上がりエッジ
> >> で割り込み発生)を行ってくれます。
> >>
> >> insmod時、割り込みがかかりっぱなしになるのを
> >> 防ぎたいのですが、どのような設定を行えばよろしいのでしょうか?
> >> ご教示のほど宜しくお願い申し上げます。
> >>
> >>
> >> ----------------------------------------------------------------------------
> >> 【テスト目的】
> >>
> >> GPIO3_13(CON16 30ピン)を割り込みピンとして使用し、
> >> 立ち上がりエッジで割り込みハンドラが呼ばれるようにしたい。
> >>
> >> ----------------------------------------------------------------------------
> >> 【テスト環境】
> >>
> >>   CON16 30ピン(GPIO3_13) 、31ピン(GPIO3_14)をともにテストボード上のトグルスイッチ
> >>  の1端子に接続し、OFF状態のときは、ともにピン30(GND)に接続されています。 
> >> 
> >>
> >>  スイッチをONにすると、これらCON16の2端子とGNDとの接続は断たれます。
> >>
> >>  スイッチOFF状態のとき、デバイスドライバーをinsmod す
> >>   ると、 GPIO3_14 にHighが出力されます
> >>  (mxc_set_gpio_dataout(MX31_PIN_CSI_D14, 1/*HIGH*/)。
> >>
> >>   insmodした後、
> >>   テストボードのスイッチをONにすると、CON16 30ピン(GPIO3_13) 、31ピン(GPIO3_14)
> >>  とGND線との接続が断たれ、GPIO3_14とGPIO3_13がともにHighになります。
> >>  スイッチをOFFにすると、GNDと接続され、LOWになります。
> >>
> >> ---------------------------------------------------------------------
> >> 【デバイスドライバーソース】
> >>
> >> #include <linux/module.h>
> >> #include <linux/interrupt.h>
> >> #include <linux/irq.h>
> >> #include "/home/atmark//linux-2.6.18-at2/arch/arm/mach-mx3/iomux.h"
> >>
> >> #include <asm/arch/mx31_pins.h>
> >> #include <asm/arch/gpio.h>
> >>
> >> #define AUTHOR          "Test, Inc."
> >> #define DESCRIPTION     "Armadillo-5x0 GPIO Interrupt test driver"
> >> #define LICENSE         "GPL v2"
> >>
> >> static irqreturn_t
> >> irq_handler(int irq, void *dev_id, struct pt_regs *regs)
> >> {
> >>     static int n=0;
> >>     printk("interrupt occur!!  %02dkai\n", n);
> >>     n++;
> >>
> >>     return IRQ_HANDLED;
> >> }
> >>
> >> static int __init
> >> a500_extbus_init(void)
> >> {
> >>     printk("init start!\n");
> >>
> >>     // GPIO3_13 割り込みピンとして使用
> >>     mxc_set_gpio_direction(MX31_PIN_CSI_D13 , GPIO_DIR_INPUT);
> >>     mxc_request_iomux(MX31_PIN_CSI_D13 , OUTPUTCONFIG_GPIO,
> >> INPUTCONFIG_GPIO);
> >>
> >>     // GPIO3_14 GPIO出力ピンとして使用
> >>     mxc_set_gpio_direction(MX31_PIN_CSI_D14, 0/*OUTPUT*/);
> >>     mxc_request_iomux(MX31_PIN_CSI_D14 , OUTPUTCONFIG_GPIO,
> >> INPUTCONFIG_NONE);
> >>
> >>     // GPIO3_14 にHighを出力
> >>     mxc_set_gpio_dataout(MX31_PIN_CSI_D14, 1/*HIGH*/);
> >>
>      set_irq_type(INT_GPIO3_13, IRQT_RISING);
> 
> >>     request_irq(INT_GPIO3_13, irq_handler, SA_INTERRUPT, "inttest",
> >> NULL);
> >>    >
> >>     return 0;
> >> }
> >>
> >> static void __exit
> >> a500_extbus_exit(void)
> >> {
> >>     free_irq(INT_GPIO3_13, NULL);
> >> }
> >>
> >> MODULE_AUTHOR(AUTHOR);
> >> MODULE_DESCRIPTION(DESCRIPTION);
> >> MODULE_LICENSE(LICENSE);
> >>
> >> module_init(a500_extbus_init);
> >> module_exit(a500_extbus_exit);
> >>
> >> ---------------------------------------------------------------------
> >> 以上
> >>
> >>
> >> _______________________________________________
> >> armadillo mailing list
> >> email@hidden
> >> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
> >>
> >
> > =================================================
> > 北都システム株式会社
> >  第4ユニット ITソリューショングループ所属
> > 山本  慎二郎(Shinjiro Yamamoto)
> > TEL: 045-470-2773
> > Mail: email@hidden
> > =================================================
> >
> >
> > _______________________________________________
> > armadillo mailing list
> > email@hidden
> > http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
> 
> _______________________________________________
> armadillo mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
> 

=================================================
北都システム株式会社
  第4ユニット ITソリューショングループ所属
山本  慎二郎(Shinjiro Yamamoto)
 TEL: 045-470-2773
 Mail: email@hidden
=================================================





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