当前位置: 首页 > news >正文

【正点原子I.MX6U-MINI】从零到系统启动:uboot编译与EMMC固化的完整实践

1. 环境准备:搭建你的嵌入式开发“厨房”

拿到一块像正点原子I.MX6U-MINI这样的开发板,就像得到了一套高级的半成品食材。你想让它跑起来,第一步不是直接下锅,而是得先准备好你的“厨房”——也就是交叉编译环境。很多新手朋友一上来就卡在这里,看着一堆命令发懵,其实没那么复杂,跟着我一步步来,保证你能搞定。

首先,你得有一台运行Ubuntu的电脑,虚拟机或者实体机都行。我强烈建议用Ubuntu 20.04 LTS,稳定性好,社区支持也完善。接下来,我们要安装“秘密武器”:交叉编译工具链。你可以把它理解成一套特殊的厨具,它能在你的x86电脑上,编译出能在ARM架构开发板上运行的“菜肴”(也就是程序)。正点原子提供的资料里通常会有工具链,但为了通用性,我们直接用Linaro官方的。打开终端,执行下面这条命令来安装必要的依赖库,这是为了让工具链能正常工作:

sudo apt-get update sudo apt-get install libncurses5-dev device-tree-compiler bison flex libssl-dev

然后,我们去下载工具链。这里我推荐使用gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf这个版本,和I.MX6U系列芯片匹配度很高。你可以用wget命令直接下载,或者去官网找到链接。下载解压后,记得把工具链的路径加到系统的环境变量里。具体操作是编辑你用户目录下的.bashrc文件,在末尾加上类似这样的一行:

export PATH=$PATH:/你的工具链解压路径/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin

加完之后,执行source ~/.bashrc让它生效。最后,在终端里输入arm-linux-gnueabihf-gcc -v,如果能看到一长串版本信息,恭喜你,你的“厨房”已经准备就绪了。这一步虽然看起来繁琐,但就像做饭前洗菜切菜一样,是必不可少的基础,磨刀不误砍柴工。

2. 源码获取与初步探索:认识你的“食材”

工具链装好了,接下来就要处理我们的“主食材”——uboot源码。正点原子的资料光盘或者官网下载页面里,你能找到一个名为uboot-imx-2016.03-2.1.0-gee88051-v1.6.tar.bz2的压缩包(版本号可能略有不同)。我建议你在Ubuntu系统里专门创建一个清晰的工作目录,比如~/workspace/imx6ull/,把源码放进去,这样以后管理起来会非常方便。

通过FTP工具(比如FileZilla)或者直接拖拽到虚拟机共享文件夹,把源码包上传到你的Ubuntu里。接着,在终端进入存放目录,用tar -vxjf命令解压。解压完成后,你会看到一个充满文件和文件夹的uboot源码目录。先别急着编译,我们花几分钟时间简单逛逛这个“食材仓库”。arch/目录下存放着不同CPU架构的代码,我们关心的是arch/arm/board/目录里是不同板级的支持文件,正点原子的板子配置文件通常就在这里。include/configs/目录下则存放着板级的头文件配置。最重要的,根目录下有一个Makefile,它是整个编译过程的“总指挥”。

对于I.MX6U-MINI这块板子,正点原子已经为我们做好了默认的配置文件,名字通常是mx6ull_14x14_ddr512_emmc_defconfig。这个文件定义了这块板子用的是多少内存(DDR512)、存储介质是EMMC等关键信息。你可以在源码根目录下执行find . -name "*mx6ull*defconfig*"来快速找到它。了解这些,不是为了让你马上能修改,而是让你心里有个底,知道编译时到底发生了什么,出了问题也知道该去哪里找原因,而不是完全抓瞎。

3. 编译uboot:烹饪你的第一道“主菜”

好了,厨房和食材都齐了,现在开始动手烹饪第一道硬菜——编译uboot。这个过程其实就三条核心命令,但里面的门道不少。我们一条条来拆解,确保你不仅会做,还知道为什么这么做。

首先,进入你解压好的uboot源码根目录。第一步,执行清理命令:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean。这条命令相当于把厨房操作台彻底擦洗干净,清除掉所有之前可能残留的中间文件和配置。尤其是当你从别处拷贝源码,或者之前编译失败过,这一步至关重要,能避免很多稀奇古怪的错误。

第二步,加载针对我们这块板子的默认配置:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig。这条命令执行后,终端会打印出一些配置信息。它干了什么呢?它把上面我们提到的那个defconfig文件里的配置项,应用到整个uboot源码树,生成一个隐藏的.config文件。这个文件就是后续编译的“菜谱”。你可以用cat .config | grep -v "^#" | head -30命令瞥一眼这个菜谱的前几行,感受一下。

