2026年6月26日 星期五

PCAN-USB(CAN bus)連接 EBB42 工具板

鹿小班 的 USB TO CAN通信模块 (PCAN),是淘寶能買到最便宜的 U2C 轉換器,一個約台幣 70元。MCU 是 極海 (Geehy) 出的 APM32F072CBT6,出廠時,韌體刷 PEAK System PCAN-USB。APM32F072CBT6 相容於 STM32F072CBT6,因此這個裝置可以刷 candleLight 1.0。

另外有賣 USB转CAN调试器 Cananle 2.0,價格約 2倍,使用的 MCU 是 STM32G431CBU6。

安裝 can-utils,方便觀察 CAN bus 的資料傳送。

-----------
$ sudo apt-get update
$ sudo apt-get install can-utils -y
-----------

連接測試 - PCAN-USB(CAN bus)連 EBB42 工具板

先前用燒壞的 EBB42 工具板 改的 CAN bridge 來連 EBB42 工具板,Klipper 已可順利運作。測試看換成這個 PEAK System PCAN-USB 能不能用。

使用 ip 指令,開啟 can0 UP,先前已按 Klipper 文件,將 qlen 設成 128。

------------------
$ ip -details link show can0
3: can0: <NOARP,ECHO> mtu 16 qdisc noop state DOWN mode DEFAULT group default qlen 128
    link/can  promiscuity 0  allmulti 0 minmtu 16 maxmtu 16 
    can state STOPPED (berr-counter tx 0 rx 0) restart-ms 0 
  pcan_usb: tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..64 brp_inc 1
  clock 8000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 tso_max_size 65536 tso_max_segs 65535 gro_max_size 65536 parentbus usb parentdev 5-1:1.0 

# 手動改變設定,可以成功完成列印
$ sudo ip link set can0 up type can bitrate 1000000

$ ip -details link show can0
3: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 128
    link/can  promiscuity 0  allmulti 0 minmtu 16 maxmtu 16 
    can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0 
  bitrate 1000000 sample-point 0.750
  tq 125 prop-seg 2 phase-seg1 3 phase-seg2 2 sjw 1 brp 1
  pcan_usb: tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..64 brp_inc 1
  clock 8000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 tso_max_size 65536 tso_max_segs 65535 gro_max_size 65536 parentbus usb parentdev 5-1:1.0 
--------------

要設定 printer.cfg 前,必須先查 EBB42 工具板的 UUID。

-----------------
$ ~/klippy-env/bin/python ~/klipper/scripts/canbus_query.py can0
Found canbus_uuid=82360ff863a5, Application: Klipper
Total 1 uuids found

$ ~/klippy-env/bin/python ~/katapult/scripts/flash_can.py -i can0 -q
Resetting all bootloader node IDs...
Checking for Katapult nodes...
Detected UUID: 82360ff863a5, Application: Klipper
CANBus UUID Query Complete

# 同時用 candump 觀察 CAN bus 的資料
$ candump -t d can0
(000.000000) can0 3F1 [8] 20 82 36 0F F8 63 A5 01
(000.000015) can0 3F0 [1] 00
------------------

很重要的一點,上述查詢 UUID 的步驟,必須在 EBB42 停止運作下才查得到。假如 printer.cfg 已設定好,klipper service 啟動後,連上 EBB42,此時即使關閉 klipper service,也無法查詢到 UUID。因為 CAN bus 在拓樸上,是 multi-master system,EBB42 設定啟動後,就會持續送出資料。

因此,必須先把 klipper  service disable 掉,重新開機,再執行 canbus_query.py,才能查到結果。

另外,也可以用 katapult/scripts/flash_can.py 來查詢。

candump 內容分析

執行上述查詢,candump 跳出了兩筆關鍵資料,逐行拆解如下。

第一筆封包:

--------
  can0  3F1   [8]  20 82 36 0F F8 63 A5 01
----------

  • 3F1 (CAN ID):這是 EBB42 收到點名後,回覆給系統的專屬預設 ID。
  • [8]:代表後面帶有 8 個位元組(Bytes)的資料。
  • 20 82 36 0F F8 63 A5 01 (資料內容):
    • 第一個 Byte 20:這在 Klipper 的自訂協定中通常是命令或狀態字頭(Header)。
    • 接下來的 6 個 Bytes 82 36 0F F8 63 A5:工具板的 UUID(82360ff863a5)。
  • 最後一個 Byte 01:這個代碼代表的是 Application 的狀態。在 Klipper 的通訊定義中,01 代表目前運行的程式是 Klipper(如果是 00 則代表處於 Katapult 引導模式)。

第二筆封包:

----------
  can0  3F0   [1]  00
