PS3 Linux 起動時画面モードの謎に兆戦

カスタム 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 になりました。