測試硬體
要改用 STM32F103 開發板來改裝小紅點鍵盤,首先弄個簡單的測試電路來測試連接 trackpoint 的基本功能。小紅點模組不能直接鎖在電路板上,自己用3D印表機打印了一個固定小紅點模組的固定板。
這塊 trackpoint module 經測試可以使用 3.3V 的電源,但是 DAT 及 CLK 的信號線要用 4.7K 的電阻 pull high 至3.3V。
關於 trackpoint 的設定檔參考 handwired/trackpoint 的設定。關於 STM32F103 的設定則是參考 doio/kb16/rev2 的設定。
因為不同的 bootloader 要有不同的設定,為了支援 dfu-util,又重燒 STM32duino-bootloader。直接下載 binary 檔 generic_boot20_pc13.bin 即可,這個檔是指 LED 接在 PC13 的接腳。
設定檔案
首先測試簡單的 busywait 運作模式,確認電路連接正常。
info.json 如下。
{
"keyboard_name": "Trackpoint Demo",
"manufacturer": "QMK",
"url": "",
"maintainer": "qmk",
"usb": {
"vid": "0x1234",
"pid": "0x5678",
"device_version": "0.0.1"
},
"processor": "atmega32u4",
"bootloader": "halfkay",
"layouts": {
"LAYOUT": {
"layout": [
{"x": 0,"y": 0},
{"x": 1,"y": 0},
{"x": 2,"y": 0}
]
}
}
}
主要是指定 USB 相關的資訊,compile 時會讀取。vid 和 pid 應是亂設的,使用 lsusb 看到的資訊如下。
Bus 001 Device 026: ID 1234:5678 Brain Actuated Technologies Trackpoint Demo
rules.mk 如下。內容是抄來的,有些意義不是很了解,但可通過編譯,就留著不管了。
# MCU name
MCU = STM32F103
OPT_DEFS += -DBOOTLOADER_STM32DUINO
MCU_LDSCRIPT = STM32F103xB_stm32duino_bootloader
BOARD = STM32_F103_STM32DUINO
# Bootloader selection
BOOTLOADER = custom
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
MOUSEKEY_ENABLE = no # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = no # Console for debug
COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = yes # Enable N-Key Rollover
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
AUDIO_ENABLE = no # Audio output
# Enter lower-power sleep mode when on the ChibiOS idle thread
OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
PS2_MOUSE_ENABLE = yes
PS2_ENABLE = yes
PS2_DRIVER = busywait
#PS2_DRIVER = interrupt
先測最簡單的 busywait 運作模式,先把 interrupt 的部分註解掉。
config.h 如下。只設定了三個按鍵,可以測試鍵盤功能。
#pragma once
#define MATRIX_COL_PINS { B3, B4, B5 }
#define MATRIX_ROW_PINS { B0 }
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
#define LOCKING_SUPPORT_ENABLE
#define LOCKING_RESYNC_ENABLE
#ifdef PS2_DRIVER_BUSYWAIT
#define PS2_CLOCK_PIN B8
#define PS2_DATA_PIN B9
#define PS2_MOUSE_USE_REMOTE_MODE
#endif
#ifdef PS2_DRIVER_INTERRUPT
#define PS2_CLOCK_PIN B8
#define PS2_DATA_PIN B9
#endif
其中會依 rules.mk 設定的運作模式決定引入相關定義。把接腳都設成一樣的 PIN,改變運作棤式,不需要改接線。
stm32test.h 如下。
#pragma once
#include "quantum.h"
#define LAYOUT( \
K00, K01, K02 \
) { \
{ K00, K01, K02} \
}
stm32test.c 只有一行,如下。
編譯
執行下面的指令開始編譯。
qmk compile -kb ajtest/stm32test -km default"
很不幸出現下面的錯誤。
......
platforms/chibios/drivers/ps2/ps2_io.c: In function 'clock_lo':
./keyboards/ajtest/stm32test/config.h:13:27: error: 'B8' undeclared (first use in this function)
13 | #define PS2_CLOCK_PIN B8
| ^~
...........
platforms/chibios/drivers/ps2/ps2_io.c: In function 'data_lo':
./keyboards/ajtest/stm32test/config.h:14:27: error: 'B9' undeclared (first use in this function)
14 | #define PS2_DATA_PIN B9
| ^~
Google 找到答案,platforms/chibios/drivers/ps2/ps2_io.c 要加入一行 include,如下。
#include <stdbool.h>
#include "ps2_io.h"
#include "gpio.h"
// chibiOS headers
#include "ch.h"
#include "hal.h"
可以成功 compile,但在 link 時出錯。
Linking: .build/ajtest_stm32test_default.elf [ERRORS]
|
| /usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: .build/obj_ajtest_stm32test_default/ps2_mouse.o: in function `ps2_mouse_task':
| /home/ajax/qmk_firmware/drivers/ps2/ps2_mouse.c:93: undefined reference to `pbuf_has_data'
| collect2: error: ld returned 1 exit status
|
gmake[1]: *** [builddefs/common_rules.mk:267: .build/ajtest_stm32test_default.elf] Error 1
gmake: *** [Makefile:392: ajtest/stm32test:default] Error 1
在這裡卡了好久,搜尋程式碼,`pbuf_has_data' 只有定義在 drivers/ps2/ps2_interrupt.c 中,而 ps2_busywait.c 中沒有這一個 function。
後來看到 ps2_mouse.c 中呼叫 `pbuf_has_data' 的前面,有作判斷
"#ifdef PS2_MOUSE_USE_REMOTE_MODE"
意思是使用 remote moe 就不會呼叫此 function。否則使用 stream mode,此模式最好使用 interrupt 運作方式。
在 config.h 加入 "#define PS2_MOUSE_USE_REMOTE_MODE" 後,成功產生 bin 檔。
燒錄
使用 docker 環境,需使用 usb 裝置及 privileged 參數。執行指令如下。
docker run -it --privileged \
-v /dev/bus/usb:/dev/bus/usb \
-v `pwd`:/work \
qmk-dev bash
可將開發板的 boot0 接到 1,連上電腦,使用 dfu-util 列出裝置。
-----------------------------------
# dfu-util --list
dfu-util 0.11
Found DFU: [1eaf:0003] ver=0201, devnum=8, cfg=1, intf=0, path="1-8.1.1", alt=2, name="STM32duino bootloader v1.0 Upload to Flash 0x8002000", serial="LLM 003"
Found DFU: [1eaf:0003] ver=0201, devnum=8, cfg=1, intf=0, path="1-8.1.1", alt=1, name="STM32duino bootloader v1.0 Upload to Flash 0x8005000", serial="LLM 003"
Found DFU: [1eaf:0003] ver=0201, devnum=8, cfg=1, intf=0, path="1-8.1.1", alt=0, name="STM32duino bootloader v1.0 ERROR. Upload to RAM not supported.", serial="LLM 003"
-----------------------------------使用下列指令燒入 bin 檔
------------------------------------------
# dfu-util -D ajtest_stm32test_default.bin -a 2
dfu-util 0.11
dfu-util: Warning: Invalid DFU suffix signature
dfu-util: A valid DFU suffix will be required in a future dfu-util release
Opening DFU capable USB device...
Device ID 1eaf:0003
Device DFU version 0110
Claiming USB DFU Interface...
Setting Alternate Interface #2 ...
Determining device status...
DFU state(2) = dfuIDLE, status(0) = No error condition is present
DFU mode device DFU version 0110
Device returned transfer size 1024
Copying data from PC to DFU device
Download [=========================] 100% 23248 bytes
Download done.
DFU state(8) = dfuMANIFEST-WAIT-RESET, status(0) = No error condition is present
Resetting USB to switch back to runtime mode
Done!
------------------------------------------再把 boot0 跳線回 0,重新接上電腦,使用 dmesg 看到下列訊息
-------------------------------------------------
[ 813.021552] usb 1-8.1.1: new full-speed USB device number 11 using xhci_hcd
[ 813.113109] usb 1-8.1.1: New USB device found, idVendor=1234, idProduct=5678, bcdDevice= 0.01
[ 813.113123] usb 1-8.1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 813.113130] usb 1-8.1.1: Product: Trackpoint Demo
[ 813.113135] usb 1-8.1.1: Manufacturer: QMK
[ 813.121950] input: QMK Trackpoint Demo as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8.1/1-8.1.1/1-8.1.1:1.0/0003:1234:5678.000C/input/input33
[ 813.178954] hid-generic 0003:1234:5678.000C: input,hidraw0: USB HID v1.11 Keyboard [QMK Trackpoint Demo] on usb-0000:00:14.0-8.1.1/input0
[ 813.180015] input: QMK Trackpoint Demo as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8.1/1-8.1.1/1-8.1.1:1.1/0003:1234:5678.000D/input/input34
[ 813.180655] hid-generic 0003:1234:5678.000D: input,hidraw1: USB HID v1.11 Mouse [QMK Trackpoint Demo] on usb-0000:00:14.0-8.1.1/input1
[ 813.182002] input: QMK Trackpoint Demo System Control as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8.1/1-8.1.1/1-8.1.1:1.2/0003:1234:5678.000E/input/input35
[ 813.238550] input: QMK Trackpoint Demo Consumer Control as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8.1/1-8.1.1/1-8.1.1:1.2/0003:1234:5678.000E/input/input36
[ 813.238850] input: QMK Trackpoint Demo Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8.1/1-8.1.1/1-8.1.1:1.2/0003:1234:5678.000E/input/input37
[ 813.239723] hid-generic 0003:1234:5678.000E: input,hidraw2: USB HID v1.11 Keyboard [QMK Trackpoint Demo] on usb-0000:00:14.0-8.1.1/input2
-------------------------------------------------使用鍵盤測試程式,測試鍵盤功能正確。
測試 interrupt 運作模式
接下來測試 interrupt 的運作模式。QMK 中,對於 stm32 並沒有支援 best 的 USART 運作模式,只能退而求其,使用 better 的 interrupt 運作模式。
按照 QMK 的說明,除了設定 rules.mk 和 config.h 的設定值外,還要修改
platforms/chibios/boards/common/configs/halconf.h
加入 "#define PAL_USE_CALLBACKS TRUE",為了確保有一定會加上,我是把原來設定為 FALSE 的設定註解掉,把新的設定放在判斷區塊之外。
修改後,執行編譯再次出現錯誤誤。
......
drivers/ps2/ps2_interrupt.c: In function 'ps2_host_init':
./keyboards/ajtest/stm32test/config.h:20:25: error: 'B8' undeclared (first use in this function)
13 | #define PS2_CLOCK_PIN B8
| ^~
...........
drivers/ps2/ps2_interrupt.c: In function 'ps2_host_send':
./keyboards/ajtest/stm32test/config.h:20:25: error: 'B8' undeclared (first use in this function)
14 | #define PS2_DATA_PIN B8
| ^~
在 drivers/ps2/ps2_interrupt.c 加上 include 即可,如下。
#if defined(__AVR__)
# include <avr/interrupt.h>
#elif defined(PROTOCOL_CHIBIOS) // TODO: or STM32 ?
// chibiOS headers
#include "gpio.h"
# include "ch.h"
# include "hal.h"
#endif ^~
編譯成功。燒錄至開發板,測試功能正常。接下來就可以改裝有小紅點功能的鍵盤了。