共有IRQが正しく機能しない

共有IRQが正しく機能しない

マザーボードにある6つのシリアルポートのうち4つを使用できません。

状況は次のとおりです

ttyS0からttyS5まで6つのシリアルポートを使用できます。そのうちの0つはマザーボードの端にあるRS232ポートで、残りの5つはマザーボードに直接接続されたシリアルヘッダです。標準のBIOS構成では、これらのマップは次のとおりです。

  • ttyS0: IRQ 4
  • ttyS1:IRQ 3
  • ttyS2: IRQ 10
  • ttyS3: IRQ 10
  • ttyS4: IRQ 10
  • ttyS5:IRQ 10

Linuxでは、dmesgを使用して正しく報告して初期設定方法を確認し、seterialコマンドを使用してこれらの値を変更できます。起動中にIRQ、速度、およびその他の設定を自動的に構成できるように、起動時に実行されるスクリプトにこれを作成しました。 2-5ではIRQ 10しか使用できないため、BIOSのほとんどを変更できません。

ただし、この構成では、Pythonスクリプトを使用して1つのポートから別のポートに(または外部PCから)100,000文字を転送すると、4つのポートでIRQ 10を共有することは機能しません。カーネルでIRQ共有が有効になっていますが、この機能をサポートするGPIOチップがあります(Fintek F81866A)。通常、Pythonプログラムはポートオープンライン(読み取り/書き込み)でロックされています。 ttyS0 と ttyS1 は同じスクリプトを使用して正しく実行され、実際に以下のすべてのテストは同じコードを使用します。あるスクリプトはポートを開いて情報を待ち、他のスクリプトは100,000個のランダムな文字を生成して情報を送信します。両端の情報が同じであることを確認する基本的なチェックがあります。

IRQ 0(ポーリングモード)に切り替えると機能を実行できますが、速度と安定性はそのアプリケーションには適していません。 2-5のいずれかをIRQに変更してそれをttyS0に接続すると、IRQ(4)を共有するときに正常な機能が得られますが、ttyS0が非アクティブの場合(たとえば、外部システムからttyS2に移動 -5)、IRQ 10に設定した場合と同じ動作です。

私が実行した唯一の注目すべきテストは、BIOSの最後の3つのポートを無効にして、ttyS2がIRQ 10の唯一のポートになるようにすることでした。この時点では、ttyS0 と 1 と同じ速度で正しく実行されました。私にとって、これは問題が特に共有割り込みにあることを意味しますが、ポートを別の空のIRQ(正しく覚えている場合は11と12)に移動しようとすると改善はありません。

特に、PythonスクリプトがIRQ 3とIRQ 4を実行して割り込みを観察すると、期待どおりに機能し、必要に応じて割り込みが発生します。ただし、IRQ 10に設定されている他のポートの1つを呼び出そうとすると例外が発生します。ポートを開くときは最初です。 1 つのポートだけが IRQ 10 を使用している場合、割り込みは 3 と 4 の割り込みと同じように動作します。

私はなぜこれが起こるのかを調べるためにいくつかの方法を試してみましたが、Fintekチップが原因であるという確信がますます大きくなっています。マイカーネル(3.19)の設定とドライバで以前のFintek製品への参照が見つかりますが、この製品は見つかりません。チップに問題があると思ったもう一つの理由は、マザーボードにも奇妙な半機能状態のGPIOヘッダがあったからです。そこにあることがわかり、IDを正しく取得できますが、実際にアクセスしたり、この範囲外で使用したりしないでください。

この問題を解決するにはどのようなオプションが必要ですか? Fintek IOコントローラにいくつかの互換性の問題がある可能性がありますか?私は現在、必要に応じてF81866Aのネイティブサポートがあることを確認するために最新のカーネルバージョンをインストールしています。これを駆動するために直接何かを書いた経験はありません。

ベストアンサー1

おすすめ記事