HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2023/08/12

【自由工作】市販のキーボードを無改造で VIA QMK化する Keyboard Quantizerを自作する【夏休み】 【自由工作】市販のキーボードを無改造で VIA QMK化する Keyboard Quantizerを自作する【夏休み】

(夏休みが明けたら 僕のキーボードが最強になって クラスのみんなから MMK 大作戦)

Tags: [電子工作], [QMK]




● Keyboard Quantizerのソースコードをビルドして自作する方法、嬉しい VIA対応

 How to build Keyboard Quantizer source code and make your own、VIA supported

 ありがたい事に GNU General Public Licenseでソースコードを公開しているので RP2040の Pico-PIO-USB版の Keyboard Quantizerを自作します。

 夏休みの電子工作に最適!

 題して「夏休みが明けたら 僕のキーボードが最強になって クラスのみんなから MMK 大作戦」
 ※ MMK = 「(女性から)モテてモテて困る」の旧海軍の隠語

 Keyboard Quantizerの QMK VIAの最強のキーボードであの娘のハートをガッチリ CapsLockしちゃいましょう!

 部品代 1000円程度と気合と根性と汗と涙と半田付けで作れます!

 機能的には かえうち、かえうち2と同じ事ができると思います。
 ※ 「かえうちパートナー」の機能は OS側で動くソフトウェアの作成が必要ですが。



● Keyboard Quantizer公式の参考資料

 Keyboard Quantizer Miniの資料は下記に有ります。
Keyboard Quantizer Mini

 Keyboard Quantizer Miniのファームウェアは下記の 2種類が有ります。
REMAPファームウェア キー定義に RemapVIA が使える。
Full版ファームウェア キー定義に専用の Keyboard Quantizer Config Generator を使用する。REMAPや VIAには非対応。
 ※ Full版の方が「高機能」っぽいですが、使いこなす為の「ハードル」が高そうです。。。

Keyboard Quantizer ビルドガイド(Rev4)
 ※ Rev4は USB HOSTに WCH CH559のマイコンチップを使用しています

自分でレポートパーサを実装する

Pico-PIO-USB
 Pico-PIO-USBとは?
 RP2040の GPIOを制御して USB HOST機能を実現している。これにより MAX3421Eの様な USB HOSTコントローラが不要になり、回路をコンパクトにでき、製造コストも安くできる。

 以前は +3.3V版の Pro Microに MAX3421Eを増設して USB-USB QMKコンバータを作成しましたが、プログラム可能な容量が 28KBしかないので必要な機能を詰め込むのに苦労しました。

2022/03/13
市販のキーボードを無改造で QMK化する QMK USB Converterを作ってみる
市販のキーボードを無改造で QMK化する QMK USB Converterを作ってみる

  QMK firmware QMK USB to USB keyboard protocol converter Pro Micro 3.3V + USB Host MAX3421E


●自作の Keyboard Quantizerの回路図

 なるべく「小型」に作りたかったので、RP2040として Waveshareの RP2040-Zeroを使用しましたが、RP2040であれば何でも大丈夫です。
Waveshare RP2040-Zero

 RP2040-Zeroに USB HOST用に USB Aコネクタを配線します。
 また、欲張って OLEDと圧電ブザー、Caps Lock/ Scroll Lock用の LEDを増設しています。(Keyboard Quantizer+)

 Keyboard Quantizer Miniのオリジナル(本物)は USB HOSTの配線が D+ = 4、D- = 5ですが、FREE WING自作版は基板配置の関係で D+ = 10、D- = 11としています。

機能GPIO備考
USB HOSTD+=GPIO 10、
D-=GPIO 11
Pico-PIO-USBUSB A Female
I2C OLEDSDA=GPIO 28、
SCL=GPIO 29
I2C0I2C SSD1306 72x40 0.42'
Audio
Piezo Buzzer
GPIO 17PWM0 BSMD Piezo Buzzer
WS2812 RGB LEDGPIO 16PIO、RP2040-Zeroに実装済みRGB LED

・自作の Keyboard Quantizerの回路図
自作の Keyboard Quantizerの回路図


 ※ Keyboard Quantizerのオリジナル(本物)と同じにしたい場合は USBの配線を D+ = 4、D- = 5にする。OLEDと BUZZERを配線しない。


Waveshare RP2040-Zero 高性能ピコライクMCUボード Raspberry PiマイクロコントローラーRP2040 カステレーションモジュールでキャリアボードに直接はんだ付け可能 - 2個
ASIN: B0B2Z3YWB9

Seeed Studio XIAO RP2040 マイクロコントローラー デュアルコア ARM Cortex M0+ プロセッサ Arduino、MicroPython、サーキットパイソンをサポートし、豊富なインターフェースを備えています。
ASIN: B09NNVNW7M

usb タイプb 変換 夏の楽しみUSBメスボード、ミニUSBタイプAメスソケットボード2.54mmピッチアダプタコネクタDIP 10個、電源用
ASIN: B0891125C6

660点 0603 SMD抵抗器キット 公差1% 1/10W 33値 1Ω~1MΩ SMDチップ抵抗器 抵抗セット 高精度 安定性能
ASIN: B0B5LVNSXV

※ 22Ωの抵抗が必要だから

GAOHOU 5個 0.42インチ 4ピン OLEDディスプレイ SSD1306 LCD IICインタフェースモジュール 白表示
ASIN: B0CDC6VSKC

※ I2C OLED SSD1306
 ※ OLEDは通常の 128x32等でも大丈夫です

 秋葉原に行ける場合は秋月電子や千石電商で揃えると最小構成で 1000円以下で済みます。
Raspberry Pi Pico ラズベリーパイピコ
RP2040マイコンボードキット
USBコネクタDIP化キット (Aメス)
ムラタ表面実装圧電サウンダ(トランスデューサ/圧電スピーカ)
WaveShare RP2040-Zero-M
金属被膜抵抗器(小型品) 1/4W 22Ω±1%
1608(0603)チップ抵抗 22Ω
超小型 金属皮膜抵抗 1W22Ω (100本入)


● QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真

 USB HOST用に USB Type-Aのメスコネクタを配線します。
 I型(一直線)になる様にする為に GPIOの 10、11を使用しました。
 USB基板上に 33Ωを実装しています。
 ※ 22Ωの抵抗が無かったので 33Ωを使用しています。
 (この USBに入れる直列抵抗(22Ω)は必須ではないが「入れたほうが良い」)

 情報表示用として OLEDを増設しています。
 64x32 0.49'よりも小型で情報量が多い 72x40 0.42'を使用しました。
 GPIOは SDA = 28、SCL = 29の I2C0を使用しました。

 キーボード起動時に PC98のピポ音やキーマクロ時の識別用に音を出したかったので小型の面実装の圧電ブザーを増設しています。
 GPIO 17の PWM0 Bを使用しました。

・QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真
QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真


QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真


QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真


QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真
 USB基板上に 33Ωを実装しています。
 ※ 22Ωの抵抗が無かったので 33Ωを使用しています。
 (この USBに入れる直列抵抗(22Ω)は必須ではないが「入れたほうが良い」)

QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真
 USBコネクタが I型(一直線)になる様にする為に GPIOの 10、11を使用しました。

QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真


QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真


QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真


QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真


QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真



・QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真
QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真
 情報表示用として OLEDを増設しています。
 64x32 0.49'よりも小型で情報量が多い 72x40 0.42'を使用しました。
 GPIOは SDA = 28、SCL = 29の I2C0を使用しました。

QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真
 キーボード起動時に PC98のピポ音やキーマクロ時の識別用に音を出したかったので小型の面実装の圧電ブザーを増設しています。
 GPIO 17の PWM0 Bを使用しました。

 RP2040-Zeroの基板上の GPIO 17 PADに 150Ωのチップ抵抗を半田付けしています。

2023/08/16
【ソースコード有り】QMKキーボードに PC98起動時のピポ音を実装する方法
【ソースコード有り】QMKキーボードに PC98起動時のピポ音を実装する方法

  PC98起動時のピポ音を QMKに実装する方法

QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真


QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真


QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真


QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真


QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真


QMV VIA RP2040 Keyboard Quantizer Miniの私家版の基板写真



 Pro Micro + MAX3421Eと比べ、RP2040版は製作のコストも難易度も低くなっています。

・RP2040 Keyboard Quantizer Miniと Pro Micro + MAX3421Eとの比較写真
RP2040 Keyboard Quantizer Miniと Pro Micro + MAX3421Eとの比較写真


RP2040 Keyboard Quantizer Miniと Pro Micro + MAX3421Eとの比較写真


RP2040 Keyboard Quantizer Miniと Pro Micro + MAX3421Eとの比較写真


RP2040 Keyboard Quantizer Miniと Pro Micro + MAX3421Eとの比較写真


RP2040 Keyboard Quantizer Miniと Pro Micro + MAX3421Eとの比較写真


RP2040 Keyboard Quantizer Miniと Pro Micro + MAX3421Eとの比較写真


RP2040 Keyboard Quantizer Miniと Pro Micro + MAX3421Eとの比較写真



 その他の写真は下記に有ります。

2023/08/04
Raspberry Pi Pico RP2040で QMKのファームウェアを動かす!
Raspberry Pi Pico RP2040で QMKのファームウェアを動かす!

  Raspberry Pi Pico RP2040でも QMKのファームウェアを公式に動かせる様になりました!


● Keyboard Quantizerのソースコードをビルドする方法

 Windowsの Ubuntu WSL環境でビルドできます。

2021/08/23
QMK firmwareの開発環境を ラズパイや Windows WSLにセットアップする方法
QMK firmwareの開発環境を ラズパイや Windows WSLにセットアップする方法

  ラズパイや Windows WSL環境でカスタマイズ キーボードのファームウェア QMK firmwareの開発環境を構築


● REMAPファームウェア版
ファームウェアのソースコード quantizer_mini
cd
git clone https://github.com/sekigon-gonnoc/qmk_firmware.git quantizer_mini --depth 1 -b quantizer_mini

# Cloning into 'quantizer_mini/lib/Pico-PIO-USB'...
# git@github.com: Permission denied (publickey).
# fatal: Could not read from remote repository.
# Please make sure you have the correct access rights and the repository exists.
# fatal: clone of 'git@github.com:sekigon-gonnoc/Pico-PIO-USB.git' into submodule path 'quantizer_mini/lib/Pico-PIO-USB' failed
# Failed to clone 'lib/Pico-PIO-USB' a second time, aborting
# make: *** [Makefile:525: git-submodule] Error 1

# tmk_core/pico.mk:22: *** pico-sdk does not found at PICO_SDK_PATH. Please setup pico-sdk by `make git-submodule`..  Stop.

# Failed to cloneのエラーになるので Pico-PIO-USBライブラリを手動で更新する
cd
cd quantizer_mini
cd ./lib/
git clone https://github.com/sekigon-gonnoc/Pico-PIO-USB -b for-keyboard-quantizer
cd ..

# QMK Firmwareの初期設定
sudo ./util/qmk_install.sh
qmk -V
# if [ $? -ne 0 ]; then
  python3 -m pip install qmk
  PATH="$HOME/.local/bin:$PATH"
# fi
make git-submodule

 USBの GPIOの割り当てを D+ = 4から D+ = 10に変更します。
 (D-は D+の GPIOに +1を足したものに自動的になる)
keyboards/keyboard_quantizer/mini/mini.c
    pio_cfg.pin_dp = 4;
を
    pio_cfg.pin_dp = 10;
に書き換える。
 コマンドラインでサクッと書き換えたい場合は下記のコマンドを実行する。
sed -e "s/pio_cfg.pin_dp = 4;/pio_cfg.pin_dp = 10;/" -i keyboards/keyboard_quantizer/mini/mini.c
grep pin_dp keyboards/keyboard_quantizer/mini/mini.c
#   pio_cfg.pin_dp = 10;

 PICO_FLASH_SPI_CLKDIVは 8のままで OK。
keyboards/keyboard_quantizer/mini/rules.mk
PICO_FLASH_SPI_CLKDIV = 8

 下記のコマンドでファームウェアのビルドして、できあがった keyboard_quantizer_mini_default.uf2を RP2040に書き込みます。
 動作 OK!

 ちなみに VIAのバージョンは V2です。
# ファームウェアのビルド
make keyboard_quantizer/mini:default:uf2

# fatal: No names found, cannot describe anything.
 が沢山出るが、無視して大丈夫。
 気になる場合は
git fetch --prune --unshallow
 を実行する。
 もしくは git clone時の --depth 1を削除する。

# QMK Firmware kqrp-0.1.4
# Making keyboard_quantizer/mini with keymap default and target uf2
...
# Compiling: tmk_core/protocol/pico/usbd.c                           [OK]
# Linking: .build/keyboard_quantizer_mini_default.elf                [WARNINGS]
#  |
#  | Memory region         Used Size  Region Size  %age Used
#  |            FLASH:       89284 B         2 MB      4.26%
#  |              RAM:       34056 B       256 KB     12.99%
#  |        SCRATCH_X:          2 KB         4 KB     50.00%
#  |        SCRATCH_Y:          0 GB         4 KB      0.00%
#  |
# Creating binary load file for flashing: .build/keyboard_quantizer_mini_default.bin  [OK]
# Creating load file for flashing: .build/keyboard_quantizer_mini_default.hex         [OK]
# Creating UF2 file for deployment: .build/keyboard_quantizer_mini_default.uf2        [OK]
# Converting to uf2, output size: 178688, start address: 0x10000000
# Wrote 178688 bytes to keyboard_quantizer_mini_default.uf2.

