在網路上有人出清二手的 Orange Pi Zero,雖然是十多年前的產品,但拿來當 Klipper 的上位機還蠻適合的。
Orange Pi Zero 和 Orange Pi One 類似,但有 wifi,不用再另外花錢買 wifi 裝置。另外,只有一個 DRAM 晶片,因此記憶體最大只有 512MB,預設是 256MB。使用 H2+ CPU,是 H3 CPU 的閹割版,但對 klipper 的運作影響不大。
賣家出貨,512MB 和 256MB,隨機出貨,256MB 的板子比較多。
Pi Zero 與 Pi One 的差異
Orange Pi One 發表於 2016年 1月,CPU 為 H3,2個記憶體晶片,標準 512MB,最多可以升級至 1GB。Pi Zero 則發表於 2016年 12月,CPU 為 H2+,H2+ 為 H3 的降級版,1個記憶體晶片,標準 256MB,最多可以升級至 512MB。
Armbian/build 建立的 Pi Zero 的 image,在使用時有一些問題,如 reboot 會卡在 "Restarting system"。後來無意中,發現使用 Pi One 的 image 也可以開機,且 reboot 可正常開機。看電路圖,Pi One 和 Pi Zero 很類似,可能這樣才能用 Pi One 的 image 來啟動 Pi Zero 吧。
另外,無法正常驅動 SPI 的 LCD,使用 Pi One 的則可以。
後來把 config/boards/orangepizero.csc 參照 orangepione.conf 修改,把沒用到的也刪掉。
# Allwinner H2+ quad core 256/512MB RAM SoC WiFi SPI
BOARD_NAME="Orange Pi Zero"
BOARDFAMILY="sun8i"
BOARD_MAINTAINER=""
BOOTCONFIG="orangepi_zero_defconfig"
#MODULES_CURRENT="g_serial"
MODULES_BLACKLIST="sunxi_cedrus"
# DEFAULT_OVERLAYS="usbhost2 usbhost3 tve"
# DEFAULT_CONSOLE="both"
# HAS_VIDEO_OUTPUT="yes"
# SERIALCON="ttyS0,ttyGS0"
KERNEL_TARGET="legacy,current,edge"
KERNEL_TEST_TARGET="current"
# CRUSTCONFIG="orangepi_zero_defconfig"
執行建立 image 的指令。
./compile.sh \BOARD=orangepizero MAKE_THREADS=8 \
BRANCH=edge RELEASE=noble \
BUILD_MINIMAL=yes BUILD_DESKTOP=no \
NETWORKING_STACK="network-manager" \
KERNEL_CONFIGURE=no
後記,關於無法 reboot
將解決辦法反應在 git 上,維護者把 APM (advanced powered management,aka CRUST firmware) 拿掉了。但下載的 image 仍是舊的,使用者可在安裝更新後,使用 armbian-install 更新 u-boot。
連接 SPI 界面 LCD
Pi Zero 的界面接腳如下。
先用 gpioinfo 確認已使用的 pin。"r_pio 0 10" 為 PL10,是控制核心用的。
--------------
gpiochip0 - 224 lines:
line 17: PA17 "orangepi:red:status" output active-high [used]
line 20: PA20 "reg-vcc-wifi" output active-high [used]
line 166: PF06 "cd" input active-low [used]
line 204: PG12 "usb0_id_det" input active-high [used]
gpiochip1 - 32 lines:
line 6: PL06 "vdd-cpux" output active-high [used]
line 7: PL07 "reset" output active-low [used]
line 10: PL10 "orangepi:green:pwr" output active-high [used]
觸控屏
--------------
OPi Zero wiring:
Pin 23 - PA14 <--> SPI1 SCK & T_CLK
Pin 21 - PA16 <--> SPI1 SDO<MISO> & T_DO * LCD 的 MISO 不要接
Pin 19 - PA15 <--> SPI1 SDI<MOSI> & T_DIN
Pin 15 - PA3 <--> DC
Pin 13 - PA0 <--> RESET
Pin 26 - PA10 <--> LED
Pin 22 - PA2 <--> LCD CS
Pin 05 - PA11 <--> T_CS
Pin 03 - PA12 <--> T_IRQ
Pin 01 - 3.3V (or Pin 4 - 5V)
Pin 06 - GND
--------------
* LCD 的 MISO 不用接,接了可能使得觸控失效。
使用 evtest 測試觸控功能。
要把 /boot/armbianEnv.txt 的 tve (Composite TV Encoder) 的 overlay 取消掉,console 才會輸出到 LCD。
使用 panel-mipi-dbi-spi 的驅動,會載入 /usr/lib/firmware 目錄下的 panel-mipi-dbi-spi.bin。這樣對應不同驅動的 LCD,只要更換 panel-mipi-dbi-spi.bin 就好。因為檔名是固定的,為了區分使用那種驅動,以連結來建立該檔案。
---------
sudo mkdir /usr/lib/firmware/panel-mipi
sudo mv st7796s.bin /usr/lib/firmware/panel-mipi
sudo ln -sf /usr/lib/firmware/panel-mipi/st7796s.bin /usr/lib/firmware/panel-mipi-dbi-spi.bin
---------
和 MKS Pi 或 Fly Pi 比起來,使用 Orange Pi,麻煩的地方是要自己想辦法整合 LCD。後來自己用 FPC轉接板做,成品如圖,雖然不好看,還算堪用。
ZSWAP 設定
記憶體 256MB,實在太少了,要使用實體的 SD 卡當 SWAP 才行。
在完成第一次啟動後,使用 gparted 修改分割區,留多一點空間給 swap。然後用 blkid 取得 swap 的 uuid,在 /etc/fstab 中加入 swap 設定。
UUID=f454716c-ed0b-4d43-bff5-93545b4ef388 none swap sw 0 0
修改 /etc/default/armbian-zram-config,將 SWAP=false 的註解取消,然後重啟系統即可。
後來自己練習 BGA 焊接,把記憶體改成 1GB,就不用擔心 temp 空間不夠的問題了。
安裝 klipper
複製 kiauh 專案
$ git clone https://github.com/dw-0/kiauh
再執行 kiauh/kiauh.sh 安裝 klipper。
另外,由於記憶體較小,導致 tmpfs 的 /tmp 不足,在安裝 Moonraker 的階段,會耗盡 /tmp 的空間。因此需另建一個暫時的 tmp,步驟如下。
$ # Create a temp folder on a disk that has a lot of space:
sudo mkdir -p /bigtmp
# Set generous access to the temp folder:
sudo chmod 777 /bigtmp
# Change TMPDIR env to the big folder you just created:
export TMPDIR=/bigtmp
# install package
在安裝 Moonraker 時,改成用此暫時的 tmp。安裝其他的套件,則用 tmpfs,會比較快。另外,安裝 Moonraker 時,要在 putty 的 console 上執行。要是透過 ssh 安裝,會時間太久沒反應,裝到一半被踢出連線。
Disable networkd and purge netplan
設定好 NetworkManager 後,若沒有停掉 netplan 和 systemd-networkd,開機會要等 3分鐘才完成。
作法如下。
$
sudo systemctl disable --now systemd-networkd.service systemd-networkd.socket systemd-networkd-wait-online.service
$ sudo systemctl restart NetworkManager
$ sudo systemctl mask systemd-networkd-wait-online.service
$ sudo apt purge netplan netplan.io -y
回傳訊息如下,不知會有何問題。
-------
Removed "/etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service".
Removed "/etc/systemd/system/multi-user.target.wants/systemd-networkd.service".
Removed "/etc/systemd/system/dbus-org.freedesktop.network1.service".
Removed "/etc/systemd/system/sockets.target.wants/systemd-networkd.socket".
Removed "/etc/systemd/system/sysinit.target.wants/systemd-network-generator.service".
Disabling 'systemd-networkd.service', but its triggering units are still active:
systemd-networkd.socket
--------修改 /etc/netplan/armbian.yaml,如下。
network:
version: 2
renderer: NetworkManager
可以使用 systemd-analyze 產生時間圖,看看開機卡在那裡
$
systemd-analyze plot > systemd-analyze.svg
由圖檔知道,一開始,kenerl 載入花了 5秒,systemd 程式載入用了 2秒,之後才開始啟動各種服務。
Unexpected error: Scanning not allowed while unavailable