シリアルインターフェイス使用時のArmadillo起動中の動作について

お世話になっております。

シリアルインターフェイス1(ttymxc1)をコンソール出力と外部機器とのRS-232C通信兼用で使用しています。
通信が干渉を避けるため、起動後のコンソール出力は停止するように/etc/inittab内で以下のようにコメントアウトしています。

#::respawn:/sbin/getty -L 115200 ttymxc1 vt102

ブートローダー動作中は起動ログが出力されています。
この時に、外部機器が接続されていない場合は40sec程度で起動します。しかし、外部機器を接続した状態だと起動に2~3分程度掛かる場合があります。(起動中に外部機器から何か送信して来ることはありません)
また、その際の起動ログの内容も異なります。(それぞれの起動ログを添付させて頂きます)

ブートローダー動作中のコンソール出力も停止すれば外部機器を接続した状態でも40sec程度で起動します。(これで解決はしますが、ブートローダーへの変更適用が煩雑となるので、可能な限り避けたいです)

なぜこのような現象となるのか、対策はあるのか、教えて頂けないでしょうか?

よろしくお願い致します。

製品: 
Armadillo-410

溝渕です。

> この時に、外部機器が接続されていない場合は40sec程度で起動します。しかし、外部機器を接続した状態だと起動に2~3分程度掛かる場合があります。

外部機器を接続するかどうかで挙動が変わるため、外部機器が何をしているのかが気になるところです。

> (起動中に外部機器から何か送信して来ることはありません)

外部機器から何も送信しないことは、どのように確認されましたか?外部機器のTX(ArmadilloのRX)の波形の確認でしょうか?

溝渕様

ご回答ありがとうございます。

RS-232Cのインラインモニターで確認する限りは何も送信されていません。
外部機器のプログラム上も何も送信してません。
ハードウェア的にノイズのようなものが入って問題になることはあるでしょうか?

よろしくお願い致します。

溝渕です。

> RS-232Cのインラインモニターで確認する限りは何も送信されていません。
> 外部機器のプログラム上も何も送信してません。

外部機器のTX(ArmadilloのRX)は常時High論理になっているという理解で宜しいでしょうか?

> ハードウェア的にノイズのようなものが入って問題になることはあるでしょうか?

ノイズが入りUARTのフレームエラーが発生しても、実質的には何もしない実装になっています。

溝渕様

ご回答ありがとうございます。

通信していない状態で、外部機器のTXとGND間の電圧をテスターで測った所、-5Vとなっていました。
この情報でよろしいでしょうか?

よろしくお願い致します。

溝渕です。

> 通信していない状態で、外部機器のTXとGND間の電圧をテスターで測った所、-5Vとなっていました。
> この情報でよろしいでしょうか?

テスターでは波形は確認できないので、可能であればオシロスコープ等で
Armadillo起動時の波形をご確認いただきたいと思います。

外部機器から何も送信していないのであれば、波形は一切動かないはずです。

溝渕様

本日は機材の準備ができませんので、準備できましたら確認して回答させて頂きます。
よろしくお願い致します。

溝渕様

オシロスコープで確認した所、Linuxの動作開始のタイミングで外部機器のTxにスパイク状のピークが数回入っていました。
起動ログ出力を切るとこのピークは消えていましたので、これが原因になっている可能性が高いです。

外部機器のプログラムでは送信処理を行っていないので、外部機器側のプログラム変更で防ぐことは難しそうです。

起動中にArmadilloに対して信号が入ることで今回のような現象は出るものでしょうか?
Armadillo側で対策する方法は無いでしょうか?
とりあえず現状、2~3分待てば起動しますので、この程度の時間であれば起動後の動作に支障が無いのであれば問題無いです。

溝渕です。

> オシロスコープで確認した所、Linuxの動作開始のタイミングで外部機器のTxにスパイク状のピークが数回入っていました。
> 起動ログ出力を切るとこのピークは消えていましたので、これが原因になっている可能性が高いです。

外部機器のTxのみ切断することは可能でしょうか。

現状、次のように接続されていると思いますが、

Armadillo Tx ------ Rx 外部機器
          Rx ------ Tx

次のように外すことはできますか。

Armadillo Tx ------ Rx 外部機器
          Rx Tx

これができると、それぞれをオシロスコープで確認することによって、スパイ
ク状のピークをどちらが出力しているかがわかります。

> 起動中にArmadilloに対して信号が入ることで今回のような現象は出るものでしょうか?
> Armadillo側で対策する方法は無いでしょうか?

現在までに判明している情報からだけでは、思い当る対策はありません。原因
が明確になれば対策は可能と思います。

溝渕様

ご回答ありがとうございます。

以下のようになりました。

・ArmadilloのRxピンを外して外部機器のTxピンで計測した場合
 →接続されている場合と同じでLinux起動時にスパイク状のピークが発生した

