Hi3519作为海思旗下高性能视频处理芯片,在安防监控、智能摄像头等领域应用广泛。在实际开发中,Uboot阶段的存储介质分区配置往往是硬件启动的第一个技术关卡。我最近在调试一块基于Hi3519的工业相机开发板时,就遇到了Emmc分区表配置不合理导致内核启动失败的问题。
这个笔记主要记录Uboot中如何正确规划Emmc分区布局,特别是:
注意:不同版本的Hi3519 SDK在分区配置上可能存在差异,本文基于Hi_3519AV100_SDK_V2.0.1.0环境验证
对于Hi3519这类嵌入式设备,Emmc通常按功能划分为以下几个关键分区:
| 分区名 | 挂载点 | 典型大小 | 文件系统 | 作用说明 |
|---|---|---|---|---|
| bootloader | - | 4MB | raw | 存放Uboot二进制文件 |
| boot | /boot | 16MB | ext4 | 内核镜像与设备树 |
| rootfs | / | 512MB | ext4 | 根文件系统 |
| appfs | /app | 256MB | ext4 | 应用程序存储 |
| userdata | /data | 剩余空间 | ext4 | 用户数据存储 |
由于Hi3519的视频处理特性,还需要特别注意:
在SDK目录中找到关键配置文件:
bash复制osdrv/opensource/uboot/u-boot-2016.11/include/configs/hi3519av100.h
定位到Emmc分区定义部分,典型配置如下:
c复制#define CONFIG_EXTRA_ENV_SETTINGS \
"mmcparts=mmcblk0:4M(bootloader),16M(boot),512M(rootfs),256M(appfs),50M(media),-(userdata)\0"
bootloader分区:
rootfs分区:
du -sh rootfs/bash复制make ARCH=arm CROSS_COMPILE=arm-himix200-linux- hi3519av100_config
make ARCH=arm CROSS_COMPILE=arm-himix200-linux- -j8
bash复制# 在Uboot命令行执行
mmc part
# 预期输出类似:
Partition Map for MMC device 0 -- Partition Type: EFI
Part Start LBA End LBA Name
00000001 00000020 "bootloader"
00000021 00000120 "boot"
00000121 00004120 "rootfs"
...
现象:修改配置后,烧录的分区布局仍为旧版本
解决方法:
make distclean彻底清理编译环境典型报错:
code复制Wrong filesystem type, bad option, bad superblock on mmcblk0p2...
排查步骤:
bash复制setenv bootargs 'mem=512M console=ttyAMA0,115200 root=/dev/mmcblk0p3 rootfstype=ext4 rw'
bash复制file -sL /dev/mmcblk0p3
优化建议:
通过Uboot环境变量实现灵活配置:
bash复制setenv mmcparts 'mmcblk0:4M(bootloader),16M(boot),512M(rootfs),256M(appfs),-(userdata)'
saveenv
bash复制mmc read 0x82000000 0x0 0x200
tftp 0x82000000 partition.backup 0x40000
c复制// 在uboot代码中添加恢复命令
if (strcmp(cmd, "rescue") == 0) {
run_command("tftp 0x82000000 partition.backup", 0);
run_command("mmc write 0x82000000 0x0 0x200", 0);
}
如果需要启用安全校验:
c复制"mmcparts=mmcblk0:1M(secure),3M(bootloader),16M(boot)..."
在最近的项目中,我们遇到了一个棘手问题:设备在高温环境下偶尔出现启动失败。经过排查发现是Emmc分区边界未按擦除块对齐导致的。解决方法是在计算分区大小时保证是4MB的整数倍:
c复制// 错误示例:15MB分区
"mmcparts=...15M(boot),..."
// 正确做法:对齐到16MB
"mmcparts=...16M(boot),..."
另一个实用技巧是在开发阶段添加临时调试分区:
bash复制# 在分区末尾保留10MB空间
"mmcparts=...,-(userdata),10M(debug)"
这个分区可以用来存放日志或临时固件,通过配置内核不挂载该分区,可以避免污染用户数据区。