Armadilloフォーラム

特定操作でコンソールを切り替えたい

miyamoto

2019年4月24日 18時40分

いつもお世話になっております。宮本と申します。
A640のコンソールについて、通常はCON9(UART1)をコンソールとして使用し、
タクトスイッチを押下しながら電源を投入した場合は、CON3(UART3)に切り替えたく、u-bootのソースを確認しています。
現在、ベースのCON9(CONFIG_CONSOLE_UART1=yの状態)からCON3への切り替えがうまくいかない状況です。
何かご助言いただけないでしょうか。

[環境]
製品:Armadillo-640
OS:Debian stretch
Linux:4.9.0-8-686-pae (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.110-3+deb9u6 (2018-10-08)

[調査状況]
1)u-boot/.configでコンソールはUART1かUART3か定義されており(CONFIG_CONSOLE_UART1、CONFIG_CONSOLE_UART3のどちらがy)
  u-bootビルド時点で片方の定義が決め打ちになっている
2)u-boot/include/configs/armadillo-640.hで1)に基づき、CONFIG_MXC_UART_BASEにUART1_BASEまたはUART3_BASEが定義される
3)u-boot/drivers/serial/serial_mxc.cで2)のCONFIG_MXC_UART_BASEをmxc_uart構造体にキャストしてmxc_baseに定義されている

単純にCONFIG_MXC_UART_BASE=UART1_BASE(UART3_BASE)と考えて、serial_mxc.cでmxc_base1とmxc_base3をdefineで追加し、
それぞれにmxc_uart構造体にキャストしたUART1_BASE、UART3_BASEを定義してみましたが、うまくいきませんでした。
(UART1からもUART3からも出力されない)

u-boot/drivers/serial/serial_mxc.cを修正したものを添付します。
.configではCONFIG_CONSOLE_UART1=yの状態で、serial_mxc.cでUART3_BASEを定義したmxc_base3を無条件で処理するように
(切り替え動作がOKであれば、ここにタクトスイッチ押下の有無の分岐を追加する予定)
修正しています。ビルドはとおりました。
!!本修正ソースをビルドしたu-boot.imxをArmadilloに適用するとCON9、CON3どちらも出力されなくなります!!

ファイル ファイルの説明
serial_mxc.c
コメント

中村です。

> A640のコンソールについて、通常はCON9(UART1)をコンソールとして使用し、
> タクトスイッチを押下しながら電源を投入した場合は、CON3(UART3)に切り替えたく、u-bootのソースを確認しています。

drivers/serial/serial_mxc.cの他に、
board/atmark-techno/armadillo-640/board_early_init_f.cも
修正する必要がありそうです。
(ざっとみたところでは、この他にはなさそうですが、
もしかしたら、他にもあるかもしれません)

添付されていたserial_mxc.cの次の部分、

#define mxc_base        ((struct mxc_uart *)CONFIG_MXC_UART_BASE)
#define mxc_base1       ((struct mxc_uart *)UART1_BASE)
#define mxc_base3       ((struct mxc_uart *)UART3_BASE)

私だったら、この部分は次のようにします。

//#define mxc_base        ((struct mxc_uart *)CONFIG_MXC_UART_BASE)
// 上のdefineを消して下のものに置き換え
// デフォルトはUART1
static struct mxc_uart *mxc_base = (struct mxc_uart *)UART1_BASE;
...
static int mxc_serial_init(void)
{
   // ↓ここから
   if (タクトSWが押されている) {
      // CON3
      mxc_base = (struct mxc_uart *)UART3_BASE;
   }
   // ↑ここまでを追加
 
   _mxc_serial_init(mxc_base);
   ...
}

このようにすれば、serial_mxc.cの他の部分には
手を入れなくて済みそうです。

--
なかむら

中村様

お世話になります。宮本です。
早速のコメントありがとうございます。

> drivers/serial/serial_mxc.cの他に、
> board/atmark-techno/armadillo-640/board_early_init_f.cも
> 修正する必要がありそうです。
ご指摘のとおりです。
調査段階で認識していましたが、実際の修正時に失念していました…
grepを行った結果では上記を含めて他には見当たりませんでした。

コメント頂いた修正内容を参考にもう一度実装を行ってみます。
結果についてはこちらでまた報告させてください。
取り急ぎ返信となります。

以上です。

中村様

お世話になります。宮本です。
大変遅くなりましたが、本件につきまして、無事にU-Bootの実装ができましたのでご報告です。
(タクトスイッチ押下のイベントのもちまわりで苦戦していました)

UART1からUART3の切り替えについてはご助言いただいた内容にて問題なく動作できており、
board_early_init_f.cでタクトスイッチのイベントを取得、グローバル変数で状態を保持した状態で、
serial_mxc.cで状態をチェックし、UART3へ切り替えるかの分岐を行いました。

今回もご助言頂きありがとうございました。

以上です。

宮本さん、
中村です。

> 大変遅くなりましたが、本件につきまして、無事にU-Bootの実装ができましたのでご報告です。

「たぶんこれだろう・・・」と動作未確認で書きましたが、
あれでOKだったようですね。報告、ありがとうございます。

> (タクトスイッチ押下のイベントのもちまわりで苦戦していました)

先日のあの投稿の前にソースを見たときに、
board_early_init_fと、serial_mxc.cのmxc_serial_init(void)が
どこからコールされるのかまでは調べ切れなくて、
どうやって情報を渡すかなぁ?と思っていた部分でした。

> board_early_init_f.cでタクトスイッチのイベントを取得、グローバル変数で状態を保持した状態で、

この方法なら、調べるのも改造も楽ですね。

--
なかむら