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



2023年4月27日 星期四

STM32F103 開發板改裝 stm32-hid-bootloader

 確定可以使用 ST-LINK 燒錄 STM32F103 開發板後,就可以選擇自己喜歡的 bootloader 了。在測試燒錄功能時,照著教學的步驟燒了 STM32duino-bootloader,但其要配合  Arduino IDE 使用。我只想做 QMK 的鍵盤程式,它有自己的開發環境,所以我只要單純的 bootloader,能寫入程式即可。

假如有用 Vial GUI 的話,那使用 vial-kb / vibl 會比較方便。但我才剛起步,鍵盤連個影子都沒,就用 vibl 所參考的,輕薄短小的 bootsector / stm32-hid-bootloader 吧。

和 STM32duino-bootloader 的 bin 檔為 22KB,stm32-hid-bootloader 號稱只有 4KB,真的小很多。

stm32-hid-bootloader 沒有提供編譯好的 bin 檔,所以自己得要有 stm32 的開發環境才行。用 docker 來建立開發環境是比較好的選擇,不會把自己的電腦弄亂。

參考 Beningo 的  USING DOCKER TO SETUP AN STM32 BUILD ENVIRONMENT,建立 Dockerfile 如下

------------------------------
FROM ubuntu:22.10

# Download Linux support tools
RUN apt-get update && \
         apt-get clean && \
         apt-get install -y \
             build-essential \
             wget \
             curl

# Set up a development tools directory
WORKDIR /home/dev
ADD . /home/dev

RUN wget -qO- https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 | tar -xj

ENV PATH $PATH:/home/dev/gcc-arm-none-eabi-10.3-2021.10/bin

WORKDIR /home/app
------------------------------

然後執行 "docker build -t gcc-arm ." 建立 image。

補記 -- 其實在 Ubuntu 下可以直接執行 "apt-get install gcc-arm-none-eabi" 安裝 arm 的編譯器。

執行 "docker run --rm -it --privileged -v "$(pwd):/home/app" gcc-arm bash" 即可進入 stm32 的開發環境。

下載 stm32-hid-bootloader 的專案後,它有三個目錄。進入 [bootloader] 目錄,執行 make,即可產生 HIDBOOTLOADER.bin。使用 ST-LINK 燒錄到 STM32F103 開發板。

將 boot0 連上電腦會出現裝置,訊息如下

hid-generic 0003:1209:BABE.0012: hiddev100,hidraw9: USB HID v1.11 Device [www.brunofreitas.com STM32F HID Bootloader] on usb-0000:00:14.0-7.4.3/input0

回到一般的 Linux 下,到 [cli] 目錄下,執行 make,即可產生 hid-flash 的燒錄指令。

在 stm32 的開發環境下,進入 [blinker] 目錄,執行 make,產生 BLINKER.bin。這是一個讓接在 PC13 的 LED 閃爍的簡單小程式,可以自己修改一下,改變閃爍頻率,確認一切正常。

在 Linux 的環境下,將 boot0 跳線到 1,執行燒錄。

----------------------------
$ sudo ../cli/hid-flash BLINKER.bin 
HID-Flash v1.4a - STM32 HID Bootloader Flash Tool
(c) 04/2018 - Bruno Freitas - http://www.brunofreitas.com/
Sending reset pages command...
Flashing firmware...
Ok!
---------------------------- 

再將 boot0 跳線到 0,重新接上電源,即可看到 LED 按照 blinker 的程式在閃爍著。

接下來,就可以開發 OMK 的鍵盤了。至於跳線 pin 會用指撥開關來代替,比較方便。


2023年4月24日 星期一

STM32F103 開發板燒錄

最近看到 QMK 支援 PS/2 界面滑鼠的說明,可以支援 stm32 開發板。相對於 Teensy 2.0 開發板在淘寶要賣 50RMB,STM32F103C8T6 一塊售價不到 15RMB,stm32 開發板實在便宜多了。Teensy 2.0 使用 8bit CPU,I/O 只有 25 個。STM32 則是 32bit CPU,I/O 有32個以上。無奈 QMK 對 AVR 的 CPU 支援較完整,一直到 Aug 6, 2021,在 feature_ps2_mouse.md 才加入 Interrupt Version (ARM chibios) 的說明。即使如此,加上 trapoint 的設定後,編譯時還是會出錯,要對原始碼做一些修正才能成功編譯。

先前已有買了兩片 STM32F103 開發板,趕快把它翻出來。當時也買了 FTDI 燒錄器,其實就是 USB 轉 RS232 的小裝置。Google 到不少介紹透過 UART 燒錄 STM32F103 開發板的資訊,就照著做。

