GP2040-CEをRP2350 Zeroで使う

に公開

はじめに

秋葉原でRP2040 Zeroが売り切れていたので形の似ているRP2350 Zeroを購入した。
帰宅中にふと気になって検索したらファームウェアに互換性がわかって絶望したけど、
どうにかできるらしい事がわかった。
上手く動いた喜びでかなり誤字脱字があったので不具合発覚と同時に修正しました。(20250430)

先駆者様・参考

RP2040を再ビルドした人、RP2350でコントローラ動かした先駆者様達

先駆者様:
https://x.com/yuumah/status/1876260393657758067
再ビルド手順書を公開してる神:
https://kiyokura.hateblo.jp/entry/2023/12/06/220216
その手順書:
https://kiyokura.hateblo.jp/entry/2023/12/06/220216
上の神を紹介してた記事:
https://kiyokura.hateblo.jp/entry/2023/12/06/220216

前提

基本はRP2040搭載製品を購入する事。
RP2350はRP2040より性能が高いが、コントローラとしての性能向上を期待してRP2350は買わない事。
間違えて購入したり、RP2040搭載製品が売り切れてた時とかのみトライする。
RP2040 Zeroは時々品薄になるので、そういった時が一番考えられるシナリオか。

注意事項

基本的には自己責任で!
また本記事で説明するのはあくまで突貫工事的なものなので、
公式が対応したらそっちですぐ上書きしてください。
※RP2350を意識したコードをGP2040-CE内で見かけたのでもうすぐかも。

また自分は拡張機能についてはLED含め、ほとんど動作確認が出来ていないです。
確認しているのはスライダーでSOCDを切り替える機能だけですが、
殆どスト6モードで使っている(切り替えをしない)ので長期的な使用や、
頻繁な切り替えで不具合があるかもしれません。

中級者?向けの記事なので細かい部分は割愛します。

やる事(端的に)

普段、アケコンを動くようにする時はGP2040-CEのreleasesから.uf2ファイルをDLしてると思います。
これを自前で、RP2350用に設定等をいじった上で自分のPC上で作る。(再ビルド)

手順概要

  • ①物理的な互換性をチェック
  • ②環境構築する
  • ③ビルド用の設定ファイル等を修正する
  • ④RP2350用にコードを一部修正する
  • ⑤uf2ファイルを出力する
  • ⑥あとは普段と同じように書き込み

①物理的な互換性チェック

PCBに乗っけてみてなんとなくあってそうか試す。
データシートが公開されており、あなたがそれを読めるなら、そちらで比較した方が確実。
基板が無駄になってもいいなら先にはんだ付けしてしまうのもアリ。

②環境構築

基本は以下の先駆者様の手順書参照!
やや古いため、最新版における差分だけ下に記載。
https://drive.google.com/file/d/1G8ytmH70aumiljWFLk4SzniRSwA6DNNk/view
※私の書いたものではないのでリンク切れ等あれば教えてください

以下、差分

  • Node.jsも入れる事。
  • Arm GNU Toolchainはこれを入れる。
    大分類
    ・Windows (mingw-w64-x86_64) hosted cross toolchains
    詳細分類
    ・AArch32 bare-metal target (arm-none-eabi)
    DLするもの(以下のどっちか)
    ・arm-gnu-toolchain-14.2.rel1-mingw-w64-x86_64-arm-none-eabi.zip
    ・arm-gnu-toolchain-14.2.rel1-mingw-w64-x86_64-arm-none-eabi.exe
    ※.zip版がポータブル版みたいなもの、適当なところに置いて、windowsの環境変数で参照する
    ※.exe版はなーんも考えずインストールしたら使えるもの
    ※よくわからない人はexe版が安定だけどDLには時間がかかるかも

Arm GNU Toolchainについての補足

  • かつてはmingw-w64-i686を入れてた、今はmingw-w64-x86_64を入れる
     (自分向け備忘録)i686は32bit OS向けの意味らしい
  • 少なくともノートン入れてたら誤検知される、不安なら.ascが拡張子のリンクをクリック
    ・arm-gnu-toolchain-14.2.rel1-mingw-w64-i686-arm-none-eabi.zip.asc
    ・arm-gnu-toolchain-14.2.rel1-mingw-w64-i686-arm-none-eabi.exe.asc
     英数字とファイル名だけのページが表示される。
     次にコマンドプロンプトとかでチェックサムを調べるコマンドを打つ。

ダウンロードしたファイルの場所までcdで移動してから、以下の

Get-FileHash -Algorithm MD5 arm-gnu-toolchain-14.2.rel1-mingw-w64-x86_64-arm-none-eabi.zip
# または
Get-FileHash -Algorithm MD5 arm-gnu-toolchain-14.2.rel1-mingw-w64-x86_64-arm-none-eabi.exe

上記のチェックサムを調べたとしても完全に安全とは限らないです。
開発用のツールであり、利用者が少ないであろうため誤検知されているのだと思いますが、
自己責任で入れてください。

③ビルド用の設定ファイル等を修正する、④RP2350用にコードを一部修正する

{git cloneしたフォルダ}\GP2040-CE\pico_sdk_import.cmake

