玩轉創想三維 K1 系列主板之二:編譯 MCU 固件,恢復裁剪組件
前言
原創文章,轉載引用請務必注明鏈接,水平有限,如有疏漏,歡迎交流指正。
文章如有更新請訪問 DFRobot 社區 及 cnblogs 博客園,前者內容較全,后者排版及閱讀體驗更佳。
本文是摸索創想三維 K1 系列軟硬件系統的一些內容分享。最近創想三維的工作人員聯系了我,希望接下來能加快網卡直連方案的進度。
我的外掛上位機方案之一是直接讓外掛上位機通過 RS232 通訊接口連接 Nozzle_MCU (以下簡稱 Nmcu) 和 Levelling MCU (以下簡稱 Lmcu)。一般使用 USB 轉 RS232 模塊,當然最簡便的方案是使用板載支持 RS232 通訊的 Arm 開發板,還真讓我找到了(當然還有調整設備樹啟用此功能的問題,此處按下不表),然而這塊開發板的穩定通訊波特率不超過 200k,而 K1 默認使用 230400,所以我們需要重新燒錄 Nmcu 和 Lmcu 的固件,通訊波特率調整為標準的 115200,同時由于這兩者通訊數據量不大,115200 理論上滿足我們的需求。
我們約定,直接控制打印機硬件的部分稱為主板,運行 Linux 系統的部分稱為上位機。

軟硬件測試環境:
- K1Max Mainboard with CrealityOS
- RK3399 Develoboard with Ubuntu 22.04
本文涉及的內容:
- 如何為打印機主板編譯固件
- 如何解決編譯過程中遇到的問題
- 如何補齊裁剪掉的 Klipper 功能
1、Klipper for K1 相關資料
創想三維系列的修改版 Klipper(以下簡稱 CK)做了大量改動,但是由于并不是 fork 原版 Klipper,而是直接新建倉庫,導致我們無法直觀看到改動記錄。好在第三方 commit 可以看到:
-
Creality Klipper 的官方倉庫(最新改動):CrealityOfficial/K1_Series_Klipper,同時此倉庫一些 PR、Issuse 值得關注。
-
Creality Klipper 的主要改動:Add K1 specific files
-
Creality Klipper 相當于基于此官方 Commit,之后的特性不支持,如果想要添加精簡的組件,也以此版為準。exclude_object: Don't use gcmd.respond_error() (#6407https://github.com/Klipper3d/klipper/pull/6407)
-
社區維護版 K1-Klipper,目標是更新追蹤官方 Klipper 進度,主要是 sbtoonz 和 P-C-R 在更新,本月初(2024年5月1日)進入歸檔狀態,可能累覺不愛了吧。我們暫時使用此倉庫。
Creality shipped klipper that had not been updated since 2022. As such it was missing many patches and new features that had been added to the main repository. This will install the updated klipper for K1 found at https://github.com/K1-Klipper/klipper This is a community based effort to keep klipper up to date for the K1/Max
-
cryoz/klipper | 使用 Useful Forks 找到的一個繼續更新的 K1-Klipper,持續關注。
2、編譯自定義 MCU 固件
我們先看一下三塊微控制器參數:
- mcu0:主控制器,控制 XYZ 步進電機、風扇等,GD32F303RET6
- Nozzle_mcu:熱端工具板,GD32F303CBT6
- Leveling_mcu:熱床下的調平工具板,GD32E230F8P6
在此之前我們看下 CK 相關固件編譯說明:
- 預編譯固件:fw/K1
- 編譯選項及燒錄選項:src/gd32/Makefile
- 主板編譯預配置編譯選項:src/configs/
- K1_mcu0_110_G32_defconfig
- K1_mcu0_110_S40_defconfig | STM32F40x
- K1_mcu0_120_G32_defconfig
- K1_noz0_110_S06_defconfig
- K1_noz0_110_G30_defconfig
- K1_noz0_120_G30_defconfig
- K1_bed0_100_G21_defconfig
- K1_bed0_110_G21_defconfig
- Kconfig
2.1 示例:編譯 mcu0 主板固件
由于 CrealityOS 和 K1 系列主板為 MIPS 架構的 CPU,不支持 Arm Cortex 處理器的編譯工具鏈,我們只能選擇在 外掛上位機(x86_64或arm)上安裝 gcc-arm-none-eabi 工具包。所以 CrealityOS 中沒有 src 目錄,不能安裝編譯工具鏈也無法編譯 Klipper 固件。
通過之前的 mcu_util 得知 mcu0 軟硬件版本號為:mcu0_120_G32-mcu0_004_000

由于社區版默認沒有 GD32 的預設(雖然理論上 STM32 也能用)。這里我們選擇 CK 代碼進行編譯。使用預配置文件:K1_mcu0_120_G32_defconfig。