先到 ST 的網站註冊下載 STM32 Flash loader demonstrator。安裝後,怎麼都連不上,出現無法辨識的裝置的訊息。手邊有兩塊板子,一塊是較便宜國產芯片,一塊是貴一倍的原廠芯片,都一樣連不上。

爬文看到中國網友建議使用 FlyMCU。很容易就找到程式下載,不需安裝就可使用。一樣連不上。有一些貼文說明要用 CTR/RTS 控制 reset 和 boot0,照著接線,還是 connection fail。後來再試,會出現 com port 被佔用的情況。最後發現這程式會自動執行,還不知道它做了什麼手腳,無法清除。

心得是,中國的軟體最後別試,它會像附骨之蛆,擺脫不掉。還好是使用VM測試,只好把整個 VMDK 用備份檔蓋掉。

再看一下各網拍的介紹,都說要用 ST-LINK 來燒錄。找了蝦皮台灣出貨的賣家,一個不到 100元,看評論說買兩個一個不能用,就多買一個吧。週日下單,拖到週一白天還沒出貨,最後在半夜寄出。週一白天忍不住想知道結果,又在蝦皮找到光華商場有現貨的賣家,下班後直接跑去買,一個 220 元。門巿經營的成本,還在可接受的範圍。

回家立刻到 ST 網站下載 STM32 ST-LINK utility。安裝後執行,立刻成功連上開發板,並成功燒錄 DFU 程式。將 boot0 切換到執行狀態,插上電腦就出現可辨識的裝置了。



很容易就可以把 ST-LINK 的電路板拔出來,其實它也是一個 F103CBT6 芯片。

猜測可能是後來出的 STM32 芯片已經不包含 UART 燒錄的功能。ST 在 STM-FLASHER 和 ST-LINK 的下載頁面都有 (replaced by STM32CubeProgrammer) 的提示。下回再用 STM32CubeProgrammer 測測看,它是跨平台的,可以在 Linux 下執行。



2023年4月6日 星期四

MKS MONSTER8 燒錄 firmware

 參考 跟着思兼学习Klipper(21)新一代全能选手: Octopus Max EZ 简要使用记录,github: makerbase-mks / MKS-Monster8

------------------------
$ cd ~/klipper
$ make flash FLASH_DEVICE=/dev/serial/by-id/usb-STMicroelectronics_MARLIN_STM32F407VGT6_CCM_CDC_in_FS_Mode_207F366F4847-if00 

  Flashing out/klipper.bin to /dev/serial/by-id/usb-STMicroelectronics_MARLIN_STM32F407VGT6_CCM_CDC_in_FS_Mode_207F366F4847-if00
Entering bootloader on /dev/serial/by-id/usb-STMicroelectronics_MARLIN_STM32F407VGT6_CCM_CDC_in_FS_Mode_207F366F4847-if00
Device reconnect on /sys/devices/platform/ff5d0000.usb/usb3/3-1/3-1:1.0
sudo dfu-util -p 3-1 -R -a 0 -s 0x800c000:leave -D out/klipper.bin
[sudo] password for mks: 
dfu-util 0.9
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
dfu-util: Invalid DFU suffix signature
dfu-util: A valid DFU suffix will be required in a future dfu-util release!!!
dfu-util: No DFU capable USB device available
Failed to flash to /dev/serial/by-id/usb-STMicroelectronics_MARLIN_STM32F407VGT6_CCM_CDC_in_FS_Mode_207F366F4847-if00: Error running dfu-util
If the device is already in bootloader mode it can be flashed with the
following command:
  make flash FLASH_DEVICE=0483:df11
  OR
  make flash FLASH_DEVICE=1209:beba
If attempting to flash via 3.3V serial, then use:
  make serialflash FLASH_DEVICE=/dev/serial/by-id/usb-STMicroelectronics_MARLIN_STM32F407VGT6_CCM_CDC_in_FS_Mode_207F366F4847-if00
make: *** [src/stm32/Makefile:101: flash] Error 255
------------------------

失敗,先按 [BOOT0],再按 [RESET],進入 bootloader mode,然後執行燒錄。


------------------------------------

make flash FLASH_DEVICE=0483:df11


出現下列錯誤

Moonraker requires sudo permission to update the system service. Please check your notifications for further intructions.

執行下述指令,我也不清楚做什麼用,網路上找到的

$ scripts/data-path-fix.sh

再升級 pip,反正就亂玩吧

$ /home/mks/moonraker-env/bin/python3 -m pip install --upgrade pip


X 方向相反,改 stepper_x 或 stepper_y 的方向設定,Y 方向相反,把 stepper_x 和 stepper_y 的接線互換。

網誌存檔