SparrowG21向けに、GP2040-CEでカスタムファームウェアをビルドする

tl;dr

  • SparrowG21はGP2040-CEを使うレバーレスアケコン(スティック付き)だよ
  • GP2040-CE v0.7.7で、なぜかPico用のビルドだと、GPIO24でRGB LEDを光らせることができなかったよ。Raspberry Pi PicoではGPIO24は、USB電源の検知なので、変更できないかもしれないと思ったよ。
  • でもRP2040 Advanced Breakoutのビルドでは動作したので、ファームウェアをカスタムビルドすればなんとかなりそうだよ
  • GP2040-CEは、configsにheaderファイルを記述すればビルドできたよ

SparrowG21をキーケットで頒布したよ

キーケットでは、レバーレスアケコンSparrowG21を頒布しました。以下のような特徴を持つゲームコントローラです。

  • GP2040-CE専用
  • アクションゲームで、左手親指をジャンプとして、上下キーを1つの指で操作できるようなキー配置
  • ジョイスティック2本搭載(3Dプリントで製造したスティックキャップ付属)
  • GH60互換ケース対応
  • MX互換スイッチ対応
  • 薄型スイッチKailh Choc v1、LOFREE x KAILH Full POM Low Profile対応(ただし、Chocの場合にはトッププレート、ホットスワップソケット非対応)。
  • ホットスワップソケット対応(MX互換のみ)
  • OLED、ターボインジケータLED、パワー&モードLED搭載

現在、Boothにて販売中です。

74th.booth.pm

v0.7.7 でPico用ビルドでRGBLEDが光らない

キーケットで販売したバージョンには、Raspberry Pi Picoビルドのファームウェアを書き込み、SparrowG21用のピンマップを書き込んでいました。しかし、これではRGB LEDが光らないことがわかりました。v0.7.5では光ることを確認しており、その後サンプルで組んだもので光らなくなったので、RGB LEDが壊れてしまったと思い込んでいました。今回、組み直したものでも光らないことがわかり、改めて調べ直すことにしました。

購入された方(4名)には、不完全な状態のものを販売してしまっており、大変申し訳ありませんでした。

SparrowG21でRGB LEDに使っているGPIO24は、USB電源があることの確認に使われています。このことから、Raspberry Pi Picoビルドではこの前提で動いているからうまくいかないのかと思い、試しにRP2040 Advanced Breakoutのビルドで動かしてみたところ、期待通りRGB LEDが点灯しました。よって、GP2040-CEをSparrowG21向けにビルドすることができれば、動かすことができそうだと確信しました。

GP2040-CEのPico用ファームウェアをビルドする

GP2040-CEのソースコードを見てみると、次のような構成になっています。

  • src/ : ソースコード
  • headers/ : ヘッダーコード
  • configs/ : 各ボード用の設定ヘッダーファイル
    • configs/{ボード名}/BoardConfig.h : ピンのアサイン、機能の有効を設定する
    • configs/{ボード名}/{ボード名}.h : Flashサイズ等を指定するファイル(変更しなくて良い)