・外部機器のTxピンを外してArmadilloのRxピンで計測した場合
 →ピークは出ませんでしたが、代わりにノイズのような成分が発生しました。これは外部機器のRxピン、GNDピンも外した際には消えました。

ノイズ成分の発生理由は良く分かりませんが、外部機器からスパイク状ピークが発生しているように見受けられます。

溝渕です。

ご確認有難うございます。

ここまでの現象を纏めると、

1. Armadilloの起動ログの出力を受けた外部機器が、スパイクノイズを発生させる
2. Armadilloはスパイクノイズの影響で、起動が遅くなる

のようになると思います。

外部機器に変更を加えることができないとなると、Armadilloで対策するしか
無いと思います。

そのためには、なぜArmadilloの起動が遅くなるかを調査する必要があります。

まず、外部機器が出力するノイズの波形を(オシロスコープの画面キャプチャ
等で)教えていただけますか?

1画面に収まらない場合は、ノイズの発生頻度も合わせてご教授ください。

溝渕様

オシロスコープの画面キャプチャを添付させて頂きます。

Linuxの起動中、画面と同じような頻度でずっと発生していました。

よろしくお願い致します。

ファイル名 ファイルの説明
TEK0001.png

溝渕です。

ご対応有難うございます。

> オシロスコープの画面キャプチャを添付させて頂きます。

シリアルインターフェイス1(ttymxc1)と外部機器は、RS232Cレベル変換IC経由
で接続されていると思います。

ご利用のICは、添付いただいたャプチャ画像の最大電圧(およそ+1.5V)をHigh
判定する仕様でしょうか?

上記ご確認いただくか、Armadilloのシリアルインターフェイス1のRxピンを直
接キャプチャした波形をご提供いただくことは可能でしょうか。

溝渕様

IC(MAX3232CUE+)のデータシートを確認した所、「Input Threshold High」に1.5Vと記載されていましたので、1.5VをHigh判定する仕様となっていると思います。
よろしくお願い致します。

溝渕です。

起動中のArmadilloへ0xffを送り続けてみましたが、起動が遅くなる現象が再
現できませんでした。

何度も申し訳ございませんが、Armadilloのシリアルインターフェイス1のRxピ
ンを直接キャプチャした(パルス幅がわかるような)波形をご提供いただけます
でしょうか。

また、ご利用のHermit-AtおよびLinuxカーネルは、nic-segawa様がビルドした
ものと思われますが、変更箇所を示すパッチをご提供いただくことは可能でしょ
うか。

溝渕様

調査頂きありがとうございます。

ひとまずパルス幅が分かる波形を添付します。

パッチの方は作成後に添付致します。

ファイル名 ファイルの説明
TEK0000.png

溝渕様

ファイル数が多くなりましたが、変更箇所のpatchファイルを添付します。

この他、カーネルコンフィギュレーションを以下の通りに変更しています。

Linux Kernel Configuration
   System Type
     Freescale MXC Implementations
       MX25 Options
         Armadillo-400 Board options
   以下チェック入れる
   Enable UART3 at CON11
   Enable I2C2 at CON14
   Enable SPI3 at CON9
   Enalbe SPI3_SS0 at CON9_16 (NEW)
   Enalbe SPI3_SS1 at CON9_18 (NEW)
   
   それ以外はチェック外す
  
  Device options
   以下チェック入れる
   I2C1 module
   eSDHC1
   PWM1
   PWM3
   
   それ以外のチェック可能箇所はチェック外す
          Device Drivers
     SPI support ←チェック入れる
      Bitbanging SPI master ←チェック入れる
      MXC CPSI controller as SPI Master ←チェック入れる
      User mode SPI device driver support ←チェック入れる
            Block devices
  Default RAM disk size (kbtes) ←80000に設定

よろしくお願い致します。

溝渕です。

ご対応有難うございます。

パッチの内容を確認しましたが、本問題に関係しそうな修正は見当りませんでした。

こちらで同様の現象が再現できると、いくつかアドバイスできることもあると
思いますので、すみませんがもう少しだけ質問させてください。

RS232Cレベル変換ICのi.MX25(TTLレベル)側のRxのオシロスコープのキャプチャ
画像をご提供いただくことは可能ですか。

溝渕様

詳細に調査頂きましてありがとうございます。

オシロスコープのキャプチャ画像を添付します。

よろしくお願い致します。

ファイル名 ファイルの説明
TEK0002.png

溝渕です。

ご対応有難うございます。

こちらでは未だ再現できていません。すみませんが2点確認させてください。

- 外部機器を接続した状態でArmadilloのブートローダーを保守モードで起動し、外部機器を外してからArmadilloのLinuxを起動した場合にも起動が遅くなるか
- 添付いただいた波形(スパイクノイズ)以外の波形は出力されていないか

溝渕様

調査頂きありがとうございます。

新しく分かったことがありますので、お知らせさせて頂きます。

スパイク状のノイズは毎回出るのですが、実際に起動が遅くなる際は挙動が異なりました。

