到手的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
lsblk

写入

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了