« U-Bootの起動中に買ってにキー入力がされてブートが止まってしまう | トップページ | VisualC++でDLLを作るときのランタイムライブラリ/MT /MTd /MD /MDdの指定 »

2023.08.01

CP2104の誤動作?ZYNQの誤動作?

U-Bootの起動中にHit any keyのところで勝手にキーが押されて(シリアルに文字が送られて)起動が止まってしまう問題で、進展がありました。

この現象が起きているときには、

common/autoboot.cの

static int abortboot_single_key(int bootdelay)

という関数がカウントダウンとキー入力を受け付けている関数なのですが、

if (tstc()) { /* we got a key press */
getchar(); /* consume input */
puts("\b\b\b 0");
abort = 1; /* don't auto boot */
}

というところであらかじめキーが押されていたかを判定しています。

しかし、この前に、

flush_stdin();

をしてもダメなのです。

flush_stdin()で入力バッファをフラッシュしているはずなのに、それでも謎の文字列が入力されてカウントダウンが止まってしまいます。

そこで、どのような文字列が入力されているかを調べてみたところ、

Buffer=65 bytes,[2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 3E EE 2E C9 C9 72 2E C9 F9 EE 3E F9 FF 7E FE FF FE 0A 0D 0A 0D 53 55 43 43 45 53 53 46 FF ]

Buffer=65 bytes,[2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E FE ]

Buffer=65 bytes,[2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 6D ]

Buffer=65 bytes,[2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 3E EE 2E C9 F9 EE 3E FF FF 0A 0D 0A 0D 53 55 43 43 45 53 53 46 55 4C 5F 48 41 4E 44 4F 46 C6 0D 0A 0D 0A 55 2D 42 6F 6F 74 20 3E 30 45 FA ]

Buffer=65 bytes,[2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 3E EE 2E C9 C9 72 3E C9 F9 72 FE EF 0A 0D 0A 0D 53 55 43 43 45 53 53 46 55 4C 5F 48 41 4E 44 4F 46 46 FF 0A 0D FF ]

という感じでした。2Eが多いのですが、2Dというのは.....(ピリオド)です。

そして、バッファは65バイトのことがおおく、中に文字列のようなものが見える場合があります。

この文字列を解読すると、SUCCESSFUL_HANDOFFと読めるではないですか!

しかも、0x0d 0x0aという改行の文字列まで見えます。

 

つまり、FSBLが送ったSUCCESSFUL_HANDOFFという文字列をCP2104が受信して、それを送信側に送り返してきている!???という謎の現象であることがわかりました。

 

回路図を見ながら徹底的にデバッグしていると、Cosmo-Z Mini2の新基板ではCP2104の電源をUSBから取ることにしているのですが、USBが挿さっていないとCP2104に電源が供給されない回路になっていました。

すると、CP2104のTX(CP2104からみた送信)ポートは常にLになりつづけてしまい、ZYNQのUART RXはLが与えられ続けられます。UARTでLは信号ありですから、ずっと00の信号が与えられているような形になります。オシロで見たところCP2104がエコーバックしているということはなかったのですが、ZYNQはなぜか送信データの一部を受信データとして解釈してしまうようで、それが原因でブート時のカウントダウンが止まってしまうようでした。

ただし、この現象が起きるZYNQは1つだけだったので個体差なのかもしれません。

基板のピンヘッダをジャンパして、USBが挿さっていなくてもCP2104に電源が供給されるようにしたところ、TXは起動時にHになり、問題はすべて解決しました。

 

|

« U-Bootの起動中に買ってにキー入力がされてブートが止まってしまう | トップページ | VisualC++でDLLを作るときのランタイムライブラリ/MT /MTd /MD /MDdの指定 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« U-Bootの起動中に買ってにキー入力がされてブートが止まってしまう | トップページ | VisualC++でDLLを作るときのランタイムライブラリ/MT /MTd /MD /MDdの指定 »