ls -l *.uf2
# -rw-r--r-- 1 user user 178688 Aug  7 20:53 keyboard_quantizer_mini_default.uf2
# ファームウェアのビルド
qmk compile -kb keyboard_quantizer/mini -km default

 qmk compileコマンドの場合、RP2040への書き込みに必要な uf2ファイルが生成されません。

 各種設定の変更の
Keyboard Quantizer Configurator
 が動きました。

 VIAに読み込ませる JSONファイルを下記の様に変更します。
keyboard-quantizer.json
  "vendorId": "0xfeed",
  "productId": "0x9999",
を
  "vendorId": "feed",
  "productId": "0x999B",
に書き換える。
config.h
/* key matrix size */
#define MATRIX_ROWS 24
#define MATRIX_COLS 8
 なので
keyboard-quantizer.json
 も下記に書き換える。(書き換えないと VIAで編集する時に Layer 1以降(2面以降)のキー定義がズレる)
  "matrix": {
    "rows": 24,
    "cols": 8
  },

Web VIA app.
 で、「Use V2 definitions (deprecated)」をオンで VIA v2として読み込む事で VIA機能を使う事ができました。(同様に VIA.exe 3.0.0でも使用できました)

・RP2040 Keyboard Quantizer Mini with Via v2
RP2040 Keyboard Quantizer Mini with Via v2



Remap
 Remapは Keyboard Quantizerを JSONファイル不要で そのまま認識してくれます。

・RP2040 Keyboard Quantizer Mini with Remap
RP2040 Keyboard Quantizer Mini with Remap




2023/08/10
キーボードの VIAや QMKのファームウェアがバージョンアップして VIAを認識しないのを解決する方法
キーボードの VIAや QMKのファームウェアがバージョンアップして VIAを認識しないのを解決する方法

  VIA and QMK firmware update occure trouble to JSON error and not detect、support version matrix


● RP2040の QMKでも LTO_ENABLEは意味が有るの?

 結論:効果無し
 LTO_ENABLE無し
keyboard_quantizer_mini_default.uf2 194048 bytes

 LTO_ENABLE = yes
# LINK_TIME_OPTIMIZATION_ENABLE = yes
LTO_ENABLE = yes # Config Option Link Time Optimization

keyboard_quantizer_mini_default.uf2 194048 bytes

194048 bytesで変化無し

 ちなみに QMKの動的マクロ定義の
DYNAMIC_MACRO_ENABLE = yes
 で、195584 bytesになった。
 195584 - 194048 = 1536 byteの増加。

Any = 0x5D03 Record 1, DM_REC1
Any = 0x5D04 Record 2, DM_REC2

Any = 0x5D05 Stop

Any = 0x5D06 Play 1
Any = 0x5D07 Play 2

[UPDATE] 2023/09/02
QMKで動的にキーボードマクロを定義できる Dynamic Macrosを有効にする方法
QMKで動的にキーボードマクロを定義できる Dynamic Macrosを有効にする方法

  QMK 動的マクロ機能でランタイムでのマクロの記録および再生を行なう方法


● QMKキーボードに Caps Lockや Scroll Lock等の LEDインジケータ機能を追加する方法

2023/08/19
【ソースコード有り】QMKキーボードに Caps Lockや Scroll Lock等の LEDインジケータ機能を追加する方法
【ソースコード有り】QMKキーボードに Caps Lockや Scroll Lock等の LEDインジケータ機能を追加する方法

  How to add Caps Lock Scroll Lock LED indicators to QMK Keyboard


● Keyboard Quantizerの REMAP版ファームウェアに OLEDと Audio機能を追加して Quantizer+化する

 REMAP版ファームウェアを改造して OLED + Audioの Keyboard Quantizer+を作成できました。

QMK - Raspberry Pi RP2040

・ Keyboard Quantizerの REMAP版ファームウェアに OLED機能を追加する方法

 OLED機能として、今回は GPIO 28、29を使用します。
RP2040 Datasheet - 1.4.3. GPIO Functions
 の Function F3列を確認すると GPIO 28、29の I2Cは I2C0と書いてあります。

・RP2040 Keyboard Quantizer Mini add OLED function
RP2040 Keyboard Quantizer Mini add OLED function



 なので、下記の定義もイイ感じに I2C0を定義します。

keyboards/keyboard_quantizer/mini/rules.mk
OLED_ENABLE = yes           # Display Feature
OLED_DRIVER = SSD1306       # OLED SSD1306 128x32
#ifeq ($(strip $(OLED_ENABLE)), yes)
#    OLED_DRIVER_ENABLE = yes
#endif
keyboards/keyboard_quantizer/mini/config.h
#pragma once

/*
 * Display OLED SSD1306
 */
#define OLED_DISPLAY_ADDRESS 0x3C
#define OLED_BRIGHTNESS 128
#define OLED_IC OLED_IC_SSD1306
#define OLED_TIMEOUT 31000

// settings for the oled 72x40 0.42
#define OLED_DISPLAY_128X64
#define REAL_OLED_DISPLAY_WIDTH 72
#define REAL_OLED_DISPLAY_HEIGHT 40
#define REAL_OLED_COLUMN_OFFSET (28 - OLED_COLUMN_OFFSET)
#define REAL_OLED_CURSOL_COL_OFFSET (REAL_OLED_COLUMN_OFFSET / OLED_FONT_WIDTH)

#define OLED_UPDATE_INTERVAL 100

// RP2040 I2C I2C0
// settings for the oled keyboard demo with Adafruit 0.91" OLED display on the Stemma QT port
#define I2C_DRIVER i2c0
#define I2C1_SDA 28
#define I2C1_SCL 29

keyboards/keyboard_quantizer/mini/mini.c
#ifdef OLED_ENABLE

static int iii = 0;

static void test_logo(void) {
    uint8_t lines = oled_max_lines();
    if (lines > 3) {
        lines = 3;
    }
    uint8_t chars = oled_max_chars();
    if (chars > 21) {
        chars = 21;
    }
    for (uint8_t row = 0; row < lines; ++row) {
        oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, row);
        for (uint8_t col = 0; col < chars; ++col) {
            oled_write_char(0x80 + 0x20 * row + col, false);
        }
    }
}

oled_rotation_t oled_init_user(oled_rotation_t rotation) {
    return OLED_ROTATION_0;
}