-----------

  • 3F0 (CAN ID):這是主控端(PCAN-USB/你的系統)發送出去的「點名廣播訊號」。
  • [1] 00:代表這是一個長度為 1 內容為 00 的請求封包,意思是向總線上所有 Klipper 設備高喊:「請報告你們的身份與狀態!」

上面的內容,應是 host 先送出查詢封包,即第二筆封包的內容。然後 EBB42 回傳狀態資料,即第一筆封包的內容。但因為 candump 的處理機制,兩筆資料倒過來印出。問了 Gemini,做了一堆推測,看不懂,算了。

使用 PCAN,雖然可以運作,但行為怪異。設好 udev rule,照理說,重開機後,應該會正常運作。但都無法連上工具板,必須把 U2C 轉換器拔掉重插,才能正常運作。因此決定重刷 candleLight_fw 看看。

重刷 candleLight_fw

這個裝置使用 APM32F072CBT6,相容於 STM32F072CBT6,因此可以刷 candleLight 1.0。狀態 LED 的接腳一樣是 PA00 和 PA01。下載位置如下
https://github.com/candle-usb/candleLight_fw/tree/v1.0/bin

燒錄步驟如下。

在未插上 USB 接頭時,先把 BOOT 和 3.3V 短路,再插上 USB 接頭,此時 MCU 會進入 DFU 模式,可以燒錄 firmware。

-----------
$ sudo dfu-util -l
[sudo] password for klipper: 
dfu-util 0.11

....

Found DFU: [314b:0106] ver=0011, devnum=2, cfg=1, intf=0, path="4-1", alt=1, name="@Option Bytes  /0x1FFFF800/01*016 e", serial="0448"
Found DFU: [314b:0106] ver=0011, devnum=2, cfg=1, intf=0, path="4-1", alt=0, name="@Internal Flash  /0x8000000/06*002Kg,058*002Kg", serial="0448"


$ sudo dfu-util -R -a 0 -s 0x08000000:leave -D gsusb_candleLight-v1.0.bin
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 314b:0106
Device DFU version 011a
Claiming USB DFU Interface...
Setting Alternate Interface #0 ...
Determining device status...
DFU state(2) = dfuIDLE, status(0) = No error condition is present
DFU mode device DFU version 011a
Device returned transfer size 2048
DfuSe interface name: "Internal Flash  "
Downloading element to address = 0x08000000, size = 14728
Erase    [=========================] 100%        14728 bytes
Erase    done.
Download [=========================] 100%        14728 bytes
Download done.
File downloaded successfully
Submitting leave request...
Transitioning to dfuMANIFEST state
dfu-util: can't detach
Resetting USB to switch back to Run-Time mode
------------

重刷後,整個運作正常。機器關機後,即可順利連線。



2026年6月14日 星期日

在 Oranage Pi Zero 3 的 Armbian 上,編譯 panel-mipi-dbi

 

在 boot 目錄下,查看 kernel 的設定,沒有將 panel_mipi_dbi 編進 kernel。

---------------
boot$ grep -i mipi config-6.18.33-current-sunxi64
# CONFIG_MIPI_I3C_HCI is not set
CONFIG_VIDEO_SUN6I_MIPI_CSI2=m
CONFIG_VIDEO_SUN8I_A83T_MIPI_CSI2=m
# CONFIG_VIDEO_GC2145_MIPI is not set
CONFIG_VIDEO_ST_MIPID02=m
CONFIG_DRM_MIPI_DBI=m
CONFIG_DRM_MIPI_DSI=y
CONFIG_DRM_NWL_MIPI_DSI=m
# CONFIG_DRM_PANEL_MIPI_DBI is not set
CONFIG_GENERIC_PHY_MIPI_DPHY=y
CONFIG_PHY_SUN6I_MIPI_DPHY=y
---------------

透過 Gemini 指導,自行編譯 out-of-tree module。

首先,使用 armbian-config 安裝當前核心版本的 headers,然後編譯所需的 module。

------------
cd ~
# 下載 Linux 6.18 核心原始碼(僅下載單一分支以節省時間與空間)
git clone --depth 1 -b linux-6.18.y https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

# 進入 DRM 面板驅動的目錄
cd ~/linux/drivers/gpu/drm/tiny


# 建立存放驅動的目錄
sudo mkdir -p /lib/modules/$(uname -r)/kernel/drivers/gpu/drm/tiny/

# 複製驅動檔案
sudo cp panel-mipi-dbi.ko /lib/modules/$(uname -r)/kernel/drivers/gpu/drm/tiny

# 更新系統的核心模組相依性 
sudo depmod -a


# 測試載入
sudo modprobe panel-mipi-dbi
lsmod | grep panel_mipi_dbi
------------







網誌存檔