GP2040-CEをRP2350 Zeroで使う

2025/02/09に公開

ここらへんは読まなくてもいいっす

レバーレスがぶっ壊れた...畜生...これじゃ誰にも勝てねえ...
よし、新しいの作るぞ!!!!
RP2040 Zeroを買いに秋葉へGo!!!
あれ?どこにも売ってない...
RP2350 Zero?なんだコレ?
へー、こっちの方が性能いいんだ。フットプリントも同じっぽいし買ったろ!
(帰宅中)
あ、冷静に考えればハードウェア的な互換性があっても、ソフトウェア的には非対応なのでは...

どうも、まぬけです。タイトルの通りやります。
ケチなのでぶっ壊れたレバーレスをそのまま使おうと思ってたけど、
無理にランクマを一か月近く続けた結果、
防ぎようがない誤作動に心も病んだしスト6のMRも200ぐらい落ちて諦めました。
思い立ったらすぐ行動と秋葉に走り、勢いと楽観主義でRP2350 Zeroを買っちゃった結果、
無駄な苦労が発生...

先駆者様・参考

先駆者様:
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
※間違いに気づいた後、キレてRP2350Zeroを踏んずけて粉砕しそうになったけど、この方たちを見つけて耐えた

前提

わざわざRP2350でレバーレスやアケコンを作る必要はない。
RP2350はRP2040より性能が向上しているけど、性能的にはオーバースペック。
もっと凄い事をやる用のチップです。(語彙喪失)

ハード面での性能は上がっているけど、GP2040-CE自体がRP2350用に最適化されていないはずなので、むしろ悪くなる可能性もあります。
ので、無理にRP2350搭載ボードを買おうとはしないでください。高いし。
売り切れとかじゃない限りRP2040の方を買いましょう。

対象

  • RP2040とGP2040-CEでのアケコンレバーレス制作経験があること、もしくはガッツがある
  • コーディング、少なくともパソコンを使った入力作業に抵抗ない人
  • 最低限の調べものが出来る人。各ツールの使い方とかは説明しない。
  • 大量の英語を見たら頭がパンクしない人。修正量は少ないけど目の当たりにする英字の数は凄い。
  • 物理的な互換性(要するにはんだ付けできるか)を確認できている事。
    この記事では物理的な互換性はどうにもならないです。基板再発注か諦めて買い直し。
    要するにRP2040 ZeroとRP2350 Zeroのように寸法が同じで乗っかってるチップだけ違う場合にのみ有効。

注意事項

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

やる事(端的に)

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

手順概要

  • ①しつこいようだがまず物理的な互換性をチェック
  • ②不安だったらもうはんだ付けもしちゃう(動かなかった時、吸い取り線とか使えないとゴミ生産になっちゃうけど)
  • ③環境構築する
  • ④ビルド用の設定ファイル等を修正する
  • ⑤RP2350用にコードを一部修正する
  • ⑥uf2ファイルを出力する
  • ⑦あとは普段と同じように書き込み

①互換性チェック~②はんだ付け

説明しない。
経験者ならわかるだろうし、そうじゃなくてもガッツがある人なら調べりゃいけるはず。
②は飛ばして一番最後にやってもいい。
頑張って修正した後、微妙に寸法違ってはんだ付けできない事に気づきました。

はんだ付けの後、頑張って作業してたけど面倒になった結果、基板を無駄にした。
のどっちを取るか。

③環境構築

手順書参照!手順書自体がやや古いため、最新の状況や今回の差分だけ下に記載。
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版はなーんも考えずインストールしたら使えるもの

Arm GNU Toolchainについての補足

  • 前はWindows (mingw-w64-i686) hosted cross toolchainsを入れてた。
  • いまはWindows (mingw-w64-x86_64) hosted cross toolchainsを入れる。
  • でも一応i686でも動くっぽい。
  • i686は32bit OS向けのツールって意味らしい。32bit OSなんて少なくともゲーマーで使ってる人はもういないと思う。
  • ノートン入れてたら誤検知される
  • 不安だったら以下のリンクをクリック。
    ・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

