カスタム kboot を作って簡単に書き込めることがわかったので、起動時の画面
モードをもっと何とかできないか調査しています。
カーネルのソースを見ていくと、
drivers/video/ps3fb.c
ps3fb_probe()
の中で最初の画面モードを設定していることがわかります。
モードは ps3fb_mode に入ります。この値の初期値は 0 ですが、
ps3fb_init()
で ps3av_get_mode() を呼び出して画面モード値を取得しています。
もし起動時にカーネルオプション ( video=ps3fb:mode:3 とかのあれ) があれば、
その直後にオプションで指定された値で上書きします。
最初の kboot のブートローダー呼び出しではオプションは NULL でした。
なので ps3av_get_mode() の値が有効です。
この関数は
arch/powerpc/platforms/ps3fp/ps3av.c
の中にあります。
ここでわかったのは、起動時にシステム側からモニタの設定らしき値を受け取って
いて、一応自動で画面モードを判定しているということ。
だとしたら GAME-OS 側で設定した条件にしたがって初回の画面モードを選ぶだけで
いいような気がします。
GAME-OS 側では「D端子/コンポーネント」の選択もあるし、さらに使用可能な
解像度も登録できます。この中で一番大きな解像度で表示されるのが理想です。
実際のコードを見ると、
・HDMI の場合
・HDMI じゃない場合 (AV MULTI)
の2種類の判定を行っています。
原則として HDMI の場合はデフォルトとして 480p を、それ以外の場合は
480i が選ばれるようです。(60/50Hz の区別もある)
得られる構造体パラメータを見ても、ヘッダのシンボルを見ても、どうも
「D端子/コンポーネント」の区別がつきません。デジタル と アナログ の
区別のみです。
使用可能な解像度の Bit 情報も受け取っていますが、値をダンプしてみても
実際にコードを書いて試してもうまくいきません。
HDMI じゃない場合 (AV MULTI の場合) はきちんと値が格納されていないようです。
もしかしたらこれは GAME-OS 側で設定した config の値ではなくて、
直接デバイスに問い合わせて得られるパラメータなのかもしれません。
もしそうなら、デジタルかつ新しい規格の HDMI ではモニタ側の情報がわかるけど、
D端子 や コンポーネントでは 区別できないのもなんとなく納得できます。
仕方ないのでとりあえず、画面モードの固定値を埋め込んでみます。
kboot-20061208/kboot-10/linux-2.6.16/arch/powerpc/platforms/ps3fp/ps3av.c
の中の auto_videomode() の戻り値を好きな画面モードに書き換えた
otheros.bld を作ってシステムに登録すれば、最初の boot 画面からきちんと
ハイレゾで表示されることがわかりました。
具体的には auto_videomode() の一番最後の
return (vid2table_id(vid) | dvi | rgb);
を
return 3;
のように直接値にしてしまいます。これで最初から 3 = 720p になります。
固定値なので解像度ごとに otheros.bld を作らないといけないですね。
other-os-flash-util で書き込んでいるフラッシュメモリの空き領域を使って、
どこかに画面モード値を埋め込んでおけばいいのかもしれません。
otheros.bld (kboot) のコンパイル方法は前回の記事
「PS3 Linux カスタム kboot を作る」の手順どおりです。
一度 make した後にまたカーネルだけ再コンパイルする場合は、
kboot-10/root-meta/installed/linux
を先に消しておく必要があります。例えば今回は、こんなスクリプトを書いて
build &テストをしていました。
rm kboot-10/root-meta/installed/linux
make
gzip -9c kboot-10/linux > otheros.bld
できた otheros.bld をシステムにインストールするには、さらに
# /sbin/other-os-flash-util -B -g /dev/sdb otheros.bld
を実行します。
(注意点は「PS3 Linux カスタム kboot を作る」を参照にしてください)
・PS3 Linux で kboot をハイレゾにする
・PS3 Linux カスタム kboot を作る
と来て、3度目の挑戦でようやく本当のハイレゾ kboot になりました。