玩转创想三维 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 以及源码进行修改才能使用。