💽

SONY NETJUKEをハックする

2022/08/15に公開


2020年の夏休みの宿題として購入したハードディスクコンポ、NETJUKE NAS-M70HDですが、普通に使って便利でした~。音楽がある生活サイコー!では皆さんは許してくれないでしょうから、Zennのアカウントを作って記事にして公開することにしました。

ふつうに使う


ふつうのNETJUKEの使い方

PCMを転送する

foobar2000とtraconv.exeを使用してLPCM.oma形式に変換して、ファイル取り込み。
traconvコンポーネントを組み込んでおけば、foobar2000がomaファイルにタグ情報、ジャケット画像も転送してくれる。便利。

DLNA再生してみる

audio/L16,44100Hzに変換して送れば何でも食ってくれる。
48000Hzでも再生はできるが、ハードウェア的に44100Hzしかサポートしていないのでサンプリングレート変換していると思われる。
プレイリストにShoutcastのURLを記述するとネットラジオも聴ける。ただしmp3のみ。

いろいろ試しましたが、DLNAサーバはMediaTomb 0.12.1以降が相性が良いようです。
サンプリングレート変換する場合としない場合のトランスコード設定例。

/etc/mediatomb/config.xml
      <profile name="soxsrc" enabled="yes" type="external">
        <mimetype>audio/L16</mimetype>
        <accept-url>no</accept-url>
        <first-resource>no</first-resource>
        <hide-original-resource>no</hide-original-resource>
        <accept-ogg-theora>no</accept-ogg-theora>
        <sample-frequency>44100</sample-frequency>
        <audio-channels>2</audio-channels>
        <agent command="sox" arguments="-q %in -t raw -B -b 16 -c 2 -r 44100 %out"/>
        <buffer size="1048576" chunk-size="131072" fill-size="262144"/>
      </profile>

      <profile name="sox" enabled="yes" type="external">
        <mimetype>audio/L16</mimetype>
        <accept-url>no</accept-url>
        <first-resource>no</first-resource>
        <hide-original-resource>no</hide-original-resource>
        <accept-ogg-theora>no</accept-ogg-theora>
        <sample-frequency>source</sample-frequency>
        <audio-channels>2</audio-channels>
        <agent command="sox" arguments="-q %in -t raw -B -b 16 -c 2 %out"/>
        <buffer size="1048576" chunk-size="131072" fill-size="262144"/>
      </profile>

soxはwavpackハイブリッドの差分(.wvc)をデコードしてくれないので、それはちょっと困るなぁって時はこんなシェルでも作って呼んでやればいいと思います。

wv2raw.sh
#! /bin/bash
wvunpack -q "${1}" -o - |sox -q -t wav - -t raw -B -b 16 -c 2 "${2}"
exit 0

バックアップデータを食う

バックアップファイルのtgbk2_10000aaaを7zipで展開する。
omaファイルはSONY謹製の「ウォークマン楽曲取り込みツール」かtraconvで扱える。

広告

https://www.youtube.com/watch?v=bL76-4fXdzE
物が少ない部屋に憧れます。

レッツハック

HDDの複製

詳しい既存の記事があるのでこちらを参考に。

https://dev.classmethod.jp/articles/raspberry-pi-dump-and-restore/

今回のケースでは、

  1. HDD先頭からパーティション3の終わりまでをddでコピー
  2. 拡張パーティション(4)を作成
  3. パーティション5,6をパーティション単位でddでコピー
  4. パーティション7,8は任意のサイズで作成し、dump&restoreでコピー

しました。

SSHでログインできるようにする

  1. HDDを取り外してあなたのマシンに繋ぎ、5番目のパーティションをマウントする。
  2. セキュリティ解除スクリプトをサービスに追加。
    パスはマウントポイントに読み替えてください。
ln -s /usr/local/bin/hacker /etc/rc.d/rc3.d/S97hacker
  1. /root/.ssh/authorized_keys にあらかじめクライアント側で生成しておいた公開鍵を追加

あとはHDDを戻して組み立てれば鍵認証でrootとしてログインできるはずです。
パスワードでのログインは出来なかったです。
一通りコマンドはそろっているしnfsもマウントできるので環境の自由度は高いです。