※どうしても気になる人は仮想環境の構築をしたり、構築中はLANケーブル抜いたりすればいいのかな?最新版は12月に出たばかりのバージョンでメジャーとは言い難いツール、しかも開発用途のものなので、誤検知されてるだけと思うけど、怖いので自己責任。だからって古いバージョンでRP2350用のビルドが出来るかは不明。

④ビルド用の設定ファイル等を修正する、⑤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が上記の二つに重複定義されている事でエラー。
どっちかからコメントアウトする。
自分はpico-sdk側のpio.hから上記の関数をコメントアウトした。(こっちのが余分にチェック処理?とか入っていたので、ゲーム用途だと遅延の元かも...?って想像から。)
コメントアウトというのはコードを無効化するような事。

VisualStudioなら範囲をマウスでドラッグ選択してCtrl + K + Ctrl + CでOK。
VSCodeを入れてるんだったらマウスでドラッグしてCtrl + /でOK。

直接、バックスペースやDELで行ごと消してもいいけど、間違えて消し過ぎた、中途半端に消したとかなった時に地獄なのでコメントアウト推奨。

修正前

static inline void pio_sm_set_jmp_pin(PIO pio, uint sm, uint pin) {
    check_pio_param(pio);
    check_sm_param(sm);
#if PICO_PIO_USE_GPIO_BASE
    pin -= pio_get_gpio_base(pio);
#endif
    valid_params_if(HARDWARE_PIO, pin < 32);
    pio->sm[sm].execctrl =
        (pio->sm[sm].execctrl & ~PIO_SM0_EXECCTRL_JMP_PIN_BITS)
        | (pin << PIO_SM0_EXECCTRL_JMP_PIN_LSB);
}

修正後

// static inline void pio_sm_set_jmp_pin(PIO pio, uint sm, uint pin) {
//     check_pio_param(pio);
//     check_sm_param(sm);
// #if PICO_PIO_USE_GPIO_BASE
//     pin -= pio_get_gpio_base(pio);
// #endif
//     valid_params_if(HARDWARE_PIO, pin < 32);
//     pio->sm[sm].execctrl =
//         (pio->sm[sm].execctrl & ~PIO_SM0_EXECCTRL_JMP_PIN_BITS)
//         | (pin << PIO_SM0_EXECCTRL_JMP_PIN_LSB);
// }

{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ファイルを出力する、⑦あとは普段と同じように書き込み

普段と同じ。省略!

動かなかったら

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

動かない理由

余計な事をしない。(インストーラの時に変にチェック付けたり外したり)
入力ミス。
削除ミス(コメントアウトミス)。消し過ぎた、消し切れてない。
エラーはちゃんと読む。(全部読まずともChatGPTとかに投げてエラーの抽出をお願いするのはアリ)

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

ウイルス対策ソフトが暴れる事はあるかも、隔離されたりしたら除外して元に戻す事。
自分の場合は環境構築とビルド工程で邪魔してきた。

以上!

動かなかったらコメントしてもらえれば対応できるかも。
といっても、環境なんて人それぞれ違うし、自分もファームウェアかけるような一流エンジニアでもないので限界がある。
Perplexityとか生成AIとかに聞いてもらった方がいいかもっすね。

追記

とりあえず組み立てて動かしてみて正常動作はしています。
性能が上がったか下がったかはよくわからないです。

前のレバーレスが、はっきりと自覚と再現できるだけでも、
一回しか押してないのに四回ぐらいの入力になったり、
30Fぐらい遅延して技が出る事があったり、
そもそも何もでなかったり、歩きが途中で止まったり、
同時押し関連が正常に動作しなかったり、
MR1500を維持するのでギリギリぐらいの、
やべー状態だったのでとりあえず動くだけで嬉しいとしか言えないっす。

この修正で拡張機能も動くかについてはごめんなさい。これもわかんないっす。
とりあえずSOCDをSliderで選択する奴は動いているとしか言えないです。
僕はLEDアンチな上、拡張機能をろくに使ってないので。

面倒なので誰かやってくれたら嬉しいなあ。

Discussion