海思Hi3519AV100 emmc模式Linux系统移植实战:从SDK编译到Hitool烧写全解析
1. 环境准备与SDK解压
第一次接触海思Hi3519AV100的emmc启动方案时,我踩了不少坑。这里把完整的移植过程记录下来,希望能帮到同样在摸索的开发者。首先需要准备Ubuntu 18.04或更高版本的系统环境,建议使用物理机而非虚拟机,因为后续的编译过程对系统资源消耗较大。
下载官方SDK包(如Hi3519AV100_SDK_V2.0.1.0.tgz)后,特别注意要在Linux系统下解压。我试过在Windows解压再传到Ubuntu,结果符号链接全部失效,导致文件夹体积膨胀到几十GB。正确的解压姿势是:
tar -zxf Hi3519AV100_SDK_V2.0.1.0.tgz cd Hi3519AV100_SDK_V2.0.1.0 sudo ./sdk.unpack这里必须用root权限执行sdk.unpack,否则部分文件权限会出问题。解压完成后,你会看到osdrv、package、tools等目录结构。其中osdrv包含了我们需要的所有开源驱动和工具链。
2. 交叉编译工具链配置
海思提供了专用的arm-himix200-linux交叉编译器,这个工具链需要单独安装。我遇到过工具链安装后无法识别的问题,后来发现是环境变量没配置好。具体安装步骤:
tar -xzf arm-himix200-linux.tgz cd arm-himix200-linux chmod +x arm-himix200-linux.install ./arm-himix200-linux.install安装完成后,建议手动检查下环境变量是否生效:
which arm-himix200-linux-gcc如果显示路径正确,说明工具链安装成功。这里有个小技巧:可以在~/.bashrc中添加永久环境变量,避免每次开新终端都要重新配置:
echo "export PATH=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin:$PATH" >> ~/.bashrc source ~/.bashrc3. u-boot适配与编译
emmc模式的关键在于u-boot的配置。SDK默认提供的是spi nor flash的配置,我们需要切换到emmc专用配置。进入u-boot源码目录:
cd osdrv/opensource/uboot/u-boot-2016.11 cp configs/hi3519av100_mmc_defconfig .config make menuconfig在menuconfig界面中,需要重点检查以下几个配置项:
- CONFIG_SYS_MMC_ENV_DEV:设置为0对应emmc设备
- CONFIG_MMC:必须启用MMC支持
- CONFIG_CMD_MMC:启用MMC命令支持
保存配置后,回到SDK根目录开始编译。特别注意要指定BOOT_MEDIA参数:
cd ~/Hi3519AV100_SDK_V2.0.1.0/osdrv make OSDRV_CROSS=arm-himix200-linux CHIP=hi3519av100 BOOT_MEDIA=emmc all编译过程大约需要30分钟,取决于你的机器性能。我遇到过编译失败的情况,大多是内存不足导致的。建议至少准备8GB内存,或者添加swap空间:
sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile4. 镜像文件生成与验证
编译完成后,生成的镜像文件位于osdrv/pub/smp_image_glibc/目录下。关键文件包括:
- u-boot-hi3519av100.bin:bootloader镜像
- uImage_hi3519av100_smp:Linux内核镜像
- rootfs_hi3519av100_XXX.ext4:根文件系统
建议先用file命令检查文件格式是否正确:
file uImage_hi3519av100_smp # 应显示:Linux kernel ARM boot executable zImage (little-endian)对于rootfs.ext4文件,可以挂载检查内容是否完整:
mkdir test_mount sudo mount -o loop rootfs_hi3519av100_32M.ext4 test_mount ls test_mount sudo umount test_mount5. Hitool烧写配置详解
将编译好的镜像文件拷贝到Windows环境(建议用共享文件夹而不是U盘传输)。打开Hitool工具后,关键是要正确配置分区表XML文件。以下是emmc模式的典型配置示例:
<?xml version="1.0" encoding="GB2312"?> <Partition_Info ProgrammerFile=""> <Part Sel="1" PartitionName="fastboot" FlashType="emmc" FileSystem="none" Start="0" Length="1M" SelectFile="D:\images\u-boot-hi3519av100.bin"/> <Part Sel="1" PartitionName="kernel" FlashType="emmc" FileSystem="none" Start="1M" Length="5M" SelectFile="D:\images\uImage_hi3519av100_smp"/> <Part Sel="1" PartitionName="rootfs" FlashType="emmc" FileSystem="ext4" Start="6M" Length="32M" SelectFile="D:\images\rootfs_hi3519av100_32M.ext4"/> </Partition_Info>烧写时常见的问题及解决方法:
- 烧写超时:检查串口线连接是否稳定,尝试降低波特率到115200
- uboot无法启动:确认.config文件中CONFIG_SYS_TEXT_BASE的值是否正确(应为0x20800000)
- 文件系统挂载失败:检查rootfs的ext4文件是否完整,可以用fsck.ext4检查
6. 启动参数配置与调试
烧写完成后,通过串口工具连接开发板,在uboot启动时快速按下任意键进入boot命令行。需要设置以下关键环境变量:
setenv bootargs 'mem=1024M console=ttyAMA0,115200 root=/dev/mmcblk0p3 rw rootfstype=ext4 blkdevparts=mmcblk0:1M(boot),5M(kernel),7200M(rootfs),-(user)' setenv bootcmd 'mmc read 0 0x22000000 800 2000; bootm 0x22000000' saveenv这些参数的含义:
- bootargs:指定内存大小、控制台设备、根文件系统位置等
- bootcmd:定义自动启动命令,从emmc的0x800偏移处读取内核到内存0x22000000
测试时可以先手动加载内核:
mmc read 0 0x22000000 800 2000 bootm 0x22000000如果启动失败,可以通过以下命令查看硬件信息:
- mmc info:显示emmc设备信息
- mmc read:测试emmc读取是否正常
- printenv:检查环境变量是否正确
7. 常见问题排查指南
在实际项目中,我遇到过几个典型问题:
问题1:uboot启动后卡住解决方法:检查PHYS_SDRAM_1_SIZE配置,应该为0x40000000(1GB)。这个参数在include/configs/hi3519av100.h中定义。
问题2:内核panic无法挂载rootfs可能原因:
- rootfs分区位置不对,检查bootargs中的root=/dev/mmcblk0pX
- 文件系统损坏,重新生成ext4镜像
- emmc读写异常,尝试降低时钟频率
问题3:Hitool烧写速度极慢优化方案:
- 使用USB3.0接口
- 关闭杀毒软件实时监控
- 尝试分段烧写(先uboot,再内核和rootfs)
8. 性能优化建议
系统成功启动后,还可以进行以下优化:
- uboot启动加速:
setenv bootdelay 0 saveenv内核裁剪:通过make menuconfig移除不需要的驱动模块
文件系统优化:
- 使用squashfs替代ext4节省空间
- 启用dm-verity保证系统完整性
- 添加overlayfs支持临时文件
- emmc性能调优:
# 查看emmc信息 mmc extcsd read 0 # 启用HS400模式(如果硬件支持) mmc hwpartition 1 1 1