起動が遅い際の起動ログを添付します。
途中からBL(0x07)が出力され続けています。

また、スパイク状の短い信号に加えてより長い時間の信号が出ていました。(キャプチャー画像添付します)
短い信号と長い信号が交互に出ていました。
起動が完了するまで継続していました。

これで何か分かりますでしょうか?

ファイル名 ファイルの説明
起動ログ.txt
TEK0003.png

溝渕様

念のためにArmadillo-410開発キットを使用した際にも現象が起こるかの確認をしてみました。
試した所、3回目の起動で現象が起こりました。

ブートローダー、カーネル、ユーザーランドは以下を変更しない状態で使用しました。

・ブートローダー:loader-armadillo4x0-v2.4.0.bin
・カーネル:linux-2.6.26-at29から作成したlinux.bin.gz
・ユーザーランド:romfs-qt-20121105.img.gz

setenvコマンドでRAMDISKのサイズを61440KBに変更しています。

よろしくお願い致します。

溝渕です。

以前質問させていただいた、

> - 外部機器を接続した状態でArmadilloのブートローダーを保守モードで起動し、外部機器を外してからArmadilloのLinuxを起動した場合にも起動が遅くなるか

についてはご確認いただけましたでしょうか。

溝渕様

> - 外部機器を接続した状態でArmadilloのブートローダーを保守モードで起動し、外部機器を外してからArmadilloのLinuxを起動した場合にも起動が遅くなるか

Armadillo-410開発キットを使用して、以下の手順で確認しました。

1. 外部機器を接続した状態で保守モードで起動
2. 外部機器を取り外し
3. "hermit> b"コマンドで再起動

10回程度試しましたが、起動が遅くなることはありませんでした。

よろしくお願い致します。

溝渕様

申し訳ありませんが、この件に関してそろそろ結論を出す必要が出てきました。
問題解決の目処は立ちそうでしょうか?

もし難しいようでしたら、有償となっても構いませんので、外部機器をお送りして調査してもらうことは可能でしょうか?

対応自体が難しい場合はコンソールを停止することを解決手段として検討します。

お手数ですが、よろしくお願い致します。

溝渕です。

回答が遅くなり申し訳ございません。

Armadilloの起動中にBL(0x07)を受信し続けることで、起動が遅くなる現象が
確認できました。

他の文字、例えばG(0x47)でも同様の現象が確認できた為、恐らくUART受信お
よびループバック処理に時間がかかっているものと思います。

この場合、console停止がスマートな回避方法になるかと思います。

保守モードで、以下のコマンドを入力後に動作確認いただくことは可能でしょうか。

hermit> setenv console=none

元の状態に戻す為には、以下のようにコマンドを入力します。

hermit> clearenv

溝渕です。

原因の調査、ありがとうございました。

コンソールの停止で起動が遅くならないこと確認できました。

コンソールを停止した際の動作に関して以下の2点質問させてください。

・コンソール停止時に起動ログがLCDに表示されるようになりました。別の画像を表示させているので、止めたいのですが、可能でしょうか?
 カーネルコンフィギュレーションで以下の設定項目のチェックを外しましたが、止めることができませんでした。

Device Drivers --->
  Graphics support --->
    Console display driver support --->
      <*> Framebuffer Console support
      [ ] Map the console to the primary display device

・環境変数の変更では無く、ブートローダーのソースコード変更等でコンソールを停止できないでしょうか?
 環境変数の変更は1台ずつの対応が必要になると思いますが、ブートローダーの変更であればROMイメージ書き込みサービスで対応済みのデータを書き込んでもらうことで対処できるので、その方が容易になります。

よろしくお願い致します。

溝渕です。

> ・コンソール停止時に起動ログがLCDに表示されるようになりました。別の画像を表示させているので、止めたいのですが、可能でしょうか?
>  カーネルコンフィギュレーションで以下の設定項目のチェックを外しましたが、止めることができませんでした。
>
> Device Drivers --->
> Graphics support --->
> Console display driver support --->
> <*> Framebuffer Console support
> [ ] Map the console to the primary display device

上記で正しいと記憶していますが、停止しませんか?

イメージのビルド/書き込みが正しく行なわれていることを確認してみてください。

> ・環境変数の変更では無く、ブートローダーのソースコード変更等でコンソールを停止できないでしょうか?

可能です。

hermit-atのmenuconfig画面で、Consoleの値を"ttymxc1"から"none"に変更し
てください。

Target Configurations --->
  Support Devices --->
    Console (ttymxc1) --->

溝渕様

ご回答ありがとうございます。

Armadilloが余計な文字を受信し続けることが起動が遅くなる原因となっているという報告を頂いたことから、再度外部機器側を社内にて詳細調査しました。
結果、余計な信号を出力してしまう原因となっている箇所を特定できました。
対策を施して動作確認を行った所、起動が遅くなる現象は解消しました。

外部機器側の変更を最終対策とさせて頂きます。

長らく調査にご協力頂きまして誠にありがとうございました。