ログイン出来たらやってみて
$ ssh -i netjuke.rsa root@192.168.net.19
-bash-3.00# /usr/local/bin/hacker stat
You will be a hacker, maybe.
/dev/root on / type ext3 (ro)
 File Protected
-bash-3.00#

おちゃめ。

リモコン操作したことにする

ボタンを押す操作をシェルから行うことができます。

/root/rmu.sh HDPLAY
/root/rmu.sh VOL12

電源モードを高速起動にしておくとスタンバイ(電源ランプ橙)の時でも操作できます。
ボタンの一覧表を表示できますが、typoがあるのでrmu.shの中を読んだ方が確実です。
また、rmu.shをいじって24bitのリモコンコードを送れるようにもできます。

キー名に一致しなかったらリモコンコードとみなす.patch
--- rmu.sh
+++ rmucode.sh
@@ -197,8 +197,9 @@
 #              fi
                exit
                ;;
-       *)      echo "no key"
-               exit -1
+       *)      KEY=$KEYWORD
+#              echo "no key"
+#              exit -1
                 ;;
        esac

LINE-INのリモコンコードは c0c03f
DLNA再生のリモコンコードは c0c027
総当たりしました。
スタンバイ状態からLINE-IN押下で4秒くらいで起動するので便利です。

スクリーンショットをとる

/dev/fbを画面サイズ分切り出してヘッダを付ける。シェルでやるならこう。

screenshot.sh
#!/bin/bash
if [ ! -e /tmp/screen.bmp ]; then
  echo -en "\x42\x4D\x8A\x8C\x0A\x00\x00\x00\x00\x00\x8A\x00\x00\x00\x7C\x00\x00\x00\xD0\x02\x00\x00\x20\xFE\xFF\xFF\x01\x00\x10\x00\x03\x00\x00\x00\x00\x8C\x0A\x00\x13\x0B\x00\x00\x13\x0B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xF8\x00\x00\xE0\x07\x00\x00\x1F\x00\x00\x00\x00\x00\x00\x00\x42\x47\x52\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00">/tmp/screen.bmp
fi
dd if=/dev/fb of=/tmp/screen.bmp ibs=1440 count=480 obs=138 seek=1

ここまで出来たら、スマホリモコンを作ってみましょう。


スマホからリモート操作

こまごまとしたハック

ディスク全容量を更新する

/opt/sony/tiger/SystemSetup/etc/DiskAllSpace.properties
設定の目安:(dfで表示される/dev/hda7の全容量)-1330800

システム情報のCDファーム、HDD ID、MDファームに表示される値

/opt/sony/tiger/SystemSetup/etc/SystemVersion.properties

再生時に下に出てくるエラーメッセージを変える

/opt/sony/tiger/audioui/etc/AnyUiRecmd_OneLineDispPlugin.properties

書き換え例
Text_ServerErr=末永くお使いいただきありがとうございます

背面のシリアルコンソールを有効にする(未検証)

mount -o remount,rw /
touch /etc/tiger-release/psah.dat
reboot

メンテナンス端子のピンアサイン(未検証)
1 XDIAG_EN
2 PA5
3 NC
4 GND
5 SOUT2(TXD)
6 SIN2(RXD) ←基板上でつながってないかも
7 +3.3V

先にSSHで入れるようになってしまったので出番なし。

ANY MUSICボタンのLEDを点灯させる

/opt/sony/tiger/diag/strled.sh -O ANY 

だから何?って話ですが、今やこのボタンもLEDも使われないじゃないですか。弔いですよ。

プリセットEQの設定を変える

/opt/sony/tiger/launcher/etc/preseteq.properties
説明はファイル内に。
適用には再起動が必要。

MEGA.BASSの設定を変える

/opt/sony/tiger/launcher/etc/volumezone.properties
音量を5ゾーンに分けて適用する値を変えられる。同じ値が入ってるけど。
むかし音量に応じてイコライザが自動設定されるコンポがあったのを思い出しました。ケンウッドのだったかな。

低音量で強くなるMEGA BASSの例
0=0,3
1=4,7
2=8,11
3=12,15
4=16,51