第三步,也是最激动人心的一步,开始正式编译:make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12。这里有几个参数值得说道:V=1表示输出详细的编译过程,方便出错时调试,第一次编译可以加上,熟悉后可以去掉让屏幕更干净。-j12表示用12个线程并行编译,这个数字通常设为你CPU核心数的1到2倍,能极大加快编译速度。我实测在6核12线程的机器上,用-j12比不用快了好几倍。

编译过程会持续一两分钟,屏幕上滚过无数行信息。只要最后没有出现红色的error字样,并且以生成u-boot.binu-boot.imx文件为结束,就说明成功了。这里要特别解释一下这两个文件的区别:u-boot.bin是纯粹的、可执行的二进制代码,但I.MX6U这类芯片在上电启动时,需要一些额外的头部信息(比如IVT、DCD数据)来告诉芯片怎么初始化DDR,从哪里开始执行。u-boot.imx就是在u-boot.bin前面加上了这些头部信息后形成的最终镜像,只有这个u-boot.imx文件才能被我们的烧写工具识别并正确烧录到开发板。所以,请认准u-boot.imx这个文件,把它复制到一个安全的地方,我们下一步就要用它。

4. 使用MfgTool固化系统:把“菜”装盘上桌

编译出u-boot.imx只是做好了菜,接下来得把它和系统其他部分一起,“装盘”到开发板的EMMC存储里,这个过程就叫固化或烧录。正点原子推荐使用他们定制过的NXP官方工具MfgTool,它通过USB OTG线进行烧写,非常方便。这里我分享几个我踩过坑才总结出来的关键步骤。

首先,从正点原子的资料包里找到mfgtool这个工具文件夹。关键操作来了:我们需要用自己刚编译好的u-boot.imx替换掉工具里自带的uboot。找到mfgtool\Profiles\Linux\OS Firmware\files\boot这个路径,里面会有一个类似u-boot-imx6ull-14x14-emmc.imx的文件。把你编译生成的u-boot.imx文件复制过来,并且重命名,完全覆盖掉原来的那个文件,文件名必须保持和原来一模一样,否则工具会找不到。这是第一个容易出错的地方。

接着,用USB OTG线连接开发板和电脑,开发板的启动拨码开关拨到USB模式。然后双击运行Mfgtool2-eMMC-ddr512-eMMC.vbs这个脚本文件(注意根据你的板子EMMC版本选择正确的vbs文件)。如果一切正常,MfgTool软件界面上会显示“符合HID标准的供应商定义设备”之类的字样。如果没显示,别慌,按这个顺序排查:1. USB线是否插好?换条线试试。2. 开发板电源是否接通?3. 拨码开关位置是否正确?4. 电脑的USB驱动是否正常?通常在设备管理器里能看到一个USB Download Gadget之类的设备。

注意:在点击“Start”开始烧写前,我强烈建议你先打开一个串口调试终端(如MobaXterm、Putty等),设置好正确的串口号和波特率(通常是115200)。这样你就能在烧写过程中看到开发板输出的详细日志,这对判断烧写进度和排查问题有巨大帮助。

点击“Start”后,烧写就开始了。MfgTool的工作原理很巧妙,它分两步走:第一步,先把一个最小的、包含uboot、kernel和dtb的“临时系统”通过USB下载到开发板的内存(DDR)里并运行起来;第二步,在这个临时Linux系统的环境下,再去格式化EMMC,并把完整的四大件(uboot、kernel、dtb、rootfs)从电脑拷贝到EMMC的相应分区。所以你会看到进度条走两遍,第一遍很快(下载到内存),第二遍很慢(写入EMMC,尤其是rootfs文件系统很大)。耐心等待直到显示“Done”和“烧写成功”。完成后,先点“Stop”,再点“Exit”退出,最后把拨码开关拨回EMMC启动模式,重启开发板。

5. 系统启动与基础配置:让开发板“活”起来

开发板重启后,如果一切顺利,你应该能在串口终端里看到uboot的启动倒计时,然后是Linux内核的启动信息翻滚,最后出现一个登录提示符。正点原子出厂系统的默认用户名是root,没有密码,直接回车就能进入。恭喜你,你的系统已经从EMMC成功启动了!

不过,先别急着庆祝,现在的系统还是个“毛坯房”。首先,网络很可能是不通的。这是因为uboot虽然移植时支持了网络,但相关的环境变量(比如开发板的IP地址、服务器的IP地址等)还没有设置。我们需要在uboot阶段设置这些。在uboot启动倒计时时,按任意键进入uboot命令行,然后依次设置(请根据你的实际网络环境修改):

