[Armadillo:01982] armadillo220 GPIO でのHIGHの検知

林田 平馬 email@hidden
2007年 9月 3日 (月) 11:02:13 JST


林田と申します。お世話になります。

早速ですが下記の様なコードで、汎用ポートがある状態(HIGH又は
LOW)になるまでを割込みで待ち、その状態になったら、その状態から
抜け出すまでをポーリングでチェックし、無限ループで監視し続けること
を考えています。LOWの検知(各ポートのピンとグランドを短絡することで
確認)は下記のコードで、希望通り行えているのですが、TYPE_LOW_LEVEL
の部分をTYPE_HIGH_LEVELに書き換えると「監視スタート」のプリント
文もでないところで、システムごと停止(完全に無反応、ハングアップ)して
しまいます。

電気回路は良くわかってないため、出力ピン(CON7)はオープン(何も
接続していない)のまま実行しておりますが、やはりこのことが一番
の原因なのでしょうか?それともドライバの使用方法を間違っている
のでしょうか?どなたかお気づきのことがありましたらコメントよろしく
お願いします。


 int fd_gpio , gpio_num;
 int ret,i=0;
 int gpio_no[GPIO_MAX_NUM] =
{GPIO0,GPIO1,GPIO2,GPIO3,GPIO4,GPIO5,GPIO6,GPIO7};
 struct gpio_param param_set , param_get;
 struct wait_param wparam;

〜中略〜

 param_get.next = NULL;
 param_get.no = gpio_no[gpio_num];
 param_get.mode = MODE_INPUT;
 param_get.data.i.value = 0;
// param_get.data.i.int_enable = 1; /* 0:disable/1:enable */
// param_get.data.i.int_type = TYPE_LOW_LEVEL;

 param_set.next = NULL;
 param_set.no = gpio_no[gpio_num];
 param_set.mode = MODE_INPUT;
 param_set.data.i.value = 0;
 param_set.data.i.int_enable = 1; /* 0:disable/1:enable */
 param_set.data.i.int_type = TYPE_LOW_LEVEL;  ←ここをTYPE_HIGH_LEVELに変更

 fd_gpio = open(DEVICE_GPIO, O_RDWR);
 if (fd_gpio < 0) {
  perror("Can't open DEVICE_GPIO.");
  return -1;
 }

 wparam.list = gpio_no[gpio_num];
 wparam.timeout = 0;

 ret = ioctl(fd_gpio, PARAM_SET, &param_set);
 if (ret ==  -1) {
  perror("Ioctl set err.");
  return 1;
 }

 printf("GPIO %d 監視スタート.\n", gpio_num );

 while(1){

  set_led_status(LED_RED_OFF);
  ret = ioctl(fd_gpio, INTERRUPT_WAIT, &wparam);
  if (ret) {
   perror("Ioctl interrupt err");
   return -1;
  }

  i++;

  ret = write_log( gpio_num , i);

  set_led_status(LED_RED_ON);

  //アラート状態を抜け出すまでポーリング
  do{
   sleep(5);

       if (ioctl(fd_gpio, PARAM_GET, &param_get) == -1) {
            perror("Can't Get GPIO Value.");
            return 1;
       }
      }while(param_get.data.i.value == 0);
 }

 close(fd_gpio);

 return 0;
}




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