えぬえす工房
  • Search results
avatar えぬえす工房
2016/11/16

自前ビルドしたファミコンミニ向けLinuxカーネルでHDMI出力を復活させる

時代は自前ビルド

ファミコンミニで、自前ビルドのLinuxがとうとう動作しました。 Linuxカーネルのビルドは面倒な作業が予想されたので先延ばしにしてたわけですが(負け惜しみ風)、一応動作する方法が公開されたので良しとします。

とりあえず、自前ビルドを手元で追試してみましたが、正常に動作するカーネルが得られました。

動くカーネルを得るための技

動くカーネルを得るためのカーネルコンフィグは判明していますが、問題はinitramfsです。 デフォルトのカーネルコンフィグではinitramfsがgzipで圧縮されていることを期待しますが、ファミコンミニの元々のinitramfsはlzopで圧縮されています(展開したことある人ならわかるでしょうけど) そのため、initramfsをgzipで圧縮し直すかカーネルコンフィグの設定(CONFIG_HAVE_KERNEL_LZO)をいじらないと展開に失敗し、kernel panicを起こしてしまいます。

この記事を読んでいる人はおそらくinitramfsは書き換え前提だと思うので、ここでは展開したinitramfsを再びgzipにするためのコマンドを書いておきます。 一時的にファイルをroot所有に見せるためにfakerootコマンドを併用して、

$ cd path/to/initramfs/
$ find . | fakeroot cpio -o -H newc | gzip > initramfs.img.gz

とするといい感じにinitramfsをcpioで固めた後にgzipで圧縮したファイルができあがります。 cpioコマンドの-H newcを忘れるとフォーマットが変わるのでカーネルが読めないファイルができます。要注意。

HDMIを復活させる

HDMIを復活させるには、カーネルコンフィグをいじってフレームバッファを有効化する必要があります。

まず、カーネルコンフィグ(.config)を以下のように設定します。 このへんはlinux-sunxi.orgに書いてあることとほぼ一緒です。

CONFIG_FB_SUNXI=y
CONFIG_FB_CONSOLE_SUNXI=y
CONFIG_LCD_SUNXI=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
CONFIG_FONTS=y
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y

なお、ファミコンミニで使われているHDMIトランスミッタ(EP952)のドライバは勝手にビルドされます(Makefile参照)

設定をしたらカーネルをビルドします。その後、initramfs等と結合してAndroid形式のブートイメージを作成しますが、その際に使うbootimg.cfgに変更を加えます。

(snip)
cmdline = ~~~ console=tty0 console=ttyS0,115200 ~~~

元々あったconsole=の前に、console=tty0を追加します(この変更は必要ないかもしれません)

こうして作成したイメージで起動させるとHDMIの信号が出力されるようになり、また/dev/fb0からフレームバッファとして触れるようになっているはずです。 フレームバッファが正常に動作しているかを確かめるにはこのプログラムがよさそうです。

最後に

出来る限り思い出しながら書いていますが、書き足りない部分があったらすいません。

Author

avatar
NV

見習いセキュリティエンジニア

Comments