[Armadillo:07908] Re: GPIOデバイスドライバのチャタリング防止機構の有効無効設定

Toru Ito email@hidden
2012年 2月 23日 (木) 17:32:20 JST


伊藤と申します。

> 機能有効時:int_type = TYPE_FALLING_EDGE | TYPE_DEBOUNCE
> 機能無効時:int_type = TYPE_FALLING_EDGE

atmark-distのvendors/AtmarkTechno/Armadillo-210.Common/gpioctrl/gpioctrl.cと
同じように作成したのであれば、上記内容で問題ないと思います。

確認のため、gpioctrl.cのint_typeの使用箇所だけ抜きだすと、以下のようになっています。
===== ここから: main() =====
unsigned long int_type = 0;

int_type |= TYPE_FALLING_EDGE;
int_type |= TYPE_DEBOUNCE;

add_param_list(&param_list,gpio,mode,
               gen_set_input_param(int_enable,int_type));
===== ここまで: main() =====

> パルスを入力してデバイスドライバのエッジ待ち(INTERRUPT_WAIT)から
> 戻ってからGPIOを連続で読出しGPIOが「H」になるまでの時間を計ってみると
> 機能の有効と無効で時間的な差が認められませんでした。
> 予想では機能を無効にするとGPIOが「H」になるまでの時間が長くなると思っていました。

INTERRUPT_WAITから戻ってからGPIOを連続で読み出し、
GPIOが「H」になるまでの時間を測ることでは、
チャタリング防止機能の有効/無効を判断できません。

これは、LinuxカーネルがリアルタイムOSではないため、
割り込み発生後、INTERRUPT_WAITから戻ってくる時間が
一定ではないからです。

チャタリング防止機能が有効に機能しているかを確認したいのであれば、
GPIOにチャタリングとみなされるようなパルスを入力し、
割り込みが発生するかどうかを確認する方法がよいと思います。


ということで、DEBOUNCE機能が有効になっているかどうかを
実際に検証してみました。

結果としては、DEBOUNCE機能を有効にすると、7.5ms程度のlowパルスでは、
INTERRUPT_WAITから戻ってこず、8ms程度のlowパルスではINTERRUPT_WAIT
から戻ってきました。
また、DEBOUNCE機能を無効にした場合は、1ms以下のlowパルスでも
INTERRUPT_WAITから戻ってきました。

EP93xx User's GuideでDEBOUNCE機能については、
「Debouncing is implemented by passing the input signal through a 2-bit
shift register clocked by a 128 Hz clock.」と書かれているので、
- 7.8125 msec(1 sec / 128 Hz * 1 clock)未満のパルスでは、割り込みが発生しない
- 7.8125 msec(1 sec / 128 Hz * 1 clock)以上のパルスでは、割り込みが発生する可能性がある
- 15.625 msec(1 sec / 128 Hz * 2 clock)以上のパルスでは、確実に割り込みが発生する
ということのようです。

検証時には、gpioctrlコマンドを使用しました。
実際に実行したコマンドは、以下の通りです。

■ DEBOUNCE機能有効時

# gpioctrl --set=gpio0 --mode=input --type=falling-edge --debounce --handler="echo TEST"

■ DEBOUNCE機能無効時

# gpioctrl --set=gpio0 --mode=input
# gpioctrl --set=gpio0 --mode=input --type=falling-edge --handler="echo TEST"

※: Linuxカーネルのgpioドライバーの動きを見てみると、INTERRUPT_WAITから戻ってきた後、
    CPUのレジスタ内部のDEBOUNCE機能の設定をクリアしていないようです。
    そのため、「gpioctrl --set=gpio0 --mode=input」を実行して一旦DEBOUNCE機能を
    無効にしています。

以上、ご参考まで。


(2012年02月17日 08:19), email@hidden wrote:
> 
> 片平と申します。
> Armadillo-210のソフトウェアを開発しています。
> 
> GPIOのデバイスドライバを使用して入力パルスの立下りを検出しています。
> デバイスドライバのパラメータにチャタリング防止機能の設定がありますが
> 設定方法が正しいかがわかりません。
> 設定内容は以下の通りです。
> 機能有効時:int_type = TYPE_FALLING_EDGE | TYPE_DEBOUNCE
> 機能無効時:int_type = TYPE_FALLING_EDGE
> 
> パルスを入力してデバイスドライバのエッジ待ち(INTERRUPT_WAIT)から
> 戻ってからGPIOを連続で読出しGPIOが「H」になるまでの時間を計ってみると
> 機能の有効と無効で時間的な差が認められませんでした。
> 予想では機能を無効にするとGPIOが「H」になるまでの時間が長くなると思っていました。
> 
> デバイスドライバの使用法に問題があるのでしょうか。
> どのように解決すれば良いのかのご教授頂きたく投稿させて頂きました。
> 
> 以上、よろしくお願いします。
> 
> 
> _______________________________________________
> armadillo mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo


-- 
______________________________________

株式会社アットマークテクノ
開発部
伊藤 透(いとう とおる)

TEL: 011-207-6550 FAX: 011-207-6570
URL: http://www.atmark-techno.com/
E-mail: email@hidden
______________________________________




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