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

g-kihara email@hidden
2008年 10月 15日 (水) 17:58:49 JST


お世話になっています。


割り込みがかかるようになったものの、
デバイスドライバを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 メーリングリストの案内