<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      玩轉創想三維 K1 系列主板之一:在線更新 MCU 固件

      前言

      本文是摸索創想三維 K1 系列軟硬件系統的一些內容分享。本系列文章由于與他們的軟件工程師無溝通渠道,僅能憑經驗與黑盒測試,故有盲人摸象之可能,如有謬誤,歡迎指正交流。下一期會講如何編譯創想三維魔改版 Klipper 固件。

      由于有為 K1 系列 MCU 升級固件的需求,被告知使用私有 bootloader,具體用法不透露。好在主板上預留 SWD 調試引腳,但是對普通用戶不友好,希望有 Katapult Bootloader 那種支持無接觸線刷升級 Klipper 固件的方式就好了。后來在探索 CrealityOS 過程中,我們查看啟動服務發現一個 /etc/init.d/S13mcu_update 的自啟動服務,看名稱和升級固件有關,大喜過望,失望而歸,提供的 mcu_util 工作不符合預期(可能是我使用方法有誤,具體見下文。不過 S13mcu_update 很值得一看,邏輯思路比較完善)。

      可以在 Creality-K1-Extracted-Firmwares 處查看已解包系統鏡像。

      我們約定,直接控制打印機硬件的部分稱為主板,運行 Linux 系統的部分稱為上位機。

      運行測試環境:

      1. K1C 和 K1Max 主板(兩塊主板硬件配置有所不同)
      2. Ubuntu 22.04 Arm64
      3. CrealityOS

      本文涉及的內容:

      1. 如何使用原廠 bootloader 升級打印機主板固件
      MCU 設備地址 備注
      mcu (mcu0) /dev/ttyS7 主 MCU
      nozzle_mcu /dev/ttyS1 熱端 MCU
      leveling_mcu /dev/ttyS9 熱床調平 MCU
      rpi (host as mcu) /tmp/klipper_host_mcu 上位機作為 MCU

      1、升級主板固件(精簡版)

      需要使用 chs 進行 root,安裝 supervisorctl 用來管理服務(非必須,隨 moonraker 安裝)。

      1.1 使用第三方 mcu_util.py 工具

      此處以 mcu0 為例,由于官方提供的工具 mcu_util 握手之后會超時報錯,所以我們使用第三方工具。

      # 關閉 klipper,取消對串口設備的占用
      supervisorctl stop klipper
      
      # 部署第三方固件燒錄工具
      cd && git clone https://github.com/cryoz/k1_mcu_flasher && cd k1_mcu_flasher
      
      # 為 mcu0(/dev/ttyS7) 燒錄固件,以原廠固件為例
      # 流程:重置 mcu0 ——> 等待 2s ——> 上傳固件
      mcu_reset.sh && sleep 2 && ./mcu_util.py -c -v -i /dev/ttyS7 -u -f /usr/share/klipper/fw/K1/mcu0_120_G32-mcu0_004_000.bin
      
      # k1_mcu_flasher 用法
      usage: mcu_util.py [-h] [-v] [-c] -i PORT [-f FILE] [-u] [-s] [-g]
      Creality K1 MCU Flasher
      optional arguments:
        -h, --help            show this help message and exit
        -v, --verbose         Debug output
        -c, --handshake       Attempt handshake before operation
        -i PORT, --port PORT  serial device
        -f FILE, --file FILE  firmware file
        -u, --update          Update firmware from file
        -s, --appstart        Attempt to start fw
        -g, --version         Get version
      
      # 其他用法示例
      # 注意:握手僅需要一次,每個選項都包含握手操作,所以不需要先單獨握手在執行其他操作
      ## 與 mcu0 進行握手,并顯示詳情
      ./mcu_util.py -c -v -i /dev/ttyS7
      
      ## 與 mcu0 握手并獲取 mcu 固件版本
      ./mcu_util.py -c -v -i /dev/ttyS7 -g
      
      ## 啟動固件(如果沒有自動啟動)
      ./mcu_util.py -c -v -i /dev/ttyS7 -s
      

      1.2 同樣操作使用原廠 mcu_util 超時報錯

      偶爾可以握手成功。

      mcu_reset.sh && sleep 2 && mcu_util -c -v -i /dev/ttyS7 -u -f /usr/share/klipper/fw/K1/mcu0_120_G32-mcu0_004_000.bin
      usart_send_Process: get_sector_size
      usart_rec_Process: select time out, state = 6
      usart_rec_Process: select time out, state = 6
      usart_rec_Process: select time out, state = 6
      usart_rec_Process: timeout
      usart_sent_retval: 1, usart_rec_retval: 1
      

      再次詢問工程師此工具正確用法,無回復。

      1.3 燒錄更新其他三個 MCU

      • 熱端和調平 MCU 使用 RS232 串口與上位機通訊,沒有專門的重置方式,應該有未知的固件重啟命令,或者采用 Klipper 通用的命令進入 bl 狀態,具體見之前文章 無接觸線刷Klipper固件:千秋萬載,一統江湖之Katapult ,等待后續測試
      • 還有一種是思路是寫一個 initi.d 開機啟動服務,在 mcu 上電 15s 內完成握手
      • host_as_mcu 可以使用 klipper_mcu 服務停止

      2、K1 Bootloader 燒錄流程解析

      注:此部分屬于對 k1_mcu_flasher 的注釋,只能說作者是專業的。

      原程序 /usr/bin/mcu_util 是二進制文件(懷疑是加密的 shell 腳本)。

      mcu_util.py 代碼分析

      • 導入必要的模塊:
        • binascii 用于編碼和解碼十六進制數據。
        • io 用于讀取文件。
        • pathlib 用于處理文件路徑。
        • argparse 用于解析命令行參數。
        • sys 用于退出程序。
        • serial 用于與串行設備通信。
      • 定義 crc 函數:用于計算 CRC 校驗和。
      • 定義 debug 函數:用于打印調試信息。
      • 定義 _handshake 函數:用于與 MCU 進行握手。
      • 定義 _get_version 函數:用于獲取 MCU 的版本信息。
      • 定義 _get_sector_size 函數:用于獲取 MCU 的扇區大小。
      • 定義 _app_start 函數:用于啟動 MCU 的應用程序。
      • 定義 _flash_fw 函數:用于更新 MCU 的固件。
      • 定義 open_port 函數:用于打開指定的串行端口。
      • 定義 handshake 函數:用于執行握手操作。
      • 定義 get_version 函數:用于獲取 MCU 的版本信息。
      • 定義 app_start 函數:用于啟動 MCU 的應用程序。
      • 定義 update 函數:用于更新 MCU 的固件。
      • 解析命令行參數:使用 argparse 模塊解析命令行參數。
      • 根據命令行參數執行相應的操作:如果指定了 c-handshake 選項,則執行握手操作;如果指定了 g-version 選項,則獲取 MCU 的版本信息;如果指定了 u-update 選項,則更新 MCU 的固件;如果指定了 s-appstart 選項,則啟動 MCU 的應用程序。
      • 如果沒有指定任何操作,則打印幫助信息并退出。
      • 執行相應的操作并返回退出代碼。

      2.1 Handshake stage 握手階段

      bootloader waiting 15 secs after startup for handshake, then launch app if app corrupted by crc16 - bootloader waiting for handshake forever ALL stages requred passing handshake stage ONCE send: 0x75, receive ack: 0x75

      • bootloader (bl) 啟動后等待 15s 用于握手,之后啟動 app (klipper)。
      • 如果 app 的 crc16 檢校失敗,bl 會一直等待握手
      • 所有階段都需要握手通過 1 次且只需要一次
      • 發送 0x75,返回 0x75
      • 編者注:握手是為了在 15s 內截住 bootloader,不讓其啟動 App。mcu_util.py 的每個命令都有握手操作。

      2.2 Version stage 版本驗證階段

      bootloader checks for crc16 of app, if passed - combine hw version string (in bootloader area) and fw version string (in fw area) if crc16 not passed - sending 25 bytes of 0x00 send 00ff (ff - crc), receive string (25 bytes+crc) of combined hw version and fw version

      • bl 會檢查 app 的 crc16
        • 如果通過檢測,附加 hw 和 fw 版本字符
        • 如果未通過檢測,發送 25 字節的 0x00
      • 向 bl 發送 00ff (ff - crc),返回 (25 bytes+crc),以及 hw 和 sw 版本
      • 說的不清楚,有需求的具體看源碼
              # 解碼返回信息
              r = ser.read(26)
              if len(r) > 0:
                  debug(f'rcv data {hexlify(r)}', v)
                  if len(r) == 26 and r[25] == crc(r[:-1]):
                      debug(f'version received! {r[:-1]}', v)
                      result = bytes(r[:-1]).decode(encoding='latin')
      

      在這個代碼中,r是一個字節數組,[:-1]表示取r的前len(r)-1個元素,即去掉最后一個字節。然后,使用decode方法將字節數組轉換為字符串,并指定編碼為latin。這將把字節數組轉換為一個使用latin編碼的字符串。

      2.3 Get sector size stage 獲取扇區大小階段

      mostly = 1, multiplier for receive buffer of firmware send 03fc (fc - crc), receive sector size (1 byte+crc)

      • 多數情況為固件大小的 1 倍
      • 發送 03fc (fc - crc),返回扇區大小

      2.4 App start stage 啟動 App 階段

      bootloader check crc16 of fw in flash, if succeded - passes program flow to fw entrypoint send 02fd (fd - crc), receive ack 0x75

      • bl 檢查閃存內固件的 crc16,如果通過,進入正常 App
      • 發送 02fd (fd - crc), 返回 0x75

      2.5 Flash FW stage 固件燒錄更新階段

      receive fw by chunks, size of chunks = sector size << 16, to ram, then writes to flash.

      1. update request: send 0xfe (fe - crc), receive ack 0x75
      2. send fw size: send dword of size with leading crc, receive ack 0x75
      3. send chunks by chunk-size, receive statuses: 0x75 - chunk succeded 0x20 - all firmware flashed 0x21 - error in write ram->rom stage 0x1f - bad crc of received data
      • 分塊傳輸固件到 mcu ram 中,然后寫入 flash
      • 發送更新請求
      • 發送固件大小,會生成crc
      • 發送大小,返回狀態符(見上)

      由于創想對 Klipper 做了很多魔改,我們先使用官方的 Klipper 倉庫,默認支持 GD32F303。

      我們要為 Arm Crotex-M 編譯固件,用到 GNU Arm Embedded Toolchain,目前僅支持 AArch64/x86_64 而不支持 MIPS 架構 CPU 所以只能在其他設備上編譯固件,再進行燒錄。也由于這點,CrealityOS 的 klipper 直接精簡掉了編譯固件的源碼。

      # 下載創想三維修改版 Klipper
      git clone https://github.com/CrealityOfficial/K1_Series_Klipper && cd K1_Series_Klipper
      # 由于原來的是 MIPS 的,需要刪除 c_helper.so 重新編譯
      python
      # 由于我使用 Ubuntu 22.04,需要降級到 gcc-arm-none-eabi 10.0 以下以正確編譯 prtouch_v2
      sudo apt preference
      # 安裝缺少的軟件包
      sudo apt install 
      # 修改編譯參數
      make menuconfig
      make
      
      posted @ 2024-05-10 16:40  思兼  閱讀(665)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 精品国产肉丝袜在线拍国语| 中文字幕第一页亚洲精品| 久久综合国产一区二区三区| 久久久亚洲欧洲日产国码606| 国产精品亚洲二区在线播放| 精品九九人人做人人爱| 无码国内精品人妻少妇| 性虎精品无码AV导航| 国产精品一区二区久久精品 | 又爽又黄又无遮掩的免费视频| 变态另类视频一区二区三区| 午夜福利精品国产二区| 国产一区二区三区高清视频| 午夜精品区| 丰满人妻一区二区三区无码AV| 7m精品福利视频导航| 国产黄色av一区二区三区| 四子王旗| 超碰成人人人做人人爽 | 狠狠cao日日穞夜夜穞av| 熟女人妻aⅴ一区二区三区电影| 老熟妇仑乱一区二区视頻| 日本无产久久99精品久久| 免费国产一级特黄aa大片在线| 武城县| 亚洲国产激情一区二区三区| 国产亚洲无线码一区二区| 隔壁老王国产在线精品| 激情啪啪啪一区二区三区| 97久久人人超碰国产精品| 亚洲av综合久久成人网| 国产精品激情| 日韩有码中文字幕av| 免费无码一区无码东京热| 另类 专区 欧美 制服| 久热这里只有精品视频3| 亚洲成a人在线播放www| 四虎女优在线视频免费看| 九九热在线观看精品视频| 少妇爆乳无码专区| 成人亚洲欧美一区二区三区|