2023年4月30日 星期日

STM32F103 開發板連接 Trackpoint 測試

測試硬體

要改用 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 只有一行,如
#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
      |                           ^~
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                           ^~
編譯成功。燒錄至開發板,測試功能正常。接下來就可以改裝有小紅點功能的鍵盤了。



沒有留言:

張貼留言

網誌存檔