この記述を上の方に書き込む。
RP2350向けのビルドをしますよという意味。
補足:set(PICO_BOARD pico2)は不要。GP2040-CEで自動で入れてくれるようになってる。

set(PICO_PLATFORM rp2350)

{git cloneしたフォルダ}\GP2040-CE\lib\WiiExtension\WiiExtension.h

使用が微妙に変わったためこう直す。
参考にした公式ドキュメントはここのInterrupt Numbers。
https://www.raspberrypi.com/documentation/pico-sdk/hardware.html
Visual StudioはTIMER1_IRQ_0じゃない?って聞いてきたけど多分嘘。
間違えてたらごめんなさい。
修正前

#define WII_ALARM_IRQ TIMER_IRQ_0

修正後

#define WII_ALARM_IRQ TIMER0_IRQ_0

{pico SDKをgit cloneしたフォルダ}\pico-sdk\src\rp2_common\hardware_pio\include\hardware\pio.h、もしくは、{git cloneしたフォルダ}\GP2040-CE\lib\pico_pio_usb\src\usb_rx.pio.h

正直、僕もどっちを直せばよかったか理解していないです。
少なくともpio_sm_set_jmp_pinが上記の二つに重複定義されている事でエラー。
どちらかをコメントアウトする。

未確定情報ですが、GP2040-CE側のpio_sm_set_jmp_pinをコメントアウトした方が良さそうです。
pico側をコメントアウトしたら、同時押しがトリガーとなって、コントローラの調子が悪くなる事象がありました。
pico側を残すようにしたら今のところ調子悪くはなっていません。

{git cloneしたフォルダ}\GP2040-CE\CMakeLists.txt

これはやらなくてもいい。
Windowsの環境変数設定が面倒だったらどうぞ。
僕はめんどくさがってこれにトライした結果、謎に沼って作業時間が伸びました
修正前

if(DEFINED ENV{GP2040_BOARDCONFIG})
  set(GP2040_BOARDCONFIG $ENV{GP2040_BOARDCONFIG})
elseif(NOT DEFINED GP2040_BOARDCONFIG)
  set(GP2040_BOARDCONFIG Pico)
endif()

修正後(RP2350 Zeroの場合はこれ。他の人はelseifのGP2040_BOARDCONFIGをPicoからお好きなConfigへ。GP2040_BOARDCONFIGが指定されてない場合のデフォルト設定。

if(DEFINED ENV{GP2040_BOARDCONFIG})
  set(GP2040_BOARDCONFIG $ENV{GP2040_BOARDCONFIG})
elseif(NOT DEFINED GP2040_BOARDCONFIG)
  set(GP2040_BOARDCONFIG WaveshareZero)
endif()

⑤uf2ファイルを出力する、⑥あとは普段と同じように書き込み

5に関しては手順書と同じ。
6に関しては通常のファームウェア書き込みと同じ。
UF2ファイルの出力は結構時間がかかります。
ゲーマーなら大丈夫だとは思いますがスペック次第では結構かかるかもしれません。
エラーが出て終わってない事もあり、結構、メンタルに来る時間でもあります。

動かなかったら

  • エラーをちゃんと読む。
  • とりあえずビルドフォルダを消して再ビルドしてみる
    {git cloneしたフォルダ}GP2040-CE\build
    {git cloneしたフォルダ}GP2040-CE\out

動かない理由

余計な事をしない。(インストーラの時に変にチェック付けたり外したり)
入力ミス。
削除(コメントアウト)ミス。消し過ぎた、消し切れてない。
エラーはちゃんと読む。

僕はファームウェアの設定をついでに色々いじったり、
他にも様々な本筋と関係ない、余計な事をしようとしたせいで二日かかりました。
手順書通りちゃんとやれば一日で終わるはず。
だいたい単純ミスか、調子にのってアホな事をしたかのどっちかでした。

以上!

動かなかったらコメントしてもらえれば対応できるかも。
ただ僕より生成AIとかに聞いてもらった方がいい結果が返ってくる可能性もあります。
とはいえ非エンジニアは生成AIがあっても苦戦する可能性は高いかもしれないです。
組み込み系をやってる方に関しては自分から言える事は何もないです。
間違いなくあなたが僕より問題解決能力は上のはずです。

追記(不具合情報等)

資格勉強などであまりゲーム自体やれてなかったのですが、
2か月たって、直近、コントローラが突然動かなくなる不具合に遭遇しました。
発生すると全ボタン受け付けなくなります。
はんだ付けがかなり雑になっていたのでハードウェア起因だと思っていたのですが、
再度Bootして書き込み直したら解消しました。

直近やってた特殊な事としては、やや難しめのコンボを開発してまして、
その中でボタン同時押しが存在しました。
そこを連打で安定させようとした結果、
3ボタンを高速で連打するという普段はあまりしないことをしていました。

結局、コントローラとしての性能向上も感じれてないので、やはりRP2040を買うのが無難です。

(追記)
多分コメントアウトした重複メソッドが間違ってました。二択負けです。
GP2040CEの方が余計なチェックとかが少なかったので採用していたんですが、
pico側の冗長に見えたチェック処理みたいなのが重要だったようです。
変えてからは異常が発生していません。

Discussion