24-Apr-2021の続き。
OpenGD77の配布形態が変わったようで、https://www.opengd77.com/downloads/から適宜必要なファイルを拾うという形態になったようです。コンパイル済みのバイナリには興味が無いので、リリースされた(これを書いている時点ではreleases/R2021052901)ソースコードのビルドができるかどうか試してみることにしましょう。
ソースコードおよび必要なツール類はsources_and_tools/に入っています。アーカイブをざっと見てみるとこんな感じでしょうか。
- OpenGD77_FirmwareLoaders.zip
- gd-77_firmware_loader.pyは以前のものと比べ、公式ファームウェアからcodec blobを抜き出し、OpenGD77に組み込み後encryptを行ってアップロードする機能が追加されている。FirmwareLoader-Linux.exe, FirmwareLoader.exeはmonoで動くGUIを使ったプログラムのようだが、今回は使わない。
- OpenGD77_buildtools.zip
- FirmwareLoader, FirmwareLoader-Linux.exe, FirmwareLoader.exe, LibUsbDotNet.dll, Newtonsoft.Json.dllはOpenGD77_FirmwareLoaders.zipと大体同じだが、OpenGD77_FirmwareLoaders.zipに入っている方が若干新しい様子。codec_cleaner, codec_cleaner.Linux, codec_cleaner.exeは不要な気もするが、一応使っておく(なおcodec_cleanerのソースコードは無い)。
- OpenGD77_sources.zip
- ソースコード。
ビルド環境は09-Jan-2021と同様、Arch Linux上で行います。これを書いている時点ではarm-none-eabi-gcc-11.1.0が入っていますね。
- 必要なファイル類の展開とビルド用ディレクトリの作成
- unzip -x /path/to/OpenGD77_FirmwareLoaders.zip gd-77_firmware_loader.py; unzip -x /path/to/OpenGD77_buildtools.zip; unzip -x /path/to/OpenGD77_sources.zip; cd OpenGD77/firmware; mkdir build
codec_cleanerの修正(スクリプトは改行コードの問題により動かないため、バイナリを直接呼ぶようにする)mv tools/codec_cleaner tools/codec_cleaner.old; ln -s codec_cleaner.Linux tools/codec_cleaner- ダミーのcodecバイナリ作成(サイズが重要、0byteではダメ)
dd if=/dev/zero bs=15360 count=1 | tr '\000' '\377' > linkerdata/codec_bin_section_1.bin; dd if=/dev/zero bs=176128 count=1 | tr '\000' '\377' > linkerdata/codec_bin_section_2.bin
tools/codec_cleaner -C; mv codec_bin_section_?.bin linkerdata/- Makefileの修正
- DEFINES += にある-DGITVERSION=\"`git rev-parse --short HEAD`\"を-DGITVERSION=\"`date +%y%m%d`\"に
- ビルド(VERBOSE, RADIO, -jオプションはお好みで、この例ではBaofeng DM-1801向けとする)
- cd build; make -f ../Makefile -j5 RADIO=DM1801 VERBOSE=1
問題なくビルドが終われば、bin/OpenDM1801.binが得られるはず。
ファームウェアの書き込みはOpenGD77 firmware installationにあるように、GD-77 Firmware v4.3.6 [Ham Version]に含まれるGD-77_V4.3.6.sglに対するバイナリパッチという形で行います。入手不能になる前にこのファイルは入手しておいてください。
単純にpython3 gd-77_firmware_loader.py -m DM-1801 -f /path/to/OpenDM1801.binとした場合は、codec blobを組み込めないために"Flashing FM Only firmware"の警告が出ます。これは、printf "[GLOBAL]\nSourceFirmware=GD-77_V4.3.6.sgl\n" > ~/.gd77firmwareloader.iniとしておくことで"Patching the official firmware"となり、DMR対応となります。GD-77_V4.3.6.sglの置き場所は、多分カレントディレクトリで大丈夫。
Makefileはgitを呼び出す代わりにビルドした日付を放り込む方法で逃げていますが、これはより賢い回避方法があるはずです。また、ダミーのcodecバイナリについても、リンカスクリプトで適当な空間を作り出し、codecバイナリ抜きでビルドできるよう修正する方がスマートでしょう。
GitHubにコードがあればissue立てるなりして改善提案もできるのでしょうが、そのような窓口もないようなのでこの日記でボヤく程度にしておきます。54.60kg(17:25)
29-Jun-2021補足:どうも使っていたOpenGD77_buildtools.zipが古かったようで、更新された版を使用する必要があります。旧版(ファイルのタイムスタンプが2021-05-26 17:35)だとスクリプトcodec_cleanerの改行コードに問題がありましたが、更新版(タイムスタンプが2021-05-31 19:57)ではこの問題が解決しています。また、codec_cleaner -Cでダミーのcodecバイナリを作成できるので、これを使用するよう手順を改めています。なお、codec_bin_section_1.binが15360byte, codec_bin_section_2.binが163984byteになるようです。
codec_cleanerは、旧版だと0x00000400〜0x00003fff, 0x0004c000〜0x00076fff、更新版だと0x00000400〜0x00003fff, 0x00050000〜0x0007808fの範囲を0xffで埋めています。適切なサイズのcodec_bin_section_[12].binを用意しないとcodec_cleanerがcore dumpを吐いたり、吐かなかったとしても(必要なコードやデータを潰すことで)正常に動作しないバイナリが出来上がる危険性がありますので、OpenGD77のフォーラムに書いたようにリンカスクリプトを直す方が適切だと自分は考えるのです…蹴られましたけどね。