玩转创想三维 K1 系列主板之二:编译 MCU 固件,恢复裁剪组件

前言

原创文章,转载引用请务必注明链接,水平有限,如有疏漏,欢迎交流指正。

文章如有更新请访问 DFRobot 社区cnblogs 博客园,前者内容较全,后者排版及阅读体验更佳。

本文是摸索创想三维 K1 系列软硬件系统的一些内容分享。最近创想三维的工作人员联系了我,希望接下来能加快网卡直连方案的进度。

我的外挂上位机方案之一是直接让外挂上位机通过 RS232 通讯接口连接 Nozzle_MCU (以下简称 Nmcu) 和 Levelling MCU (以下简称 Lmcu)。一般使用 USB 转 RS232 模块,当然最简便的方案是使用板载支持 RS232 通讯的 Arm 开发板,还真让我找到了(当然还有调整设备树启用此功能的问题,此处按下不表),然而这块开发板的稳定通讯波特率不超过 200k,而 K1 默认使用 230400,所以我们需要重新烧录 Nmcu 和 Lmcu 的固件,通讯波特率调整为标准的 115200,同时由于这两者通讯数据量不大,115200 理论上满足我们的需求。

我们约定,直接控制打印机硬件的部分称为主板,运行 Linux 系统的部分称为上位机。

image-20240514111454676

软硬件测试环境:

  1. K1Max Mainboard with CrealityOS
  2. RK3399 Develoboard with Ubuntu 22.04

本文涉及的内容:

  1. 如何为打印机主板编译固件
  2. 如何解决编译过程中遇到的问题
  3. 如何补齐裁剪掉的 Klipper 功能

1、Klipper for K1 相关资料

创想三维系列的修改版 Klipper(以下简称 CK)做了大量改动,但是由于并不是 fork 原版 Klipper,而是直接新建仓库,导致我们无法直观看到改动记录。好在第三方 commit 可以看到:

2、编译自定义 MCU 固件

我们先看一下三块微控制器参数:

  1. mcu0:主控制器,控制 XYZ 步进电机、风扇等,GD32F303RET6
  2. Nozzle_mcu:热端工具板,GD32F303CBT6
  3. Leveling_mcu:热床下的调平工具板,GD32E230F8P6

在此之前我们看下 CK 相关固件编译说明:

  • 预编译固件:fw/K1
  • 编译选项及烧录选项:src/gd32/Makefile
    • 其中提到的通过调用 flash_usb 烧录不成功,应该是没有注释掉此内容
    • 其中有 # at32f40x build rules 字样,推测 GD32 的编译选项部分参考了 at32f40x,参考:maphex/klipper
  • 主板编译预配置编译选项: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

image-20240514122254968

由于社区版默认没有 GD32 的预设(虽然理论上 STM32 也能用)。这里我们选择 CK 代码进行编译。使用预配置文件:K1_mcu0_120_G32_defconfig。

image-20240514122131755

## 克隆 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

image-20240514122634286

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 编译工具链方法相同):

  1. https://pkgs.org/ 搜索 gcc-arm-none-eabi
  2. 找到 https://ubuntu.pkgs.org/20.04/ubuntu-universe-amd64/gcc-arm-none-eabi_9-2019-q4-0ubuntu1_amd64.deb.html
  3. 找到 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 以及源码进行修改才能使用。

posted @ 2024-05-14 13:14  思兼  阅读(44)  评论(0编辑  收藏  举报