void oled_task_user(void) {
    if (iii == 0) {
      oled_clear();
    }

    if (iii == 10) {
      oled_clear();
      test_logo();

      oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 3);
      oled_write_P(PSTR("OLED 0.42'.."), false);

      oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 4);
      oled_write_P(PSTR(".......72x40"), false);
    }

    if (iii == 20) {
      oled_clear();

      for (uint8_t y = 0; y < REAL_OLED_DISPLAY_HEIGHT; ++y) {
        for (uint8_t x = 0; x < REAL_OLED_DISPLAY_WIDTH; ++x) {
          oled_write_pixel(x + REAL_OLED_COLUMN_OFFSET, y, ((x/2 + y/2) & 1));
        }
      }
    }

    if (iii == 30) {
      for (uint8_t y = 0; y < REAL_OLED_DISPLAY_HEIGHT; ++y) {
        for (uint8_t x = 0; x < REAL_OLED_DISPLAY_WIDTH; ++x) {
          oled_write_pixel(x + REAL_OLED_COLUMN_OFFSET, y, !((x/2 + y/2) & 1));
        }
      }
    }

    if (iii == 40) {
      oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 0);
      oled_write_P(PSTR("QMK RP2040 !"), false);

      oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 1);
      oled_write_P(PSTR("FREE WING !!"), false);

      oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 2);
      oled_write_P(PSTR("123456789012"), false);

      oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 3);
      oled_write_P(PSTR("ABCDEFGHIJKL"), false);

      oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 4);
      oled_write_P(PSTR("#$%&'()=~|{}"), false);

      // Host Keyboard LED Status
      oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 4);
      led_t led_state = host_keyboard_led_state();
      oled_write_P(led_state.num_lock ? PSTR("[Nm]") : PSTR("[  ]"), led_state.num_lock);
      oled_write_P(led_state.caps_lock ? PSTR("[Cp]") : PSTR("[  ]"), led_state.caps_lock);
      oled_write_P(led_state.scroll_lock ? PSTR("[Sc]") : PSTR("[  ]"), led_state.scroll_lock);
    }

    if (++iii > 50) iii = 10;

    return;
}

#endif
 ※ QMKのファームウェアが古いので OLEDの関数が void oled_task_user(void)になっています。(最新の QMKのファームウェアは bool oled_task_user(void))

 OLEDが 72x40ドットで変則的なので QMKの OLEDドライバ側を変更します。