1_0_Filter0=1012CAFC, E010D3A8, 0FDDF3D9, E010D3A8, 0FEFA3D6
1_1_Filter0=1012843C, E010D3A8, 0FDDF3D9, E010D3A8, 0FEFA3D6
1_2_Filter0=10123D7C, E010D3A8, 0FDDF3D9, E010D3A8, 0FEFA3D6
1_3_Filter0=1011F6BC, E010D3A8, 0FDDF3D9, E010D3A8, 0FEFA3D6
1_4_Filter0=1011AFFC, E010D3A8, 0FDDF3D9, E010D3A8, 0FEFA3D6

適用には再起動が必要。

スピーカーのイコライザを無効にする・LINE-OUTにもイコライザをかける

/opt/sony/onyx/utils/etc/onyx.properties
PlayEQPort1 = ON ←S-MASTER出力のEQは有効になっている
PlayEQPort2 = OFF ←LINE-OUT用DAC出力のEQは無効になっている

ハードウェア的なハック

バランス駆動ヘッドフォン対応にする

S-MASTERのストリームプロセッサからヘッドホンアンプ(NJM4565)までの伝送は差動信号になっているので、ヘッドホンアンプに入っている差動信号にそのままドライバ段を付けたらバランスド出力として使えそう。

デジタル出力を付ける

WM8776のDACに入ってる信号(4-7pin)を横取りしてDAIに入れてあげればOKのはず。
メインボードとプロセッサボードの2,4,5pin(SDO,LRCK,BCK)でもOK。

デジタル入力を付ける

WM8776のADCから出力される信号を乗っ取る。
ただし本体側のクロックに同期する必要がある。フォーマットは24bit44.1kHz固定。
NAC-HD1ではここにSRCが載っていて、制御信号はプロセッサボードの未使用の4ピンコネクタに出てくることになっている。
しかしNAC-HD1相当のファームウェアでないと制御は期待しがたいので、どうしてもやるならスイッチで切り替えて使うような実装が無難かなぁ~(やるきなし)

修理する

液晶を交換する

PSP-1000と同じ液晶モジュールが使用されているため、保守部品には困らないでしょう。
液晶とバックライトは分離できるので、バックライト切れの場合は割れたPSPが使えます。
PSP-1000交換用IPS液晶に置き換えてみるのも面白いですね。

CDドライブを置き換える

CDドライブが故障したくらいでいちいちバラすのは手間ですね。増設しちゃいましょう。
CDモード以外にしておき、USB接続のCDドライブを接続します。

mount -o remount,rw /
rm /dev/cdrom
ln -s /dev/scd0 /dev/cdrom
mount -o remount,ro /

ファンクションをCDに切り替えると外付けCDドライブが使えるようになります。

元に戻すときは3行目を下記のようにします。

ln -s /dev/hdb /dev/cdrom

これでもしCDドライブがダメになってしまっても安心ですね。
リモート操作と組み合わせて、本体を手の届かないところに設置してCDドライブだけ手元に、といった使い方や、IDEのスレーブ側を空けて何かに使うなど、ハックの幅が広がりますね。

あとがき

これだけのものをガッカリポイントなくまとめ上げた開発力は本当にすごいですね。
オーディオが部屋の隅に追いやられはじめた時代に、完成されたデジタルオーディオを一般家庭に届けてやるぞという執念を感じました。

何よりも特筆すべきは、本当にフルデジタルのオーディオ機器になっている点。
11.289MHzのクロックに同期してADC、DAC、PDMアンプ、DSPが動作していて、CPUはバッファが途切れないようにDSPとデータをやり取りしているだけ。
CPU側のオーディオ処理もLinuxのオーディオAPIを利用することなく独自実装されています。
同じ構成のNAC-HD1 [1] を高精度クロックに乗せ換える改造が流行ったのも納得がいく設計。
NETJUKEも高精度クロックに改造すればきっと…ミニコンですが、ハイエンドよりいい音がしますよ。(笑)

脚注
  1. 24bit192kHz DAC/ADC搭載を謳っていましたが…(そのクロックで駆動しているとは言っていない。) ↩︎

Discussion