到手的A33板子里是一个上古时期的Uboot,我们移植一下主线的UBoot
(emmc启动纯粹是手上没有SD卡了)
配置参考:
烧录环节 首先进入FEL模式烧写uboot
1 ❯ sudo sunxi-fel uboot ./u-boot-sunxi-with-spl.bin
进入fel方法:(这个最好用)
按住vol + 键不松手,随后按reset,连续短按5-10次power键后有一个灯闪烁一下,此时松开vol+键即可进入
烧录完成后发现停在 Trying to boot from FEL
首先肯定是烧录是成功的,首先怀疑串口问题,现在使用的是uart0
打开./arch/arm/dts/sun8i-a33-sinlinx-sina33.dtb 这个文件可以看到
uart0:
1 2 3 4 5 6 7 aliases { serial0 = &uart0; }; chosen { stdout-path = "serial0:115200n8"; };
对应节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // ./arch/arm/dts/sun8i-a33-sinlinx-sina33.dts &uart0 { pinctrl-names = "default"; pinctrl-0 = <&uart0_pb_pins>; status = "okay"; }; //./arch/arm/dts/sun8i-a33.dtsi &pio { compatible = "allwinner,sun8i-a33-pinctrl"; interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>; uart0_pb_pins: uart0-pb-pins { pins = "PB0", "PB1"; function = "uart0"; }; };
查看原理图发现
1 2 3 4 5 6 7 uart0: TX -> PF2 RX -> PF4 uart2: TX -> PB0 RX -> PB1
但是 uart0的引脚mmc0在使用,反正串口有一个打印的先够用了,所以添加改使用为uart2
1 2 3 4 5 6 7 mmc0_pins: mmc0-pins { pins = "PF0", "PF1", "PF2", "PF3", "PF4", "PF5"; function = "mmc0"; drive-strength = <30>; bias-pull-up; };
修改设备树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 // ./arch/arm/dts/sun8i-a33-sinlinx-sina33.dts aliases { serial2 = &uart2; }; chosen { stdout-path = "serial2:115200n8"; }; &uart0 { pinctrl-names = "default"; pinctrl-0 = <&uart0_pb_pins>; status = "disable"; }; +&uart2 { + pinctrl-names = "default"; + pinctrl-0 = <&uart2_pb_pins>; + status = "okay"; +}; //./arch/arm/dts/sun8i-a33.dtsi &pio { compatible = "allwinner,sun8i-a33-pinctrl"; interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>; uart0_pb_pins: uart0-pb-pins { pins = "PF2", "PF4"; function = "uart0"; }; uart2_pb_pins: uart0-pb-pins { pins = "PB0", "PB1"; function = "uart2"; }; };
编译
1 ❯ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
烧录
1 ❯ sudo sunxi-fel uboot ./u-boot-sunxi-with-spl.bin
这次会发现又不打印了
1 2 3 4 U-Boot SPL 2025.10-rc5-00043-g072264c4b340-dirty (Mar 18 2026 - 20:07:46 +0800) DRAM: 512 MiB Trying to boot from FEL
因为我们在硬件上将使用了uart2,但是uboot的输出控制台还是uart0
所以我们强制把控制台改为uart2
1 2 3 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig 进入 Console ---> 找到 Console index,将0改为3(UART0=1, UART1=2, UART2=3)
编译烧录
SPL引导uboot成功打印
1 2 3 4 5 6 7 8 9 10 U-Boot 2025.10-rc5-00043-g072264c4b340-dirty (Mar 17 2026 - 18:52:53 +0800) Allwinner Technology CPU: Allwinner A33 (SUN8I 1667) Model: Sinlinx SinA33 DRAM: 512 MiB Core: 66 devices, 22 uclasses, devicetree: separate WDT: Not starting watchdog@1c20ca0 MMC: mmc@1c0f000: 0, mmc@1c11000: 1 Loading Environment from FAT... Unable to use mmc 1:1... Setting up a 1024x600 lcd console (overscan 0x0)
小插曲 第一次在使用此命令的时候
1 ❯ sudo sunxi-fel uboot ./u-boot-sunxi-with-spl.bin
发现总是
1 usb_bulk_send() ERROR -7: Operation timed out
刚开始以为是线缆的问题,跟换之后无果,经查询发现是版本问题
将版本回退到1.4.1-1即可
eMMC 接下来就是将uboot存入emmc了
进入uboot命令行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 => mmc list mmc@1c0f000: 0 mmc@1c11000: 1 => mmc dev 1 switch to partitions #0, OK mmc1(part 0) is current device => mmc info Device: mmc@1c11000 Manufacturer ID: 11 OEM: 0 Name: 004G60 Bus Speed: 52000000 Mode: MMC High Speed (52MHz) Rd Block Len: 512 MMC version 5.0 High Capacity: Yes Capacity: 3.7 GiB Bus Width: 8-bit Erase Group Size: 512 KiB HC WP Group Size: 4 MiB User Capacity: 3.7 GiB WRREL Boot Capacity: 2 MiB ENH RPMB Capacity: 512 KiB ENH Boot area 0 is not write protected Boot area 1 is not write protected
确定mmc 1就是emmc
用 U-Boot 的 UMS 把 eMMC 暴露给 Ubuntu,当成一个 U 盘来写(默认config是没有开启的,打开CMD_USB_MASS_STORAGE=y
重新编译即可)
1 2 3 => ums 0 mmc 1 UMS: LUN 0, dev mmc 1, hwpart 0, sector 0x0, count 0x760000 -musb-hdrc: peripheral reset irq lost!
0 = USB 控制器 0
mmc 1 = 把 eMMC 共享出去
在PC查看会出现一个新设备
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ❯ lsblk ─╯ NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 4K 1 loop /snap/bare/5 loop1 7:1 0 63.8M 1 loop /snap/core20/2682 loop2 7:2 0 346.3M 1 loop /snap/gnome-3-38-2004/119 loop3 7:3 0 516.2M 1 loop /snap/gnome-42-2204/226 loop4 7:4 0 531.4M 1 loop /snap/gnome-42-2204/247 loop5 7:5 0 91.7M 1 loop /snap/gtk-common-themes/1535 loop6 7:6 0 50.9M 1 loop /snap/snapd/25577 loop7 7:7 0 349.7M 1 loop /snap/gnome-3-38-2004/143 loop8 7:8 0 74M 1 loop /snap/core22/2216 loop9 7:9 0 12.2M 1 loop /snap/snap-store/1216 loop10 7:10 0 46M 1 loop /snap/snap-store/638 loop11 7:11 0 48.1M 1 loop /snap/snapd/25935 loop12 7:12 0 63.8M 1 loop /snap/core20/2686 loop13 7:13 0 74M 1 loop /snap/core22/2292 sda 8:0 1 3.7G 0 disk ├─sda1 8:1 1 2.3G 0 part /media/hailin/57f8f4bc-abf4-655f-bf67-946fc0f9f25b ├─sda2 8:2 1 32M 0 part /media/hailin/Volumn ├─sda3 8:3 1 1K 0 part ├─sda5 8:5 1 16M 0 part ├─sda6 8:6 1 16M 0 part ├─sda7 8:7 1 768M 0 part /media/hailin/57f8f4bc-abf4-655f-bf67-946fc0f9f25b1 ├─sda8 8:8 1 16M 0 part ├─sda9 8:9 1 32M 0 part ├─sda10 8:10 1 512M 0 part /media/hailin/57f8f4bc-abf4-655f-bf67-946fc0f9f25b2 ├─sda11 8:11 1 16M 0 part └─sda12 8:12 1 16M 0 part nvme0n1 259:0 0 477G 0 disk ├─nvme0n1p1 259:1 0 512M 0 part /boot/efi └─nvme0n1p2 259:2 0 476.4G 0 part /
eMMC通过UMS映射成了sda
把ubuntu自动挂载的分区卸载掉
1 2 sudo umount /dev/sda1 /dev/sda2 /dev/sda7 /dev/sda10 2>/dev/null sync
确认没有挂载点了
写入
1 2 sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sda bs=1024 seek=8 sync
回到开发板端,ctrl+c强制结束
重新上电后发现停在
1 2 3 4 5 6 => hello sysself 5000 500 hello sysself 5000 500 hello sysself 5000 500
其实emmc还隐藏着两个极其底层的硬件级分区,专门用来存放引导代码
1 2 3 Boot Partition 1 (boot0) Boot Partition 2 (boot1)
当年生产这块板子的原厂,在 boot0 分区里烧录了一段用来做产线硬件检测的裸机测试程序(就是这个一直打印 sysself 的玩意)。 而全志的芯片有个死规矩:只要 boot0 分区里有合法的启动代码,它就绝对不会去读主空间(/dev/sda)里的数据!
重新进入FEL -> UBoot
将这两个分区强行擦除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # 1. 将操作焦点切换到 eMMC (1) 的隐藏 boot0 分区 (1) mmc dev 1 1 # 2. 从第 0 块开始,向后擦除 256 个区块 mmc erase 0 100 # 3. 将操作焦点切换到 eMMC 的隐藏 boot1 分区 (2) mmc dev 1 2 # 4. 同样擦除它 mmc erase 0 100 # 5. 最核心的一步:修改 eMMC 寄存器,强制它以后只从主空间 (User Area) 启动 # 参数含义:设备1, 不需ACK(0), 从主空间启动(0), 取消特殊访问(0) mmc partconf 1 0 0 0 # 6. 切回主空间 mmc dev 1 0
复位 启动 成功进入UBoot 不需要一直使用FEL了