[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, ¶m_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, ¶m_get) == -1) {
perror("Can't Get GPIO Value.");
return 1;
}
}while(param_get.data.i.value == 0);
}
close(fd_gpio);
return 0;
}
armadillo メーリングリストの案内