基於全志 Allwinner SoC (如 H3, H6, A64) 的電視盒子/開發板,通過主線 Linux 內核與 U-Boot 支持,可刷入原生 Debian 系統,擺脫廠商定制 Android 限制。本文以典型 H6 盒子為例,覆蓋 script.bin/.fex 配置提取修改、主線 U-Boot/內核編譯、rootfs 部署、啟動介質制作的全流程。
script.bin (舊) / board.dtb (新) — SoC 運行時配置 (GPIO、DRAM、顯示、PMIC 等)。u-boot-sunxi-with-spl.bin — SPL + U-Boot 合併二進制。Image + dtb — 內核鎮像與設備樹。rootfs.tar.gz — Debian 基礎根文件系統。sunxi-tools (bin2fex/fex2bin)、armbian-build 或手動交叉編譯環境。# 方法 A:TTL 串口進入 U-Boot 命令行 (最可靠)
# 斷電 -> 短接啟動選擇引腳 (如有) -> 上電 -> 串口輸入打斷啟動
# U-Boot> mmc dev 0; fatload mmc 0:1 0x43000000 script.bin; go 0x43000000
# 進入 Android 後:
adb shell
su
mkdir /sdcard/nanda
mount -t vfat /dev/block/nanda /sdcard/nanda
exit
adb pull /sdcard/nanda/script.bin .
# 方法 B:若已 Root,直接 adb pull
adb root
adb pull /dev/block/by-name/nanda script.bin # 部分分區可直接讀取
git clone https://github.com/linux-sunxi/sunxi-tools
cd sunxi-tools
make
./bin2fex script.bin script.fex
[dram_para] ; 內存參數 (必須與物理內存匹配,錯誤導致無法啟動)
dram_clk = 600
dram_type = 3 ; 3=DDR3, 7=LPDDR3, 8=LPDDR4
dram_rank_num = 1
dram_chip_density = 4096 ; 4Gbit = 512MB/顆粒,按總內存計算
[gpio_para] ; GPIO 分配 (按原理圖核對)
gpio_used = 1
gpio_num = 12
gpio_pin_1 = port:PL10<1><0> ; 例如 LED
...
[disp_init] ; 顯示輸出配置
disp_init_enable = 1
disp_mode = 0 ; 0=HDMI, 1=LCD, 2=TV, 3=VGA
screen0_output_type = 3 ; 3=HDMI
screen0_output_mode = 4 ; 4=1080p60, 10=4K30, 查表確認
fb0_format = 0
fb0_width = 1920
fb0_height = 1080
[hdmi_para] ; HDMI 參數
hdmi_used = 1
hdmi_power = "vcc-hdmi-18"
hdmi_cts_compatibility = 1
[rtc_para] ; RTC 時鐘
rtc_used = 1
rtc_type = 1 ; 1=內置, 2=外置 PCF8563 等
./fex2bin script.fex script.bin
# 或新版內核使用 DTB:
# 修改 linux/arch/arm64/boot/dts/allwinner/sun50i-h6-.dts
# make dtbs
git clone https://github.com/u-boot/u-boot.git -b v2024.01 --depth=1
cd u-boot
make _defconfig # 如 tanix_tx6_defconfig, beelink_gs1_defconfig
make -j$(nproc) CROSS_COMPILE=aarch64-linux-gnu-
# 輸出:u-boot-sunxi-with-spl.bin
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git -b v6.6 --depth=1
cd linux
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- _defconfig # 或 sun50i_h6_defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) Image dtbs
# 輸出:arch/arm64/boot/Image, arch/arm64/boot/dts/allwinner/sun50i-h6-.dtb
# 在 x86_64 主機 (需 qemu-user-static)
sudo apt-get install debootstrap qemu-user-static binfmt-support
sudo debootstrap --arch=arm64 --foreign bookworm /tmp/debian-rootfs https://deb.debian.org/debian
sudo cp /usr/bin/qemu-aarch64-static /tmp/debian-rootfs/usr/bin/
sudo chroot /tmp/debian-rootfs /debootstrap/debootstrap --second-stage
# 配置 apt 源、設置 root 密碼、安裝內核模塊、systemd、network-manager 等
sudo tar -czf debian-bookworm-arm64-rootfs.tar.gz -C /tmp/debian-rootfs .
# 從 Armbian 下載頁面獲取對應板卡的 focal/jammy/bookworm rootfs 壓縮包
# 解壓並根據需要精簡/擴展
| 分區 | 起始扇區 | 大小 | 類型 | 內容 |
|---|---|---|---|---|
| 1 (SPL+UBOOT) | 8192 (4MB) | 4MB | 原始 | dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8 |
| 2 (Boot) | 16384 | 128MB | FAT32 | Image, dtb, boot.scr, script.bin (可選) |
| 3 (Rootfs) | +262144 | 剩餘 | ext4 | Debian rootfs |
#!/bin/bash
# build_sd_image.sh
set -euo pipefail
IMG=debian-h6-$(date +%F).img
dd if=/dev/zero of=$IMG bs=1M count=3800 # 3.7GB 映像
# 分區
sfdisk $IMG << EOF
label: dos
unit: sectors
start=8192, size=8192, type=6
start=16384, size=262144, type=c, bootable
start=278528, type=83
EOF
# 映射回環設備
LOOP=$(losetup -f --show -P $IMG)
# 寫入 U-Boot
dd if=u-boot-sunxi-with-spl.bin of=$LOOP bs=1024 seek=8 conv=fsync
# 格式化分區
mkfs.vfat -n BOOT ${LOOP}p2
mkfs.ext4 -L ROOTFS ${LOOP}p3
# 掛載複製文件
mkdir -p /mnt/boot /mnt/root
mount ${LOOP}p2 /mnt/boot
mount ${LOOP}p3 /mnt/root
cp Image sun50i-h6-.dtb /mnt/boot/
cp script.bin /mnt/boot/ # 兼容舊版
tar -xzf debian-rootfs.tar.gz -C /mnt/root/
# 生成 boot.scr (U-Boot 啟動腳本)
cat > /mnt/boot/boot.cmd << 'EOF'
setenv bootargs console=ttyS0,115200 root=LABEL=ROOTFS rootwait panic=10
load mmc 0:1 0x40080000 Image
load mmc 0:1 0x4fa00000 sun50i-h6-.dtb
booti 0x40080000 - 0x4fa00000
EOF
mkimage -C none -A arm64 -T script -d /mnt/boot/boot.cmd /mnt/boot/boot.scr
# 同步卸載
sync
umount /mnt/boot /mnt/root
losetup -d $LOOP
echo "Image ready: $IMG"
echo "Write to SD: sudo dd if=$IMG of=/dev/sdX bs=4M status=progress conv=fsync"
ums 0 mmc 0dd if=debian-h6.img of=/dev/sdX bs=4M status=progress conv=fsync。fastboot (需設備支持) 燒錄分區映像。uname -a 確認內核版本cat /etc/os-release 確認 Debian 版本df -h / 確認根分區掛載正常ip a 確認網絡 (eth0/wlan0)apt update && apt install -y vim htop iperf3 docker.io。
| 現象 | 可能原因 | 排查方向 |
|---|---|---|
| 串口無輸出 / 停在 SPL | DRAM 參數錯誤 / U-Boot 配置不匹配 | 核對 script.fex dram_para,確認 U-Boot defconfig |
| 內核 panic: VFS: Unable to mount root fs | root= 參數錯誤 / 缺少驅動 / 分區標簽不匹配 | 檢查 boot.cmd root=LABEL=ROOTFS,確認 ext4 模塊內建 |
| HDMI 無顯示 | disp_init/hdmi_para 配置錯誤 / EDID 讀取失敗 | 修改 script.fex screen0_output_mode,嘗試 force 模式 |
| 網卡不識別 | 缺少 firmware / DTB 缺少 phy 节點 | 安裝 linux-firmware,補全 DTB gmac/phy 配置 |
script.bin → bin2fex → 修改 DRAM/顯示/GPIO → fex2bin。dd 寫入 SD 或 UMS 燒錄 eMMC。掌握此流程,您將能將任意全志盒子轉化為功能完整的 Linux 微型服務器/開發板,釋放硬件真正潛力。