configs/ に各ボードの設定があり、そこでマクロ定数(#define BOARD_LEDS_PIN 24等と定義するやつ)で、機能の有効無効や、ピンアサインを指定します。ここで使うマクロ定数はヘッダーファイル内で見つけることができます。

まず始めに、Pico用のファームウェアをビルドし、その後カスタムファームウェアの制作に取り組むことにしました。環境はUbuntu 22.04、OrangePi5+(ARM64)上で行っています。

まず、通常のPico用ファームウェアをビルドしました。

git clone --recursive https://github.com/OpenStickCommunity/GP2040-CE 
cd GP2040-CE

# PICO_SDK_FETCH_FROM_GIT=1 とすると、pico_sdkをダウンロードする
PICO_SDK_FETCH_FROM_GIT=1 cmake .

# configsのMakefileを作る
cd configs
cmake .

# ルートディレクトリでビルドする
cd ..
make

これで GP2040-CE_0.7.7_Pico.uf2 がビルドされました。

次に、カスタムファームウェアのビルドに進みます。

GP2040-CEのカスタムファームウェアをビルドする

まず、RP2040 Advanced Breakoutの設定ファイルconfigs/RP2040AdvancedBreakoutBoardをコピーして configs/SparrowG21 を作りました。ボード名のヘッダファイル configs/RP2040AdvancedBreakoutBoard/RP2040AdvancedBreakoutBoard.h があるため configs/SparrowG21/SparrowG21.h にリネームしています。

ボードの設定(configs/SparrowG21/BoardConfig.h)にボード名を記述するところがあるので、変更しておきます。

#define BOARD_CONFIG_LABEL "SparrowG21"

configs/CMakeLists.txt に以下のようにビルドするボード名が書かれていました。ここにSparrowG21を追加しました。

add_subdirectory(Pico)
add_subdirectory(SparrowG21)

さらに、ビルドする対象のボードは CMakeLists.txt において ${GP2040_BOARDCONFIG} と書かれているのを見つけました。指定がない場合、Picoが使われるようになっており、先のビルドではこれが使われているようでした。そうであれば、環境変数で指定すれば良さそうです。これでビルドを行いました。

# configsのMakefileを更新
cd configs/
cmake .

# ボードの指定でSparrowG21を指定する
cd ..
GP2040_BOARDCONFIG=SparrowG21 cmake .

# ビルド
make

すると、GP2040-CE_0.7.7_SparrowG21.uf2ができました。

カスタムファームウェアの設定を作り込む

SparrowG21で行うべき設定は以下の通りでした。

  • 各キーのピンアサイ
  • I2CとOLED Displayを有効にして、ピンを設定する
  • RGB LED機能を有効にして、ピンを設定する
  • Board LED(Picoに付いているLED)を有効にする
  • Turbo機能を有効にして、ピンを設定する
  • Analog機能を有効にして、ピンを設定する

これらを、configs/SparrowG21/BoardConfig.h に作り込んできました。

ほとんどの設定は、WebConfigの設定とheades にあるものが一致するようにできており(特にaddons)、あまり迷うことなく設定を見つけることができました。

各キーのピンアサイ

各ピンにキーを設定していきます。他のボードの設定が参考になります。同様に、Function、Turboキーも設定できます。

#define GPIO_PIN_07 GpioAction::BUTTON_PRESS_UP
#define GPIO_PIN_05 GpioAction::BUTTON_PRESS_DOWN
#define GPIO_PIN_06 GpioAction::BUTTON_PRESS_RIGHT
#define GPIO_PIN_02 GpioAction::BUTTON_PRESS_LEFT
#define GPIO_PIN_14 GpioAction::BUTTON_PRESS_B1
#define GPIO_PIN_16 GpioAction::BUTTON_PRESS_B2
#define GPIO_PIN_20 GpioAction::BUTTON_PRESS_R2
#define GPIO_PIN_22 GpioAction::BUTTON_PRESS_L2
#define GPIO_PIN_13 GpioAction::BUTTON_PRESS_B3
#define GPIO_PIN_15 GpioAction::BUTTON_PRESS_B4
#define GPIO_PIN_19 GpioAction::BUTTON_PRESS_R1
#define GPIO_PIN_21 GpioAction::BUTTON_PRESS_L1
#define GPIO_PIN_23 GpioAction::BUTTON_PRESS_S1
#define GPIO_PIN_03 GpioAction::BUTTON_PRESS_S2
#define GPIO_PIN_18 GpioAction::BUTTON_PRESS_L3
#define GPIO_PIN_17 GpioAction::BUTTON_PRESS_R3
#define GPIO_PIN_08 GpioAction::BUTTON_PRESS_A1
#define GPIO_PIN_11 GpioAction::BUTTON_PRESS_A2
#define GPIO_PIN_12 GpioAction::BUTTON_PRESS_FN
#define GPIO_PIN_09 GpioAction::BUTTON_PRESS_TURBO

I2CとOLED Displayを有効にして、ピンを設定する

この設定は他のボードでも行われているので、それらを参考にしながら以下のように記述しました。

#define HAS_I2C_DISPLAY 1
#define I2C_SDA_PIN 0
#define I2C_SCL_PIN 1
#define I2C_BLOCK i2c0

RGB LED機能を有効にして、ピンを設定する

こちらも他のボードでも行われているので、それらを参考にしました。BOARD_LEDS_PINが利用するGPIOの番号です。LEDS_XXXX はデイジーチェーン接続の順番です。

#define BOARD_LEDS_PIN 24
#define LED_BRIGHTNESS_MAXIMUM 128
#define LEDS_DPAD_LEFT 0
#define LEDS_DPAD_DOWN 1
#define LEDS_DPAD_RIGHT 2
#define LEDS_DPAD_UP 3
#define LEDS_BUTTON_B3 4
#define LEDS_BUTTON_B4 5
#define LEDS_BUTTON_R1 6
#define LEDS_BUTTON_L1 7
#define LEDS_BUTTON_B1 8
#define LEDS_BUTTON_B2 9
#define LEDS_BUTTON_R2 10
#define LEDS_BUTTON_L2 11

Board LED(Picoに付いているLED)を有効にする

Board LEDで、現在のモードなどを表現することができます(OLEDがあれば不要とも言えますが)。

ヘッダーファイルは headers/addons/board_led.h にあり、これを見ながら必要な設定を追加しました。有効にした後、モードを表示する設定を行っています。

#define BOARD_LED_ENABLED 1
#define BOARD_LED_TYPE ON_BOARD_LED_MODE_MODE_INDICATOR

Turbo機能を有効にして、ピンを設定する

ヘッダーファイルは headers/addons/turbo.h にあり、これを見ながら必要な設定を追加しました。

#define TURBO_ENABLED 1
#define TURBO_LED_PIN 10

Analog機能を有効にして、ピンを設定する

こちらもヘッダーファイルは headers/addons/analog.h にあり、これを見ながら必要な設定を追加しました。

#define ANALOG_INPUT_ENABLED 1
#define ANALOG_ADC_1_VRX 26
#define ANALOG_ADC_1_VRY 27
#define ANALOG_ADC_2_VRX 28
#define ANALOG_ADC_2_VRY 29

作ったもの

変更したBoardConfig.hはこちらになります。

github.com

できたファームウェアを書き込む

設定変更後に再ビルドし、ファームウェアを書き込みます。

ファームウェアを変更するとき、設定があると残る作りになっているため、一度Flashの中身を削除する以下のファームウェアを書き込んだ後に、新しいファームウェアを書き込みます。

flash_nuke.uf2

https://datasheets.raspberrypi.com/soft/flash_nuke.uf2

すると、書き込むだけでセッティングが完了するカスタムファームウェアが動作しました!

以上

わりと簡単にGP2040-CEのカスタムファームウェアを作ることができました。

もしキーケットでSparrowG21を買われていましたら、ドキュメントを確認の上、こちらのファームウェアをお試しいただければ幸いです。

github.com