1

ARM プロセッサで組み込み Linux 3.2.6 を実行しています。デバイスの 4 つの USART ポートを制御するために、atmel のシリアル ドライバーの修正版を使用しています。カーネルでコンパイルされたドライバーを使用すると、すべて正常に動作します。しかし、代わりにドライバーをカーネルモジュールとして実行したいと考えています。必要な変更をすべて行い、内部ドライバーを無効にしましたが、すべて問題ないようです。4 つの tty デバイスが正常に登録され、すべてのプローブおよび初期化機能が正しく機能していることがわかります。

問題は次のとおりです。いずれかのデバイスに書き込もうとすると、「送信開始」関数が呼び出されますが、usart からの割り込みが発生するのを待ちます。そのため、書き込みがハングするだけで、ロジック アナライザーを使用すると、RTS がアサートされていることがわかりますが、tx ラインにバイトは表示されません。request_irq の呼び出しが成功することはわかっていますが、/proc/interrupts に irq エントリがまったく表示されません。ドライバーでは、request_irq を使用して、gpio ライン用の別の割り込みハンドラーを登録することも試みましたが、これは正常に機能します。

これはおそらく診断が難しい問題であることはわかっていますが、解決策を見つけるための正しい方向に導く可能性のある提案を探しています。説明が必要な場合はお知らせください。ありがとうございました

4

2 に答える 2

1

だから私はついに私の問題を修正しました。回答ありがとうございます。直接私の問題を解決したものはありませんでしたが、コードのさらなる調査を促しました。いくつかの試行錯誤の後、私はついにそれを機能させました。私はもともと、各usartのplatform_device構造を/mach-at91/xxx_devices.cからロード可能なモジュールに移動していました。何らかの理由で、構造がハードウェアにマップするための正しいデータを取得していなかったと思います。カーネルからシンボルを正しくリンクしていなかったため(エラーメッセージは表示されませんでした)、一部の登録関数はそうではありませんでした。呼ばれることさえあります。構造とplatform_device_register呼び出しをdevicesファイルに戻すことになりました。また、元のatmel_serial.cドライバーを使用して、コンソールのドライバーを組み込みのままにしておくことにしました。usartポートドライバーと競合しないように、devicesファイルと組み込みのatmel_serial.cファイルの両方でコンソールのplatform_device名を変更する必要がありました。usartsのplatform_deviceとplatform_driverの名前を「atmel_usart」以外から変更すると、usartの送信が失敗することがわかりました。理由はよくわかりませんが、atmel_usartのままにしておくので、うまくいきます。

私の問題に対応してくれた皆さんに改めて感謝します。

于 2012-12-04T18:21:09.363 に答える
1

この症状は、有効化されていない (またはオフになっている)周辺クロックのようなものです。デバイスはエラーなしで初期化でき、I/O 操作をセットアップできますが、デバイスは何もしません。それは死んだふりをします。I/O が開始されないため、完了を示す割り込みが発生することはありません。

arch/arm/mach-xxx/zzz_devices.c他に確認すべきことは、ファイル内の HW 構成構造の条件付きコンパイル ディレクティブです。
シリアル ポート構造が次のようになっていることを確認します。

#if defined(CONFIG_SERIAL_ATMEL) || defined(CONFIG_SERIAL_ATMEL_MODULE)

だけでなく

#if defined(CONFIG_SERIAL_ATMEL) 

補遺

私は間違っている可能性がありますが、クロックが CTS ピンに影響を与えて割り込みを発生させるべきではありませんよね?

違う。
これらのデジタル回路は同期ステート マシンです。クロックがないと、入力による状態変化を処理できません。
また、SoC と最新の uController は、ペリフェラル クロックをこれらの統合ペリフェラルのオン/オフ スイッチとして使用します。多くの場合、シリコン チップ上には、実際に使用できるよりもはるかに多くの機能 (周辺機器など) があります。これは主に、ボードへのピンの数が不十分なためです。そのため、消費電力を削減するために、未使用のデバイスへのクロックを無効にすることが採用されています。

あなたは割り込みに集中しすぎています。
解決可能な割り込みの問題はありません。それらは二次障害です。
送信しようとしたときの出力の欠如は、はるかに重要で明らかです。
根本的な原因は、おそらく USART デバイスの構成に問題があることです。なぜなら、ビットの送信は、構成済みで動作中の USART の自動操作だからです。
動作しない場合と動作する場合の違いが、ロード可能モジュール静的リンクである場合、根本的な原因は、私の 2 つの提案のような基本的な (そして些細な) ものになります。

また、 「ああ、そうです、私たちはすでにそれを知っていました」#if defined()と応答しなかったなど、「最初に私を修正してください!」という巨大な赤い旗を立てます。

補遺2

Atmelシリアルドライバーを使用してロード可能なモジュールとして構成/構築できないことを発見した後、この回答を削除したくなりますmake menuconfig(これは回答の半分の前提です)。(もちろん、モジュールの制限を克服するために、Kconfigファイルハッキングして、構成変数をブール値ではなくトライステートにすることができます。) OP にコメントを残しました。しかし、ファイル内のシンボルがどのように使用されているか (使用されていないか) を指摘する Stratton 氏へのコメントも残しておきたいと思いました。.config

于 2012-12-01T07:17:03.873 に答える