## 克隆 CK 項目倉庫
cd && git clone https://github.com/CrealityOfficial~/K1_Series_Klipper && cd ~/K1_Series_Klipper
## 復制預配置編譯選項文件
cp src/configs/K1_mcu0_120_G32_defconfig .config
## 降級 gcc-arm-none-eabi 軟件源到版本 10 以下以正確編譯 prtouch_v2.o (壓力調平),本文使用 Ubuntu 22.04
sudo tee /etc/apt/sources.list.d/gcc-arm-none-eabi-focal.list << _EOF_
deb https://mirrors.ustc.edu.cn/ubuntu-ports/ focal main universe #multiverse restricted
_EOF_
sudo tee /etc/apt/preferences.d/gcc-arm-none-eabi-focal << _EOF_
Package: gcc-arm-none-eabi binutils-arm-none-eabi libc6 libgcc-s1 libgmp10 libisl22 libmpc3 libmpfr6 libstdc++6 zlib1g
Pin: release n=focal
Pin-Priority: 1001
_EOF_
## 降級 gcc-arm-none-eabi 和 binutils-arm-none-eabi,并確認 arm-none-eabi-gcc 版本
sudo apt update
# apt-cache policy gcc-arm-none-eabi
# apt-cache show gcc-arm-none-eabi
sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi # 降級工具鏈 9+2.34
arm-none-eabi-gcc --version
# 添加額外的軟件包支持固件 crc 檢校
sudo apt install srecord
# 調整波特率為 115200,編譯 mcu0 固件
make menuconfig
make
# 使用 mcu_util 更新固件
# 修改 printer.cfg 內的 [mcu] buad 為 115200 并保存
# 測試新版固件正確啟動并生效
/usr/share/klippy-env/bin/python /usr/share/klipper/klippy/klippy.py /usr/data/printer_data/config/printer.cfg

2.2 報錯信息及解決:
報錯 1:lto1: fatal error: bytecode stream in file 'out/src/prtouch_v2.o' generated with GCC compiler older than 10.0
原因:需要使用舊版 GCC 編譯 prtouch_v2。
解決方法(和修復 Klipper AVR 編譯工具鏈方法相同):
- 從 https://pkgs.org/ 搜索 gcc-arm-none-eabi
- 找到 https://ubuntu.pkgs.org/20.04/ubuntu-universe-amd64/gcc-arm-none-eabi_9-2019-q4-0ubuntu1_amd64.deb.html
- 找到 Requires 全部添加到下述 APT Preferences 中
報錯 2:make: srec_cat: No such file or directory
原因及解決方法:相比原版 Klipper 增加了 CRC 檢校功能,需要安裝額外的軟件包:srecord
3、使用社區版 K1-Klipper 連接 K1
我們測試,沒有版本檢校,klipper官方會提醒升級固件。社區版自帶示例并不會編譯進 prtouch_v2.o ,因為此功能僅 Lmcu 需要,所以不會報錯。
#####################################################################
# 外掛上位機
#####################################################################
# 使用社區版 K1-Klipper
# 不要用 install-ubuntu22.04 腳本,service 路徑不對
# 也可以使用 kiauh 自定義 repo 方式安裝,方法如下:
# cp ~/kiauh/klipper_repos.txt.example ~/kiauh/klipper_repos.txt
# echo "K1-Klipper/klipper,master" >> ~/kiauh/klipper_repos.txt
# 刪除或重命名原版 Klipper
mv ~/klipper ~/klipper.old
# rm -rf ~/klipper
git clone https://github.com/K1-Klipper/klipper ~/klipper
# 重新編譯 c_helper.so,默認的為 MIPS 架構會報錯
rm ~/klipper/klippy/chelper/c_helper.so
cd ~/klipper/klippy/chelper/ && make
# 拷貝 K1 原廠 printer.cfg 并修改為本地串口設備號
注意:修改通訊波特率,也要修改串口轉發設置中的波特率,如 socat 或者 ser2net。
4、Bonus:Creality Klipper 添加裁剪掉的功能組件
此處適用使用 CK 而非社區版 K1-Klipper 的場景,因為后者沒有進行裁剪。
前面說過,CK 基于 exclude_object: Don't use gcmd.respond_error() (#6407) 這次提交進行修改開發(網址中可以看到長哈希為 ea2f6bc0f544132738c7f052ffcc586fa884a19a,短哈希為 ea2f6bc,后面會用到),為了保證兼容性,可以直接從此次 commit 或者臨近的 commit 扒文件拷貝到 CK 中,以舵機支持為例:
# 克隆官方 Klipper 并切換到指定 commit
git clone https://github.com/Klipper3d/klipper /usr/data/klipper-basement && cd /usr/data/klipper-basement
git checkout ea2f6bc
# 確認當前所在版本
git log
# 如果是在外掛上位機,也可以使用之前備份的 klipper.old,必要時切換回最新 commit
# 拷貝 klippy/extras/servo.py 到 CK 對應目錄即可
cp /usr/data/klipper-basement/klippy/extras/servo.py /usr/share/klipper/klippy/extras/servo.py
注意:如果想要添加新版功能,可以先嘗試直接拷貝對應組件,如果報錯可能需要結合 commit history 以及源碼進行修改才能使用。

浙公網安備 33010602011771號