drivers/oled/ssd1306_sh1106.c
void oled_set_cursor(uint8_t col, uint8_t line) {
    uint16_t index = line * oled_rotation_width + col * OLED_FONT_WIDTH;
を
void oled_set_cursor(uint8_t col, uint8_t line) {
    line += 3;
    uint16_t index = line * oled_rotation_width + col * OLED_FONT_WIDTH;
    index += 4;
に書き換える。
drivers/oled/ssd1306_sh1106.c
void oled_write_pixel(uint8_t x, uint8_t y, bool on) {
    if (x >= oled_rotation_width) {
        return;
    }
    uint16_t index = x + (y / 8) * oled_rotation_width;
を
void oled_write_pixel(uint8_t x, uint8_t y, bool on) {
    if (x >= oled_rotation_width) {
        return;
    }
    y += 24;
    uint16_t index = x + (y / 8) * oled_rotation_width;
に書き換える。

QMK VIA RP2040 Keyboard Quantizer with OLED 0.42 72x40 SSD1306 Handwired



・ Keyboard Quantizerの REMAP版ファームウェアに Audio機能を追加する方法

 USBに電源が入り Keyboard Quantizerが起動すると「ドレミファソラシド♪」と音が鳴ります。

 Audio機能として、今回は GPIO 17を使用します。
RP2040 Datasheet - 1.4.3. GPIO Functions
 の Function F4列を確認すると GPIO 17は PWM0 Bと書いてあります。

 なので、下記の定義もイイ感じに PWM0 Bを定義します。

・RP2040 Keyboard Quantizer Mini add Audio function
RP2040 Keyboard Quantizer Mini add Audio function



keyboards/keyboard_quantizer/mini/rules.mk
# Audio
AUDIO_ENABLE = yes
AUDIO_DRIVER = pwm_hardware
config.h
/* Audio support */
// https://github.com/qmk/qmk_firmware/blob/master/docs/feature_audio.md
#ifdef AUDIO_ENABLE
  #define AUDIO_PIN 17
  #define AUDIO_PWM_DRIVER PWMD0
  #define AUDIO_PWM_CHANNEL RP2040_PWM_CHANNEL_B
  #define AUDIO_INIT_DELAY
  #define STARTUP_SONG SONG(M__NOTE(_C6, 30), M__NOTE(_D6, 30), M__NOTE(_E6, 30), M__NOTE(_F6, 30), M__NOTE(_G6, 30), M__NOTE(_A6, 30), M__NOTE(_B6, 30), M__NOTE(_C7, 30))

  #define NO_MUSIC_MODE

  // ARM Audio Volume
  #define AUDIO_DAC_SAMPLE_MAX 4095U
#endif

QMK VIA RP2040 Keyboard Quantizer with Audio (Piezo Buzzer) Handwired




● Full版ファームウェア
ファームウェアのソースコード keyboard/sekigon/keyboard_quantizer/mini-full

[Add Keyboard] Keyboard Quantizer Mini #20999
cd
git clone https://github.com/sekigon-gonnoc/qmk_firmware.git quantizer_mini_full --depth 1 -b keyboard/sekigon/keyboard_quantizer/mini-full

cd
cd quantizer_mini_full

# QMK Firmwareの初期設定
sudo ./util/qmk_install.sh
qmk -V
# if [ $? -ne 0 ]; then
  python3 -m pip install qmk
  PATH="$HOME/.local/bin:$PATH"
# fi
make git-submodule

 USBの GPIOの割り当てを D+ = 4から D+ = 10に変更します。
 (D-は D+の GPIOに +1を足したものに自動的になる)
qmk_firmware/blob/keyboard/sekigon/keyboard_quantizer/mini-full/keyboards/sekigon/keyboard_quantizer/mini/c1_usbh.c
    pio_cfg.pin_dp                  = 4;
を
    pio_cfg.pin_dp                  = 10;
に書き換える。
 コマンドラインでサクッと書き換えたい場合は下記のコマンドを実行する。
sed -e "s/pio_cfg.pin_dp[ ]*= 4;/pio_cfg.pin_dp = 10;/" -i keyboards/sekigon/keyboard_quantizer/mini/c1_usbh.c
grep pin_dp keyboards/sekigon/keyboard_quantizer/mini/c1_usbh.c
#   pio_cfg.pin_dp = 10;

 下記のコマンドでファームウェアのビルドして、できあがった keyboard_quantizer_mini_default.uf2を RP2040に書き込みます。
 動作 OK!

 各種設定の変更の
Keyboard Quantizer Configurator
 が動きました。

 ちなみに Full版は VIAには「非対応」です。
Keyboard Quantizer Config Generator を使用して設定ファイルでキーマップを変更します。
# ファームウェアのビルド
qmk compile -kb sekigon/keyboard_quantizer/mini -km full

# Ψ Compiling keymap with make --jobs=1 sekigon/keyboard_quantizer/mini:full
# Making sekigon/keyboard_quantizer/mini with keymap full
...
# Linking: .build/sekigon_keyboard_quantizer_mini_full.elf                          [OK]
# Creating UF2 file for deployment: .build/sekigon_keyboard_quantizer_mini_full.uf2 [OK]
# Copying sekigon_keyboard_quantizer_mini_full.uf2 to qmk_firmware folder           [OK]
# (Firmware size check does not yet support RP2040; skipping)

ls -l *.uf2
# -rw-r--r-- 1 user user 188928 Aug 14 13:31 sekigon_keyboard_quantizer_mini_full.uf2
# ファームウェアのビルド その2
make sekigon/keyboard_quantizer/mini:full:uf2

# Making sekigon/keyboard_quantizer/mini with keymap full and target uf2
...
# Linking: .build/sekigon_keyboard_quantizer_mini_full.elf                          [OK]
# Creating UF2 file for deployment: .build/sekigon_keyboard_quantizer_mini_full.uf2 [OK]


● Full版ファームウェアを VIA対応にする(本手順は間違いです!)

 Full版ファームウェアを VIA対応にする、は諦めました。

 defaultのキーマップには USB-USBの実装が無いので動きません!(本手順は間違いです!)

 この場合 fullでは無く defaultのキーマップを元に VIA対応を作成します。
 (なので Full版独自の機能は無くなります)

 defaultのキーマップには USB-USBの実装が無いので動きません!(本手順は間違いです!)

# defaultのキーマップを元に VIA対応を作成する
cd keyboards/sekigon/keyboard_quantizer/mini/keymaps/
cp -r default via
ls -l
# drwxr-xr-x 1 user user 4096 Aug 10 17:44 default
# drwxr-xr-x 1 user user 4096 Aug 10 17:44 full
# drwxr-xr-x 1 user user 4096 Aug 10 17:57 via
cd ../../../../..

# VIAを有効にした rules.mkファイルを keyboards/sekigon/keyboard_quantizer/mini/keymaps/via/に作る
echo "VIA_ENABLE = yes"> keyboards/sekigon/keyboard_quantizer/mini/keymaps/via/rules.mk

rules.mk
VIA_ENABLE = yes

# -km viaで keymaps viaを指定してファームウェアをビルドする
qmk compile -kb sekigon/keyboard_quantizer/mini -km via

ls -l *.uf2
# -rw-r--r-- 1 user user 118272 Aug 14 18:02 sekigon_keyboard_quantizer_mini_via.uf2

# sekigon_keyboard_quantizer_mini_via.uf2ファイルを RP2040に書き込む
 動作 OK!

keyboard-quantizer.json
 の
  "vendorId": "0xfeed",
  "productId": "0x9999",
  "lighting": "none",
を
  "vendorId": "feed",
  "productId": "0x999B",
に書き換える。
 で、「Use V2 definitions (deprecated)」をオフで VIA v3として読み込む事で VIA機能を使う事ができました。(同様に VIA.exe 3.0.0でも使用できました)

 Keyboard Quantizer Configuratorは使えません。
This firmware version is not supported


● Keyboard Quantizerの Full版ファームウェアに OLEDと Audio機能を追加して Quantizer+化する

・ Keyboard Quantizerの Full版ファームウェアに OLED機能を追加する方法

keyboards/sekigon/keyboard_quantizer/mini/keymaps/via/
 のディレクトリに OLEDや Audioの機能を盛っていきます。

 OLED機能として、今回は GPIO 28、29を使用します。
RP2040 Datasheet - 1.4.3. GPIO Functions
 の Function F3列を確認すると GPIO 28、29の I2Cは I2C0と書いてあります。

 なので、下記の定義もイイ感じに I2C0を定義します。

# keymaps viaに OLEDの定義を追加する
cd keyboards/sekigon/keyboard_quantizer/mini/keymaps/via/
rules.mk
# OLED SSD1306
OLED_ENABLE = yes
OLED_DRIVER = SSD1306

OPT_DEFS += -DHAL_USE_I2C=TRUE
mcuconf.h
#pragma once

#include_next <mcuconf.h>

#undef RP_I2C_USE_I2C0
#define RP_I2C_USE_I2C0 TRUE

#undef RP_I2C_USE_I2C1
#define RP_I2C_USE_I2C1 FALSE
config.h
#pragma once

// https://github.com/qmk/qmk_firmware/blob/master/docs/feature_oled_driver.md
// RP2040 I2C
#define I2C_DRIVER I2CD0
#define I2C1_SDA_PIN GP28
#define I2C1_SCL_PIN GP29

// settings for the oled 72x40 0.42
#define OLED_DISPLAY_128X64
#define REAL_OLED_DISPLAY_WIDTH 72
#define REAL_OLED_DISPLAY_HEIGHT 40
// #define OLED_DISPLAY_WIDTH 72
// #define OLED_DISPLAY_HEIGHT 40
// #define OLED_COLUMN_OFFSET 4
#define REAL_OLED_COLUMN_OFFSET (28 - OLED_COLUMN_OFFSET)
#define REAL_OLED_CURSOL_COL_OFFSET (REAL_OLED_COLUMN_OFFSET / OLED_FONT_WIDTH)

#define OLED_UPDATE_INTERVAL 100
keymap.c
#ifdef OLED_ENABLE

// OLED RP2040
// Draw the QMK logo at the top left corner, clipping if it does not fit.
static void test_logo(void) {
    uint8_t lines = oled_max_lines();
    if (lines > 3) {
        lines = 3;
    }
    uint8_t chars = oled_max_chars();
    if (chars > 21) {
        chars = 21;
    }
    for (uint8_t row = 0; row < lines; ++row) {
        oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, row);
        for (uint8_t col = 0; col < chars; ++col) {
            oled_write_char(0x80 + 0x20 * row + col, false);
        }
    }
}

oled_rotation_t oled_init_user(oled_rotation_t rotation) {
    // oled_scroll_set_area(0, 0);
    // oled_scroll_set_speed(scrolling_speed);
    return OLED_ROTATION_0;
}

//------------------------------------------------------------------------------
/** Set Lower Column Start Address for Page Addressing Mode. */
#define SSD1306_SETLOWCOLUMN 0x00
/** Set Higher Column Start Address for Page Addressing Mode. */
#define SSD1306_SETHIGHCOLUMN 0x10
/** Set Memory Addressing Mode. */
#define SSD1306_MEMORYMODE 0x20
/** Set display RAM display start line register from 0 - 63. */
#define SSD1306_SETSTARTLINE 0x40
/** Set Display Contrast to one of 256 steps. */
#define SSD1306_SETCONTRAST 0x81
/** Enable or disable charge pump.  Follow with 0X14 enable, 0X10 disable. */
#define SSD1306_CHARGEPUMP 0x8D
/** Set Segment Re-map between data column and the segment driver. */
#define SSD1306_SEGREMAP 0xA0
/** Resume display from GRAM content. */
#define SSD1306_DISPLAYALLON_RESUME 0xA4
/** Force display on regardless of GRAM content. */
#define SSD1306_DISPLAYALLON 0xA5
/** Set Normal Display. */
#define SSD1306_NORMALDISPLAY 0xA6
/** Set Inverse Display. */
#define SSD1306_INVERTDISPLAY 0xA7
/** Set Multiplex Ratio from 16 to 63. */
#define SSD1306_SETMULTIPLEX 0xA8
/** Set Display off. */
#define SSD1306_DISPLAYOFF 0xAE
/** Set Display on. */
#define SSD1306_DISPLAYON 0xAF
/**Set GDDRAM Page Start Address. */
#define SSD1306_SETSTARTPAGE 0XB0
/** Set COM output scan direction normal. */
#define SSD1306_COMSCANINC 0xC0
/** Set COM output scan direction reversed. */
#define SSD1306_COMSCANDEC 0xC8
/** Set Display Offset. */
#define SSD1306_SETDISPLAYOFFSET 0xD3
/** Sets COM signals pin configuration to match the OLED panel layout. */
#define SSD1306_SETCOMPINS 0xDA
/** This command adjusts the VCOMH regulator output. */
#define SSD1306_SETVCOMDETECT 0xDB
/** Set Display Clock Divide Ratio/ Oscillator Frequency. */
#define SSD1306_SETDISPLAYCLOCKDIV 0xD5
/** Set Pre-charge Period */
#define SSD1306_SETPRECHARGE 0xD9
/** Deactivate scroll */
#define SSD1306_DEACTIVATE_SCROLL 0x2E
/** No Operation Command. */
#define SSD1306_NOP 0XE3
//------------------------------------------------------------------------------
/** Set Pump voltage value: (30H~33H) 6.4, 7.4, 8.0 (POR), 9.0. */
#define SH1106_SET_PUMP_VOLTAGE 0X30
/** First byte of set charge pump mode */
#define SH1106_SET_PUMP_MODE 0XAD
/** Second byte charge pump on. */
#define SH1106_PUMP_ON 0X8B
/** Second byte charge pump off. */
#define SH1106_PUMP_OFF 0X8A

static int iii = 0;

bool oled_task_user(void) {
    if (iii == 0) {

      // OLED SSD1306 72x40 0.42"
      static const uint8_t PROGMEM display_setup1[] = {
        0x00, // I2C_CMD
        // SSD1306
        SSD1306_DISPLAYOFF,
        SSD1306_SETDISPLAYCLOCKDIV, 0x80,  // the suggested ratio 0x80
        SSD1306_SETMULTIPLEX, 0x27,        // (DISPLAYHEIGHT - 1)
        SSD1306_SETDISPLAYOFFSET, 0x0,     // no offset
        0x0ad, 0x010, /* Internal IREF Setting for the 0.42 OLED, see also issue https://github.com/olikraus/u8g2/issues/1047 */
        SSD1306_CHARGEPUMP, 0x14,          // internal vcc
        SSD1306_SETSTARTLINE,              // line #0
        SSD1306_NORMALDISPLAY,
        SSD1306_DISPLAYALLON_RESUME,
        SSD1306_MEMORYMODE, 0x00,
        SSD1306_SEGREMAP | 0x1,            // column 127 mapped to SEG0
        SSD1306_COMSCANDEC,                // column scan direction reversed
        SSD1306_SETCOMPINS, 0x12,          // 0x12 if height > 32 else 0x02
        SSD1306_SETCONTRAST, 0x5F,         // contrast level 127
        SSD1306_SETPRECHARGE, 0x22,        // pre-charge period (1, 15)
        SSD1306_SETVCOMDETECT, 0x20,       // vcomh regulator level
        SSD1306_DISPLAYON
      };

      if (!oled_send_cmd_P(display_setup1, ARRAY_SIZE(display_setup1))) {
          print("oled_init cmd set 1 failed\n");
          return false;
      }

      oled_clear();
    }

    if (iii == 10) {
      oled_clear();
      test_logo();

      oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 3);
      oled_write_P(PSTR("OLED 0.42'.."), false);

      oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 4);
      oled_write_P(PSTR(".......72x40"), false);
    }

    if (iii == 20) {
      oled_clear();

      for (uint8_t y = 0; y < REAL_OLED_DISPLAY_HEIGHT; ++y) {
        for (uint8_t x = 0; x < REAL_OLED_DISPLAY_WIDTH; ++x) {
          oled_write_pixel(x + REAL_OLED_COLUMN_OFFSET, y, ((x/2 + y/2) & 1));
        }
      }
    }

    if (iii == 30) {
      for (uint8_t y = 0; y < REAL_OLED_DISPLAY_HEIGHT; ++y) {
        for (uint8_t x = 0; x < REAL_OLED_DISPLAY_WIDTH; ++x) {
          oled_write_pixel(x + REAL_OLED_COLUMN_OFFSET, y, !((x/2 + y/2) & 1));
        }
      }
    }

    if (iii == 40) {
      oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 0);
      oled_write_P(PSTR("QMK RP2040 !"), false);

      oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 1);
      oled_write_P(PSTR("FREE WING !!"), false);

      oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 2);
      oled_write_P(PSTR("123456789012"), false);

      oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 3);
      oled_write_P(PSTR("ABCDEFGHIJKL"), false);

      oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 4);
      oled_write_P(PSTR("#$%&'()=~|{}"), false);

      // Host Keyboard LED Status
      oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 4);
      led_t led_state = host_keyboard_led_state();
      oled_write_P(led_state.num_lock ? PSTR("[Nm]") : PSTR("[  ]"), led_state.num_lock);
      oled_write_P(led_state.caps_lock ? PSTR("[Cp]") : PSTR("[  ]"), led_state.caps_lock);
      oled_write_P(led_state.scroll_lock ? PSTR("[Sc]") : PSTR("[  ]"), led_state.scroll_lock);
    }

    if (++iii > 50) iii = 10;

    return false;
}
#endif

 OLEDが 72x40ドットで変則的なので QMKの OLEDドライバ側を変更します。
