正点原子阿尔法开发板uboot实战:从编译到网络启动的完整避坑指南

张开发
2026/4/15 11:32:52 15 分钟阅读

分享文章

正点原子阿尔法开发板uboot实战:从编译到网络启动的完整避坑指南
1. 初识uboot为什么需要它刚拿到正点原子阿尔法开发板时我最先遇到的困惑就是为什么不能直接运行Linux系统后来才知道这就像电脑开机需要BIOS一样嵌入式设备启动也需要一个引路人——这就是uboot。它主要负责初始化DDR内存、时钟等关键硬件然后把Linux内核从存储设备比如SD卡或EMMC搬运到内存中最后把控制权交给内核。uboot的版本选择很有讲究。我刚开始直接用了官方源码结果发现网卡驱动不兼容。后来才明白要选择开发板厂商适配的版本——正点原子基于NXP官方uboot做了二次开发专门适配了阿尔法开发板的硬件。这就好比买家电要选对应型号的配件通用版本往往水土不服。2. 编译环境搭建那些意想不到的坑2.1 交叉编译器安装编译uboot需要ARM架构的交叉编译器我选择了arm-linux-gnueabihf版本。在Ubuntu上安装很简单sudo apt-get install gcc-arm-linux-gnueabihf但这里有个隐藏坑点不同Ubuntu版本默认安装的编译器版本可能不同。我最初在Ubuntu 20.04上编译通过的程序放到18.04上就跑不起来。建议统一使用正点原子资料包里推荐的编译器版本。2.2 源码目录的讲究解压uboot源码时我习惯性放在主目录下结果编译时报各种权限错误。后来发现路径中不能有中文和空格最好放在纯英文路径下比如/home/username/projects/imx6ull/uboot还有一点容易被忽略uboot源码所在路径的父目录名称不要带括号等特殊字符这会导致makefile解析出错。3. 编译实战从报错到成功3.1 三条关键命令解析正点原子提供的编译步骤看起来简单make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- distclean make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig make V1 ARCHarm CROSS_COMPILEarm-linux-gnueabihf- -j12但每个命令都有讲究第一条的distclean会彻底清除之前的编译记录避免残留文件干扰第二条的配置文件名mx6ull_14x14_ddr512_emmc_defconfig必须一字不差14x14中的x是字母x不是乘号ddr512对应开发板的DDR3内存大小第三条的-j12表示用12线程编译这个数字不要超过CPU实际核心数3.2 Windows到Linux的格式陷阱我图方便在Windows下写了编译脚本通过TFTP传到Ubuntu后却报错/bin/bash^M: bad interpreter这是因为Windows和Linux的换行符不同。解决方法有两种# 方法1使用dos2unix转换 sudo apt-get install dos2unix dos2unix script.sh # 方法2用sed命令处理 sed -i s/\r$// script.sh4. 网络功能配置ping通那一刻的喜悦4.1 环境变量设置要点要让开发板联网必须正确设置这些环境变量setenv ipaddr 192.168.1.100 # 开发板IP setenv ethaddr 00:04:9f:04:d2:35 # MAC地址 setenv serverip 192.168.1.10 # 主机IP setenv gatewayip 192.168.1.1 # 网关 setenv netmask 255.255.255.0 # 子网掩码 saveenv # 保存设置常见踩坑点IP地址不在同一网段比如开发板192.168.1.x主机192.168.0.x忘记保存环境变量setenv后必须执行saveenvMAC地址冲突多块开发板不能相同4.2 网络模式选择虚拟机网络连接方式直接影响ping通桥接模式开发板和主机相当于独立设备都连接路由器NAT模式主机充当路由器开发板通过主机上网我建议先用桥接模式测试基本连通性配置TFTP/NFS时再切到NAT模式。切换后别忘了在Ubuntu中重启网络服务sudo /etc/init.d/networking restart5. 文件传输TFTP和NFS实战5.1 TFTP服务搭建在Ubuntu安装TFTP服务sudo apt-get install tftp-hpa tftpd-hpa sudo mkdir /tftpboot sudo chmod 777 /tftpboot关键配置文件/etc/default/tftpd-hpa要修改为TFTP_DIRECTORY/tftpboot TFTP_OPTIONS-l -c -s测试时遇到Access violation错误是因为文件权限不足。需要chmod 777 zImage # 给待传输文件赋权5.2 NFS挂载技巧配置NFS共享目录sudo apt-get install nfs-kernel-server sudo echo /nfs_root *(rw,sync,no_root_squash) /etc/exports sudo service nfs-kernel-server restart在uboot中挂载setenv bootargs consolettymxc0,115200 root/dev/nfs nfsroot192.168.1.10:/nfs_root/rootfs ip192.168.1.100:192.168.1.10:192.168.1.1:255.255.255.0::eth0:off saveenv常见问题排查防火墙阻挡sudo ufw disable目录权限确保/nfs_root及其子目录有读写权限版本兼容Ubuntu 20.04需要添加insecure参数到exports文件6. 存储设备操作EMMC和SD卡6.1 设备切换技巧阿尔法开发板同时支持SD卡和EMMC切换命令mmc dev 0 # 切换到SD卡设备号0 mmc dev 1 # 切换到EMMC设备号1查看设备信息mmc info # 显示当前设备详情 mmc list # 列出所有存储设备6.2 烧写镜像的完整流程以更新uboot为例tftp 80800000 u-boot.imx # 下载到内存 mmc dev 1 0 # 切换到EMMC mmc write 80800000 2 32 # 写入EMMC参数解析80800000内存加载地址2EMMC起始块1块512字节32写入块数32*51216KB重要安全提示烧写前务必确认目标地址错误的地址可能破坏文件系统7. 启动配置多种方式任你选7.1 环境变量精讲bootcmd是最重要的自动启动变量例如从网络启动setenv bootcmd tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000从EMMC启动的配置setenv bootcmd fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 830000007.2 设备树文件之谜我最初被文档中的设备树文件名坑过文档写的是imx6ull-alientek-emmc.dtb实际应该用imx6ull-14x14-emmc-7-1024x600-c.dtb建议操作前先用fatls命令查看实际文件fatls mmc 1:1 # 列出EMMC第一分区文件8. 实用技巧调试与问题排查8.1 内存操作技巧查看内存内容md.l 80000000 10 # 以4字节格式显示0x80000000开始的16个数据修改内存值nm.l 80000000 # 交互式修改 mw.l 80000000 0x12345678 10 # 批量填充8.2 环境变量管理查看所有环境变量printenv删除环境变量setenv bootdelay # 不赋值即为删除 saveenv8.3 常见错误解决编译时报错检查Makefile中的路径是否正确确保没有中文字符ping不通确认IP在同一网段检查网线连接尝试更换网络模式TFTP超时关闭防火墙sudo ufw disable确认文件权限uboot启动卡住检查串口终端设置波特率1152008N1环境变量丢失可能是EMMC/SD卡有问题尝试重新烧写记得每次修改环境变量后都要执行saveenv否则重启后会丢失设置。遇到问题时多用printenv查看当前配置往往能快速定位问题所在。

更多文章