2010年10月26日
シリアルコンソールをUART0からUART1に変更する(Linuxカーネル編)
デバッガでカーネルログのバッファを直接見る
まずはシリアルコンソールに頼らずにメモリを直接デバッガ見てみます。
printk.c の中の
static char __log_buf[__LOG_BUF_LEN];
がカーネルログのバッファの実体なので、このメモリを直接デバッガで見れば、とりあえずどこまで動いているかがわかります。
シリアルコンソールをUART0からUART1に変更する
デバッガでシリアルデバイスを初期化しているところなどを追いかけたのですが、結局は使用するポートをURAT0からUART1に変更するよりも、UART0とUART1の両方を生かしておいて、カーネルのブートパラメータでどちらを使うかを選択するほうが変更量が少なくてすみました。
カーネルのコンフィグの変更
以下の2つの項目が1になっていたらこれを2以上に変更します。
CONFIG_SERIAL_8250_NR_UARTS=2 CONIFG_SERIAL_8250_RUNTIME_UARTS=2
ボード固有の初期化関数でUART0とUART1を初期化する
arch/arm/mach-xxx のディレクトリにあるファイルでこれを行います。具体的にはシリアルのボーレイト用のクロックの再設定やリセットの解除です。
カーネルのブートパラメータ
起動時にセットするカーネルのブートパラメータでconsoleの設定をttyS0からttyS1に変更します。
console=ttyS1,115200n8n
以上です。わかってしまえばどうということはないのですが。
実際の作業ではLANが一発で動いていて、シリアルコンソールにまだ何もでないのに、NFSでrootをマウントして、sshでログインできるところまでいっていました。
(追記) UbuntuでttyS1にgettyを開く
Ubuntu 10.04でttyS1にgettyのプロンプトが出るようにするためには少し追加が必要でした。
/etc/init/tty1.conf を /etc/init/ttyS1.confにコピーして、"tty1"を全て"ttyS1"に置換し、ボーレイトを115200に変更します。
/etc/init/ttyS1.conf
# ttyS1 - getty # # This service maintains a getty on ttyS1 from the point the system is # started until it is shut down again. start on stopped rc RUNLEVEL=[2345] stop on runlevel [!2345] respawn exec /sbin/getty -8 115200 ttyS1