測試硬體
要改用 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 的部分註解掉。
#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,改變運作棤式,不需要改接線。
#pragma once
#include "quantum.h"
#define LAYOUT( \
K00, K01, K02 \
) { \
{ K00, K01, K02} \
}
#include "stm32test.h"
編譯
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
| ^~
#include <stdbool.h>
#include "ps2_io.h"
#include "gpio.h"
// chibiOS headers
#include "ch.h"
#include "hal.h"
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 列出裝置。
使用下列指令燒入 bin 檔
再把 boot0 跳線回 0,重新接上電腦,使用 dmesg 看到下列訊息
使用鍵盤測試程式,測試鍵盤功能正確。
測試 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
| ^~
#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 ^~
沒有留言:
張貼留言