5

AT91SAM9M10-EKES評価ボードでGPIOIRQをプログラムしようとしています。IRQの登録に成功し、IRQが機能しています。ただし、一部の割り込みは失われます。26を送信していますが、22しか取得できません。

コード:

static irqreturn_t wiegand_interrupt(int irq, void *dev_id){
  atomic_inc(&counter);
  printk(KERN_WARNING "IRQ recieved, counting... %d\n",atomic_read(&counter));
  return 0;
}
irq1 = gpio_to_irq(AT91_PIN_PA21);
if (irq1 < 0) {
    err = irq1;
    printk("Unable to get irq number for GPIO %d, error %d\n",AT91_PIN_PA21, err);
    goto fail;
}

err = request_irq(irq1,wiegand_interrupt,0 ,"wiegand",NULL);

irq2 = gpio_to_irq(AT91_PIN_PA20);
if (irq2 < 0) {
    err = irq2;
    printk("Unable to get irq number for GPIO %d, error %d\n",AT91_PIN_PA21, err);
    goto fail;
}

err = request_irq(irq2,wiegand_interrupt,0 ,"wiegand",NULL);

これはドライバー全体ではありませんが、これはIRQを処理する実際の部分です。誰かがコードに問題を見つけた場合、または私が4つの割り込みを失った理由を知る方法を提案できる場合は、返信してください。私はこれに何時間も立ち往生しています...:(

ありがとう。ラモン。

4

2 に答える 2

4

外部システム(おそらくマイクロコントローラーまたはGPIOSを切り替えることができるもの)で割り込みをトリガーしていると思います。割り込みの実際の確認が表示されないため、外部システムは、割り込みが処理されるのを待たずに、新しい割り込みをトリガーする可能性があると思います。

printkは非常に遅い関数であるため、一部の割り込みを見逃す可能性があります。前の割り込みを処理しているときに、新しい割り込みをトリガーできます。

したがって、ハンドラーでprintkを使用しないことをお勧めします。このようなことを実現したい場合は、割り込みハンドラの下半分としてタスクレットまたはワークキューを使用することをお勧めします。

Linuxデバイスドライバーの第10章を読むことをお勧めします。

ちなみに、IRQハンドラーは0ではなくIRQ_HANDLEDを返す必要があります。

于 2011-08-18T06:58:15.297 に答える
1

実際、問題はGPIOピンを使用したことですが、GPIOピンはIRQF_TRIGGER_FALLINGフラグをサポートしていません。これはまさに私が必要としているものです。したがって、おそらく、割り込みハンドラは信号を正しく認識しません。IRQF_TRIGGER_FALLINGがIRQを有効にするために外部ピンを使用する必要があることがわかりました。

于 2011-08-18T06:49:37.657 に答える