setenv ipaddr 192.168.1.100 # 开发板的IP地址 setenv ethaddr 00:04:9f:04:d2:35 # 开发板的MAC地址,同一局域网内需唯一 setenv gatewayip 192.168.1.1 # 网关地址 setenv netmask 255.255.255.0 # 子网掩码 setenv serverip 192.168.1.50 # 你的Ubuntu主机的IP地址 saveenv # 保存环境变量到EMMC

设置完后,可以用ping 192.168.1.50(你的服务器IP)来测试网络是否通畅。看到host 192.168.1.50 is alive就说明网络通了,这是后续进行内核调试、网络挂载文件系统的前提。

还有一个常见问题是IP地址不固定。因为板载的LAN8720 PHY芯片没有内置MAC地址,每次启动Linux系统都会生成一个随机的MAC,导致DHCP获取的IP每次都变,很不方便。解决办法是设置静态IP。进入系统后,编辑/etc/rc.local文件(这个文件在系统启动的最后阶段执行),在exit 0这一行之前,添加如下内容:

ifconfig eth0 192.168.1.100 netmask 255.255.255.0 up route add default gw 192.168.1.1 echo "nameserver 114.114.114.114" > /etc/resolv.conf

这样每次启动,eth0网卡都会固定设置为192.168.1.100。做完这些,你的开发板就有了一个稳定的网络身份,可以通过ssh远程登录,也可以用它来从服务器下载文件,整个开发环境就真正搭建完成了。从编译到烧写再到配置,这个过程虽然步骤不少,但每一步都有其明确的目的,亲手走一遍,你对嵌入式系统启动流程的理解会深刻很多。下次我们就可以尝试修改uboot代码,或者编译自己的Linux内核了,那又是另一片有趣的天地。

http://www.cnnetsun.cn/news/1287394.html

相关文章:

  • 快马平台一键生成Spring Boot用户管理原型,5分钟搭建可运行后端服务
  • 基于立创地文星开发板的USB-Hub电压电流表DIY全解析:硬件选型、软件配置与外壳设计
  • 【数字电子技术课程设计】基于FPGA的高精度数字电子钟设计与实现
  • Allegro17.4异形焊盘实战:从DXF导入到Padstack的完整流程
  • 提升创作效率:用快马平台打造可实时迭代的旗博士口播智能体
  • 如何在遵守协议前提下实现高效内容访问:解锁信息价值的技术方案与合规指南
  • 快马平台五分钟搭建openclaw抓取原型,验证你的数据采集想法
  • 泰山派RK3576开发板Android 14系统ADB调试与投屏实战指南
  • ESP32双模通信实战:从Wi-Fi联网到蓝牙透传的物联网应用
  • Unity SLG战棋游戏开发实战:从源码解析到功能实现
  • AI赋能开发:让快马平台的Kimi模型优化你的esp8266代码,实现智能节电与稳定上报
  • FBX转STP在线工具大比拼:哪款更适合你的3D设计需求?
  • RK3566小手机MIPI-DSI显示适配与背光驱动实战
  • Qwen3.5-35B-A3B-AWQ-4bit入门指南:清晰图优先策略+分步提问技巧详解
  • gte-base-zh效果对比:与其他开源嵌入模型的横向评测
  • 基于NTC热敏电阻的电子鞭炮明火点火系统设计
  • CANoe_UDS-bootloader自动化测试系列(三)核心引擎:CAPL构建UDS诊断报文收发与状态机解析框架
  • GLM-OCR快速入门实战:上传图片秒出结果,文本、表格、公式都能识别
  • Gemma-3-12b-it持续集成教程:GitHub Actions自动化镜像构建流程
  • 对标百度网盘:基于SpringBoot开发的分布式文件系统,功能非常强大,开源了!
  • 解决Python中onnxruntime DLL加载失败的三大实战方案
  • XJTUSE - 从零构建:一个基于自拟协议与FPGA的通信装置实战
  • 从零部署到实战:OpenPCDet 3D检测环境搭建与模型调优全攻略
  • 深入解析32/64位Windows虚拟扫描仪的自定义图片加载机制
  • AI智能二维码工坊实战落地:企业宣传页集成部署详细步骤
  • [深度解析]机器人正向运动学建模:从关节角度到末端坐标的实战推演
  • 均匀面阵波束合成方向图的MATLAB仿真与关键参数影响分析
  • 微信DAT文件解码实战:免费开源工具开发与取证应用
  • Autosar架构下非发动机ECU的OBD II诊断实现:从UDS基础到法规遵从
  • C语言完美演绎3-14