Skip to content

Instantly share code, notes, and snippets.

@lrks
Created May 3, 2020 17:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lrks/828f0c8734de7c485e4b8811520cff56 to your computer and use it in GitHub Desktop.
Save lrks/828f0c8734de7c485e4b8811520cff56 to your computer and use it in GitHub Desktop.
How To Quiet System Sound at JBL SoundGear

How To Quiet System Sound at JBL SoundGear

  • サーモン島 lrks 著

  • JBL SoundGearのシステム音がうるさい
  • SPI ProgrammerでFWを書き換えられる
  • システム音のファイルを編集して静かにしてみた

はじめに

  • JBL SoundGearを買いました
    • 購入後、急に安売りしだしたような…
    • この方法が広まり、値段が上がることを願う
  • レビューによれば、起動時の音が大きいらしい
    • 神経質な人も居るなぁと思った
  • 本当に大きかった
    • システムサウンド全般の音が大きい
    • 起動時の音はまだマシ、LowBatteryのときの音は緊急速報のアラーム音レベル
    • これは最大音量で鳴らしている?出荷前検査か何かでMAXどのぐらい出るか確認している?
    • そんなことしなくていいから
  • ファームウェアを更新すると音を小さくできるらしい
    • すでに最新版だった
  • ファームウェア書き換えか何かでなんとか音を小さくできないか?
  • JBL製品のReverse engineeringをやっている人がいる
  • SoundGearでの情報は見つからなかったが、参考にしていろいろやってみる

浅入浅出?SoundGear

  • SoundGearもCSRのSoCが入っている?
    • JBLが公開しているファームウェア更新ツールを見てみる
    • http://support.harman-japan.co.jp/update/SOUNDGEAR_update.php
    • 同梱されている HidDfu.dll のプロパティに「CSR」「Cambridge Silicon Radio」の文字が見える
    • たまたま同梱されただけかもなので絶対とはいえないが、たぶんCSRのSoCが入っているんじゃないでしょうか
  • CSRは「BlueSuite」というユーティリティツールを提供している
    • SoCと通信して、ATコマンドを発行できたり、"PS_KEY"を見れたり、Flashを読み書きできる
    • (出どころが怪しいが)その辺のGoogle driveから手に入る
  • "PS_KEY" を見てみる
    • PS_KEY: 設定のパラメータかなにか
    • HID DFUモードにする
      • (JBLのファームウェア更新手順と同様に)PCとSoundGearをUSBケーブルを繋いで、Vol.UP と Bluetoothボタン を同時に5秒長押し
      • ただのDFUモードでも良い
        • 何かと何かのボタンを15秒くらい長押しする
        • 必要なかったので具体的なボタンは忘れた、必要になっても5C2通り試せばいい
    • PSToolなどで見る
    • 面白いものは見つけられなかった
  • Flashを読み書きしてみる
    • USB経由ではできなかった

ファームウェアを書き換えてみる (失敗編)

  • 失敗編 ← ネタバレ
  • JBLのFW更新ツールでは、更新ファイルをインターネットからダウンロードしてくる
    • Fiddlerで確認
    • HTTPだったので楽
  • 中身を見る
    • JBL flip 4(とJBL Charge 3)ではファームウェアダンプをAudacityなどで開くとシステムサウンドが聞ける
    • Analyzing the firmware... using Audacity =0 | Details | Hackaday.io
    • signed 16-bit pcm, big-endian, 1 channel, 16k sample rate.

    • SoundGearの更新ファイルでもやってみる
    • 確かにシステムサウンドが聞ける
    • この音量を小さく変えて、FW更新ファイルを作ってしまえば良いんじゃないか
  • ファイル構造もみる
  • システム音の部分を1byteだけ変えた更新ファイルを作る
    • チェックサムも計算して変える
  • BlueSuite付属ツールでFWを更新してみる
    • うまくいかない…
  • JBL提供の更新ツールでやってみる
    • mitmproxyで改変した更新ファイルを配信する
    • ハネられる…
    • チェックサムを誤ったものにすると即ハネられる、でもチェックサムを正しくするとしばらくかかってハネられるのでやはりsignedとかそういう系な気がする
    • システム音は平文で見えるので、どこかに署名付きのチェックサムがある?
    • 場所がわからない
    • 分かったとして、チェックサムが数Byteだったとしてもブルートフォースするには手間がかかりすぎる