drivers/oled/oled_driver.c
void oled_set_cursor(uint8_t col, uint8_t line) {
    uint16_t index = line * oled_rotation_width + col * OLED_FONT_WIDTH;
を
void oled_set_cursor(uint8_t col, uint8_t line) {
    uint16_t index = line * oled_rotation_width + col * OLED_FONT_WIDTH;
    index += 4;
に書き換える。

・ Keyboard Quantizerの Full版ファームウェアに Audio機能を追加する方法

 USBに電源が入り Keyboard Quantizerが起動すると「ドレミファソラシド♪」と音が鳴ります。

rules.mk
# Audio
AUDIO_ENABLE = yes
AUDIO_DRIVER = pwm_hardware
mcuconf.h
#pragma once

#include_next <mcuconf.h>

#undef RP_PWM_USE_PWM0
#define RP_PWM_USE_PWM0 TRUE
halconf.h
#pragma once

#define HAL_USE_PWM TRUE

#include_next <halconf.h>
config.h
#pragma once

/* Audio support */
// https://github.com/qmk/qmk_firmware/blob/master/docs/feature_audio.md
#ifdef AUDIO_ENABLE
  #define AUDIO_PIN GP17
  #define AUDIO_PWM_DRIVER PWMD0
  #define AUDIO_PWM_CHANNEL RP2040_PWM_CHANNEL_B
  #define AUDIO_INIT_DELAY
  #define STARTUP_SONG SONG(M__NOTE(_C6, 30), M__NOTE(_D6, 30), M__NOTE(_E6, 30), M__NOTE(_F6, 30), M__NOTE(_G6, 30), M__NOTE(_A6, 30), M__NOTE(_B6, 30), M__NOTE(_C7, 30))

  #define NO_MUSIC_MODE

  // ARM Audio Volume
  #define AUDIO_DAC_SAMPLE_MAX 4095U
#endif

・ rules.mkに OPT_DEFS += -DHAL_USE_PWM=TRUEを書くと halconf.hを不要にできる。

rules.mk
# Audio
AUDIO_ENABLE = yes
AUDIO_DRIVER = pwm_hardware
OPT_DEFS += -DHAL_USE_PWM=TRUE
 ※ この場合、halconf.hは不要


・ Keyboard Quantizerの Full版ファームウェアに WS2812の RGB LED機能を追加する方法

 WS2812の RGB LED機能として、RP2040-Zeroは GPIO 16を使用します。

rules.mk
# WS2812 RGB LED
WS2812_DRIVER = vendor
RGBLIGHT_ENABLE = yes
mcuconf.h
#pragma once

#include_next <mcuconf.h>
config.h
#define WS2812_DI_PIN GP16
#ifdef WS2812_DI_PIN
#    define RGBLED_NUM 1
#    define RGBLIGHT_HUE_STEP 8
#    define RGBLIGHT_SAT_STEP 8
#    define RGBLIGHT_VAL_STEP 8
#    define RGBLIGHT_LIMIT_VAL 255
#    define RGBLIGHT_SLEEP
/*== all animations enable ==*/
#    define RGBLIGHT_ANIMATIONS
#endif

#define RGBLIGHT_EFFECT_BREATHING
#define RGBLIGHT_EFFECT_RAINBOW_MOOD
#define RGBLIGHT_EFFECT_RAINBOW_SWIRL
#define RGBLIGHT_EFFECT_SNAKE
#define RGBLIGHT_EFFECT_KNIGHT
#define RGBLIGHT_EFFECT_CHRISTMAS
#define RGBLIGHT_EFFECT_STATIC_GRADIENT
#define RGBLIGHT_EFFECT_RGB_TEST
#define RGBLIGHT_EFFECT_ALTERNATING
#define RGBLIGHT_EFFECT_TWINKLE
keymap.c
// https://github.com/qmk/qmk_firmware/blob/master/docs/feature_rgblight.md
void keyboard_post_init_user(void) {
    rgblight_enable_noeeprom();
    rgblight_sethsv_noeeprom(HSV_CYAN);
    // rgblight_mode_noeeprom(RGBLIGHT_MODE_RAINBOW_SWIRL);
    rgblight_mode_noeeprom(RGBLIGHT_MODE_RGB_TEST);
}

QMK VIA RP2040 Keyboard Quantizer with WS2812 RGB LED Handwired



●その他 QMKの Tips

\keymaps\hoge
 に
keymap.json
 が有ると、
keymap.c
 が無視される。

 keymap.cをビルドしたい場合は keymap.jsonを削除する必要が有る。



● QMKの破壊的アップデート

error: 'WS2812_DI_PIN' undeclared
error: 'RGB_DI_PIN' undeclared
platforms/chibios/drivers/vendor/RP/RP2040/ws2812_vendor.c:188:20: error: 'RGB_DI_PIN' undeclared (first use in this function); did you mean 'RGB_M_SN'?
  188 |     palSetLineMode(RGB_DI_PIN, rgb_pin_mode);

 チョイ前の QMKは RGB_DI_PINを使用する。
 現在の QMKは WS2812_DI_PIN(or APA102_DI_PINや APA102_CI_PIN)を使用する。

#define WS2812_DI_PIN GP16
#define RGB_DI_PIN WS2812_DI_PIN
RGB Lighting
WS2812 Driver

* POINTING_DEVICE_DRIVER= is not a valid pointing device type [ERRORS]

POINTING_DEVICE_DRIVER = custom
fatal error: config_common.h: No such file or directory
#include "config_common.h"
 ↓
#include "matrix.h"

./quantum/config_common.h
 ↓
./quantum/matrix.h
users/sekigon/jp_us_overrides/jp_key_on_us_os_overrides.c

fatal error: usb_host_os_identifier.h: No such file or directory

#include "usb_host_os_identifier.h"
 ↓
#include "os_detection.h"

./quantum/usb_host_os_identifier.h
 ↓
./quantum/os_detection.h

rules.mk
OS_DETECTION_ENABLE = yes

#define OS_TYPE os_variant_t
#define OS_TYPE_UNKNOWN OS_UNSURE
#define OS_TYPE_WIN OS_WINDOWS
#define OS_TYPE_MAC OS_MACOS
#define OS_TYPE_LINUX OS_LINUX
#define OS_TYPE_MAX OS_IOS
fatal error: keymap_jp.h: No such file or directory

#include "keymap_jp.h"
 ↓
#include "keymap_japanese.h"

./quantum/keymap_extras/keymap_jp.h
 ↓
./quantum/keymap_extras/keymap_japanese.h
quantum/keymap_extras/keymap_japanese.h:94:17: error: implicit declaration of function 'S' [-Werror=implicit-function-declaration]
#define JP_EXLM S(JP_1)    // !

#include "keymap_japanese.h"
 ↓
#include "quantum.h"
#include "keymap_japanese.h"
error: 'KC_FN0' undeclared here (not in a function); did you mean 'KC_F20'?

keycode.h
/* Media and Function keys */
enum internal_special_keycodes {
    /* Fn keys */
    KC_FN0 = 0xC0,
note: #pragma message: 'keymap.h' should no longer be included!
#pragma message("'keymap.h' should no longer be included!")

#include "keymap.h"
 ↓
#include "keycode_config.h"

./quantum/keymap.h
 ↓
./quantum/keycode_config.h
error: 'keymap_config' undeclared (first use in this function)

#include "keymap.h"
 ↓
#include "keycode_config.h"
error: implicit declaration of function 'get_usb_host_os_type'; did you mean 'pio_usb_host_stop'?

get_usb_host_os_type()

declares `os_variant_t detected_host_os(void);`
void pointing_device_task(void) {
  ...
}
 ↓
bool pointing_device_task(void) {
  ...

    return false;
}
error: 'KC_LCTRL' undeclared (first use in this function); did you mean 'KC_LCTL'?
error: 'KEY_OVERRIDE_OFF' undeclared (first use in this function); did you mean 'QK_KEY_OVERRIDE_OFF'?
error: 'CMB_ON' undeclared (first use in this function); did you mean 'CM_ON'?
error: 'CMB_OFF' undeclared (first use in this function); did you mean 'CM_OFF'?
error: 'CMB_TOG' undeclared (first use in this function); did you mean 'CM_TOGG'?

KC_LCTRL -> KC_LEFT_CTRL KC_LCTL
KEY_OVERRIDE_OFF -> QK_KEY_OVERRIDE_OFF

CMB_ON -> CM_ON
CMB_OFF -> CM_OFF
CMB_TOG -> CM_TOGG
keycodes_basic.md

Deprecate KEY_OVERRIDE_* keycodes for KO_* #18843 KEY_OVERRIDE_OFF -> QK_KEY_OVERRIDE_OFF
Normalise Combo keycodes #18877 CMB_ON -> CM_ON
Basic keycode overhaul (#14726)
Basic keycode overhaul #14726

error: 'QK_BOOTLOADER' undeclared (first use in this function)
error: 'QK_CLEAR_EEPROM' undeclared (first use in this function)
error: 'MO_LAYER1' undeclared (first use in this function);

QK_BOOTLOADER QK_BOOT QK_RESET
QK_CLEAR_EEPROM	EE_CLR
quantum_keycodes.md

quantum/bitwise.h

uint8_t biton(uint8_t bits);
uint8_t biton16(uint16_t bits);
uint8_t biton32(uint32_t bits);

quantum/action_layer.h
#    define get_highest_layer(state) biton(state)
#    define get_highest_layer(state) biton16(state)
#    define get_highest_layer(state) biton32(state)

quantum/quantum_keycodes.h

// Momentary switch layer - 256 layer max
#define MO(layer) (QK_MOMENTARY | ((layer)&0xFF))

    QK_MOMENTARY            = 0x5100,
    QK_MOMENTARY_MAX        = 0x51FF,

// L-ayer, T-ap - 256 keycode max, 16 layer max
#define LT(layer, kc) (QK_LAYER_TAP | (((layer)&0xF) << 8) | ((kc)&0xFF))

    QK_LAYER_TAP            = 0x4000,
    QK_LAYER_TAP_MAX        = 0x4FFF,
LT with Mod,Key #1730


● Raspberry Pi Pico and Pico Wのフラッシュメモリを初期化する方法

 flash_nuke.uf2ファイルを書き込む。

Raspberry Pi Documentation - Resetting Flash memory

Download the UF2 file flash_nuke.uf2



Tags: [電子工作], [QMK]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

BUFFALOの USB テンキーを Pro Microと QMKを使って VIAカスタマイズ キーボードに改造する方法
BUFFALOの USB テンキーを Pro Microと QMKを使って VIAカスタマイズ キーボードに改造する方法

  BUFFALO USB 10-Key keyboard BSTK100 modification by Pro Micro and QMK firmware VIA

QMK firmwareの開発環境を ラズパイや Windows WSLにセットアップする方法
QMK firmwareの開発環境を ラズパイや Windows WSLにセットアップする方法

  ラズパイや Windows WSL環境でカスタマイズ キーボードのファームウェア QMK firmwareの開発環境を構築

QMK firmwareでプログラムのサイズを小さくするテクニック、ケチケチ プログラミングの方法
QMK firmwareでプログラムのサイズを小さくするテクニック、ケチケチ プログラミングの方法

  QMK firmware How to Reduce Program Size、Reducing QMK firmware size

QMK firmwareで I/Oピンが足りない場合にデコーダ、デマルチプレクサを使用して IOを拡張する解決方法
QMK firmwareで I/Oピンが足りない場合にデコーダ、デマルチプレクサを使用して IOを拡張する解決方法

  QMK firmware expand I/O for many matrix keyboard、How to use IO Expander Multiplexer / Demultiplexer / Decoder

QMK firmwareで I/Oピンが足りない場合に I2Cの GPIOエキスパンダを使用して IOを拡張する解決方法
QMK firmwareで I/Oピンが足りない場合に I2Cの GPIOエキスパンダを使用して IOを拡張する解決方法

  QMK firmware expand I/O for many matrix keyboard、How to use I2C GPIO Expander PCF8574 and PCF8575

QMK firmwareで Audio機能を試してみる
QMK firmwareで Audio機能を試してみる

  QMK firmware test Audio function with Piezo buzzer

QMK firmwareで OLED機能で SSD1306を試してみる
QMK firmwareで OLED機能で SSD1306を試してみる

  QMK firmware test OLED Driver with SSD1306

QMK firmwareで Analog Stick機能で PSP2000用アナログ ジョイスティックを試してみる
QMK firmwareで Analog Stick機能で PSP2000用アナログ ジョイスティックを試してみる

  QMK firmware test Analog Joystick function with PSP2000 Analog Stick

最新の QMK firmwareで new_keyboard.shのコマンドが動かなくなったのを修正する方法
最新の QMK firmwareで new_keyboard.shのコマンドが動かなくなったのを修正する方法

  QMK Bugfix Create New Keyboard new_keyboard.sh command No such file or directory Error

QMK firmwareの Githubを forkした自分のリモートに pushすると怒られて pushできない場合の対応方法
QMK firmwareの Githubを forkした自分のリモートに pushすると怒られて pushできない場合の対応方法

  refusing to allow an OAuth App to create or update workflow `.github/workflows/api.yml` without `workflow` scope

中華製の格安なプログラマブル USBキーボードを買ってみた QMK VIAとは別物
中華製の格安なプログラマブル USBキーボードを買ってみた QMK VIAとは別物

  中華製のプログラマブル USBキーボード KeyboardSetter.exe

社畜のキーボード「新入社員の同期」を購入してみた!! VIA、QMK、Remapでのカスタマイズに対応
社畜のキーボード「新入社員の同期」を購入してみた!! VIA、QMK、Remapでのカスタマイズに対応

  キー内容が Remap等でカスタマイズ可能な社畜のキーボード「新入社員の同期」を 3500円で購入




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2023 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/hardware/qmk_via_rp2040_keyboard_quantizer/