HTC JのSense4.1でワンセグ対応化など

HTC JのSense4.1(香港/台湾ROM)でワンセグが動いたのでメモ。
おサイフはまだ動かないので、みなさん手伝ってください><
FeliCaも動きました!この次の記事を参照してください。

※この記事は公式アップデート前のカスタムROM用に記述しています。
10/9に公式アップデートが来たため、この記事の内容は既に必要ありません。


分からない所があったら聞いて欲しいですが、結構私も分かってなかったりしますw
まず、ワンセグのアプリを動作させるのに必要なファイルをSense4.1のsystemに追加します。
必要なファイルは、

/system/bin/jellyservice
/system/bin/mtvmfservice
/system/bin/mtvmfrecservice
/system/lib/libJellyPG.so
/system/lib/libMTVMFCls.so
/system/lib/libnm325.so
/system/lib/libCdAbLayer.so
/system/lib/libBMLSupports.so

です。JPromのsystemから取ってきて追加すればOK。

何故これらのファイルが必要なのかというと、
JPromのinit.valentewx.rcの中身を見るとワンセグ関連サービスが丁寧に
#One-seg servicesとして記載されています。
これにより/system/bin以下の必要なバイナリが分かります。
そして、これらのバイナリを起動してみてエラーログを確認することで、
could not load needed library ‘libMTVMFCls.so’ for などの出力から
必要なライブラリを探っていけば分かる、といった感じですね。

ワンセグ関連サービスを自動起動させるため、init.valentewxc9.rcの末尾に先ほど確認したコードを追加します。

#One-seg services
service jelly /system/bin/jellyservice
    user root
    group drm system audio camera graphics inet net_bt net_bt_admin net_raw sdcard_rw

service mtvmf /system/bin/mtvmfservice
    user system
    group system audio camera graphics inet net_bt net_bt_admin net_raw sdcard_rw

service mtvmfrec /system/bin/mtvmfrecservice
    user system
    group system audio camera graphics inet net_bt net_bt_admin net_raw sdcard_rw

さらに、ワンセグのアプリが必要ですが、こいつはodex化されています。
odex化されているとは、その端末に最適化された状態になっているということで、
他のROM等に移植しても動作しないので、odex化を解除する(=deodex化する)必要があります。
deodex化の詳細についてはググってもらうとして、今回は@capliozさんがdeodexしてくださったので、
それを使うことにします。
GMobileTV.apk
ファイルをDLして、/system/app内に追加します。
パーミッションは644、所有者/グループはrootにしておいてください。

ここまでやると、ドロワーにワンセグが表示され、起動もします。
しかしチャンネルスキャンができず、ワンセグ電波を受信しません。
これはワンセグのドライバが読み込まれていないことが原因(logcatすれば分かる)ですが、
ワンセグのドライバはJPromの/system/lib等をのぞいても存在しません。

これは、ワンセグのドライバはモジュールとして持っているのではなく、カーネル本体に組み込まれているからです。
FeliCaドライバ等も同様に、カーネル本体に組み込まれています。
では、ドライバをモジュールとしてビルドしなおして、そのモジュールを持って来れば良いのでは?と考えますが、
モジュールにはmodversionsという仕組みがあり、一緒にビルドしたカーネルでないと組み込めない仕組みになっています。
よって、この方法は断念しました。

ではどうすれば良いのか?
JPromのカーネルにはワンセグドライバが組み込まれています。
なら、香港ROMをJPromのカーネルで起動させれば良いのです。

しかし、単純に香港ROMのboot.imgにJPromのカーネルをくっつけても起動しません。
まず第一に、機種名が違うからです。
日本版のカーネルはinit.valentewx.rcを読み込みますが、
香港版のカーネルはinit.valentewxc9.rcを読み込みます。
よって、 init.valentewxc9.rcからinit.valentewx.rcにファイル名を変更する必要があります。

これにより、正しくファイルが読み込まれAndroidが起動するようになりますが、画面が表示されません。
logcatで確認すると、Adrenoが大量のエラーを吐いていることが分かります。
経験上、これはgenlockのバージョンが違うことが推測できます。
多分エラーメッセージでググっても糸口が見つかるかも。
香港版のカーネルはどのgenlockを使っているのかについては、@td2skさんに助言をいただきました。

 https://github.com/intervigilium/android_kernel_htc_msm8960

こちらにアクセスして、Sep 23, 2012に更新されたgenlock.c と genlock.hを入手し、
HTC Jのカーネルソース内に置き換え、再ビルドすることで画面が表示されるようになります。

これで、ワンセグやFeliCaのドライバが組み込まれているJPromのカーネルで香港ROMを起動することができます。
この状態でワンセグを起動すると、正しく動作するようになります。

カーネルをビルドするのは非常に面倒であると思うので、こちらに公開しておきます!

HKBOOT20121003.img

FeliCaはデバイスドライバは作成されているので、とりあえず進歩はしています。現在何が悪いのか調査中です。
FeliCaも動きました! HTC JのSense4.1でFeliCaに対応する
何かあれば、コメント欄かTwitter(@tako0910)にお知らせください!

[`evernote` not found]

  1. コメントはまだありません。

  1. トラックバックはまだありません。