ファームウェアを書き換えてみる (成功編)

  • CSRの(一部?)SoCにはSPI経由でアクセスできる
    • ファームウェアの読み書き可能
  • 通常は専用プログラマが必要、ただしFTDIのモジュールからアクセスできるような実装がある
  • まずは適当なデバイスでやってみる
    • TT-BA09(Bluetooth トランスミッター レシーバー)があった
    • 中にはCSR8670が入っている、そして基板にはIとかOとかKとかそれっぽいシルク印刷と共にテストパッドがある
    • csr-spi-ftdiのセットアップをして、繋いでみる
    • 何も反応しないが……
  • それはさておき、SoundGearでもやってみる
  • どう分解する?
  • ちょっと眺めてみる
    • アンプはTPA3128D2が使われていた
    • Gainは26db(R1=20k, R2=100k)
    • (もう少し小さくしていてくれればこんな苦労はせずに済んだのに…とはいえデータシートに記載があるのは20dbまでなので大して変わらない気もするが)
  • 電源ボタンの近くにテストパッドがあった
    • G ... たぶんGND
    • CLK ... 間違いなく絶対100%CLK
    • MI ... たぶんMISO
    • CS ... たぶんCSB
    • MO ... たぶんMOSI
    • B+ ... BIAS?バッテリー?外部入力にも使える?電源入れて測ったら3.3V出ていたので、一応FT232のVIOは3.3Vにしておく
  • 繋いだら普通に通信できた
    C:\Program Files (x86)\CSR\BlueSuite 2.6.6>BlueFlashCmd.exe -identify
    blueflashcmd, version 2.6.6.1311 Release
    Copyright (c) 2002-2017 Qualcomm Technologies International, Ltd.
    All Rights Reserved.
    Qualcomm Technologies International, Ltd. Confidential and Proprietary.
    
    15:34:07.165000: all:spi.c:558:spi_init: csr-spi-ftdi 0.5.3, git rev 80b2ad0
    Resetting XAP
    Identifying XAP
    Flash identity: size = 251 sectors (15.6875 Mbit), man_id = 0x0000, dev_id = 0x0000
    Firmware ID (loader)="rck_16unified_fl_bt4.2_28a1_1601111356_ble_encr128 2016-01-11"
    Firmware ID (stack)="rck_16unified_fl_bt4.2_28a1_1601111356_ble_encr128 2016-01-11"
    Result: Usable flash size: 251 sectors, 15.6875 megabit.
    *** FTDI Statistics ********************************************************
    csr-spi-ftdi version: 0.5.3 (git rev 80b2ad0)
    Time open: 2.80 s
    Time in xfer: 2.56 s (91.54% of open time)
    Reads: 357 (9786 bytes, 27.41 bytes avg read size)
    Writes: 412 (8526 bytes, 20.69 bytes avg write size)
    Xfer data rate: 6.97 KB/s (18312 bytes in 2.56 s)
    IOPS: 299.00 IO/s (769 IOs in 2.56 s)
    FTDI chip: FT232R (3), buffer size: 384 bytes
    FTDI stats: 888.00 xfers/s (63.00 short reads/s,
                2280 xfers/164 short reads in 2.56 s,
                2.00 xfers/IO, 259.00 bytes/xfer)
    SPI max clock: 1000 kHz, min clock: 1000 kHz, slowdowns: 0
    ****************************************************************************
    Success
    
  • FWをダンプしてみる
    • 変なテキストフォーマットで出てくる
    @000000 5343
    @000001 6252
    @000002 6663
    @000003 3177
    
  • Binaryにする
  • システムサウンド部分を1Byteだけ変える
  • 変なテキストフォーマットにする
    import os
    import sys
    
    def toraw(filename):
        with open(filename, 'r') as x_file:
            with open(filename + '.bin', 'wb') as b_file:
                for line in x_file:
                    if len(line)<4: continue
                    addr, str_hex_val = line.split(' ')
                    b_file.write(bytearray([
                        int(str_hex_val[2:4], 16),
                        int(str_hex_val[0:2], 16)
                    ]))
    
    def tofw(filename):
        line = 0
        with open(filename, 'rb') as b_file:
            with open(filename + '.fw', 'w') as x_file:
                while True:
                    b1 = b_file.read(1)
                    if len(b1) != 1: break
                    b2 = b_file.read(1)
                    if len(b2) == 0:
                        data = '{:02x}'.format(ord(b1))
                    else:
                        data = '{:04x}'.format((ord(b2) << 8) | ord(b1))
                    x_file.write('@{:06x} {}\r\n'.format(line, data))
                    line += 1
    
    if __name__ == '__main__':
        cmd = sys.argv[1]
        filename = sys.argv[2]
    
        if cmd == 'raw':
            toraw(filename)
        elif cmd == 'fw':
            tofw(filename)
    
  • FWを書く
  • いけるやん!
  • こっちでは署名は要らない?ようだ

システムサウンドを小さくしてみる

  • 手順をまとめる
  1. BlueSuiteをインストールする
  2. https://github.com/lorf/csr-spi-ftdi を使えるようにする
  3. FWをダンプする
  4. Binaryに変換する
  5. システムサウンドを小さくする
  • AudacityではRawファイルのexportに難があるので、wavosaurがおすすめ
  • wavosaurでFWを開いてシステムサウンド部分のVolumeを小さく(かなり小さくしても聞こえる)して、そのままexport
  • FWの一部をexportしたデータで置き換え
  • 下記は置き換え範囲の例(システムサウンド, 開始位置, 終了位置
('pairing_complete.raw', 796163, 813013)
('shutdown.raw', 824677, 857931)
('wakeup.raw', 866975, 925525)
('ringtone.raw', 1302529, 1375941)
('low_battery.raw', 1585841, 1609335)
('disconnect.raw', 1618595, 1627967)
('pairing_waiting.raw', 1695313, 1914913)
  1. 元のFW形式に変換
  2. FWを書き込む

まとめ

  • 返品しようと思ったけど解決できてよかったです

著者あとがき

申し訳ないが駆逐艦を君付けで呼ぶのはNG

@lrks
Copy link
Author

lrks commented May 11, 2020

work
pinassign

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment