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

山本 慎二郎 email@hidden
2008年 10月 15日 (水) 18:17:29 JST


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

#試していませんので、憶測ですが。。。

>     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*/);
> 
>     request_irq(INT_GPIO3_13, irq_handler, SA_INTERRUPT, "inttest", NULL);
>     set_irq_type(INT_GPIO3_13, IRQT_RISING);
> 
>     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 メーリングリストの案内