MIPSなSOCが入ったルータにはほとんどシリアルポートがあります。これはu-bootの操作やkernelのログを確認するためにあります。
このシリアルポートにGPSやWi-SUNなどのデバイスを接続して起動するとu-bootが出力した内容に反応したデバイスからの出力でu-bootがハングしたりしてうまく動かなくなる事があります。
SOC自体は2ポートのシリアルを持っている事もありますが、二つ目のポートが出ているケースほとんどありません。
このため以下の様な回路を考えました。
GPIOはLEDなどから取り出し、起動後LOの場合は74HC126でHIの場合は74HC125を使うと良いです。74HCなICを使えば3.3Vでも大丈夫です。
シリアルはハイインピーである必要も無く、ANDの応用ロジックでも同じような事ができると思うのですが、考えるのが面倒だったのと手持ちがあったので、3ステートバッファで実現してみました。
これでgpioctlでコントロールするまでシリアルに接続されたデバイスは非アクティブな状態となります。
この他にgettyが起動しないように/etc/ttysのコメントアウトしてkill -HUP 1もお忘れなく。
しかし30年近く同じような事やってるな。。。
追記
consoleのメッセージを別の出力として確認したい場合で、2つuartがある場合は使っていない方をconsoleとしておくのが良いです。
起動後であればconscontrolコマンドでdelete ttyu0するとメッセージは出なくなります。
デバイスのTX,RXの接続ではなく電源をコントロールする方法もあります。きむ茶工房ガレージハウスさんのトランジスタをマイコン出力のスイッチとして使う方法が参考になります。
GPIOでコンロトールできない場合は電源を遅延させる方法もあります。投入後30秒くらいすればブートからOSに制御が移っているので555などで(マイコンでも良いかも)遅延回路を作って上のスイッチ回路と組み合わせます。この仕組みはリブートはしない事が前提になります。
デバイス側もプログラムできるのであればデバイスがある特定文字列を受け取るまで、全て無視するような仕組みでも良いかもしれません。
ロウテクでスイッチを付けて起動後にONにするという方法もありますね。
RT3050などは二つ目のuartをpinコントロールで有効にする事もできます。
二つ目のポートはNTPDのセンテンスの受信のようにRXだけでよいケースと、Wi-SUNのように、RX,TX両方必要なケースがあります。
いろいろ調べていたら、二つ目のuartが使えるケースが多くなったので、このように無理やり使うことは無くなりました。