拓冰建站拓冰建站
首页 / 资讯中心 / 正文

T2080开发调试环境搭建:U-BOOT与内核移植的基石

拿到一块T2080的板子最正确的动作是什么不是急着翻原理图也不是去追U-BOOT源码而是先把整套开发调试环境理顺。这个环节听起来不起眼但环境没搭好后面每一步移植都会变成灾难。我这几年在QorIQ平台上来回折腾最大的感受就是能把环境一次配好的人后面调试效率能快出一倍。这篇就是整个T2080 U-BOOT与OS内核移植系列的准备篇一主题很明确把开发调试环境讲清楚不涉及具体代码改动但每一步都是为了后续真正动手做底子。内容包括四块——T2080RDB板卡上有什么资源、主机Linux侧需要装什么工具链和服务、U-BOOT和内核源码从哪来以及首次上电后如何验证这套环境能不能正常工作。适合第一次接触QorIQ系列、之前主要在ARM/MCU上做开发的读者也适合手里有板子但一直没下决心开干的工程师。环境这个东西很多老手觉得“不是事”可它恰恰是新手最容易卡住的地方。1. 为什么把“开发调试环境”当成移植的第一件事1.1 移植工作到底在移什么先说清楚“移植”这个词。U-BOOT移植和OS内核移植本质上是同一类工作让一份已经在别的板子上跑起来的代码在新硬件上也能启动、能引导、能进系统。一份U-BOOT源码可以在几十款不同开发板上编译通过但真正烧到自己设计的板子上十有八九会卡在串口没输出、DDR初始化不过、网卡不识别这些地方。这些问题的根源往往不是代码逻辑而是调试环境不完整导致你“看不见”芯片在干什么、卡在哪里。T2080是NXP QorIQ系列里很有代表性的处理器四核e5500核心最高频率能跑到1.8GHz带AltiVec向量单元外设覆盖DDR、PCIe、SATA、万兆网口、RapidIO这些。相比STM32那种单核MCU调试复杂度完全是另一个量级。即使你之前把FreeRTOS、LVGL这些应用层生态玩得很熟第一次碰T2080还是会蒙——因为启动流程从第一行代码开始就和MCU不一样更没有集成开发环境帮你一键下载。1.2 T2080平台特点与这套环境的价值T2080这个平台的特点是“启动链路长、外设多、调试手段多”。启动链路长指的是从芯片上电到Linux出现命令行中间要经过复位配置字RCW、PBL预启动初始化、DDR控制器训练、U-BOOT重定位、内核解压、设备树解析等好几个阶段。外设多意味着你不仅要调试串口和网口后面很可能还要调PCIe设备、SATA盘、RapidIO交换芯片。调试手段多则意味着摆在你面前的不只是JTAG一条路还有串口日志、网络引导、内核KGDB、逻辑分析仪等选择。所以这套开发调试环境本质上是给你自己搭一条“能看见、能干预、能验证”的通路。看见了启动日志你才知道卡在哪能干预U-BOOT环境变量才能不停尝试不同的启动参数能把内核镜像通过TFTP丢到板子上才能免去反复烧写Flash的痛苦。下文所有内容都是围绕这个目标展开的。理解了这一点后续每一步操作你就不会被单个命令带走而是始终清楚“我现在是在打通哪一段链路”。2. 认识T2080RDB板卡接口、接线与启动源2.1 RDB板的资源和接口布局T2080RDB是NXP官方的参考设计板市面上能买到的T2080开发板大部分也长这样。板子拿到手先别急着上电把接口认一遍。不用记全部只要重点认清楚下面几个与开发调试直接相关的接口。接口位置特征调试用途调试串口DUART通常标注UART0DB9母座或2.54mm排针输出U-BOOT和内核启动日志进入U-BOOT命令行管理网口多个RJ45中通常有一个标注管理口TFTP下载镜像、NFS挂载根文件系统、SSH登录SD卡槽板边翻盖或推入式从SD卡启动U-BOOT或存放引导镜像与根文件系统JTAG接口排针常见30Pin或14Pin接调试探针做硬件级断点、寄存器读写电源接口12V DC或ATX电源整板供电部分JTAG调试要求先上电再连接我实际调试时串口线用的是一根USB转DB9公头线买板子基本都会附赠如果没有就自己备一根。网口这边强烈建议把板卡上的管理网口用网线直连主机网口不经过交换机。原因很简单直连时IP段和物理链路都是你自己可控的U-BOOT下面ping不通的时候排除项最少。如果你必须接交换机那就要确认交换机端口没有做VLAN隔离否则后面排查会让人怀疑人生。2.2 启动源选择与拨码设置T2080RDB支持从NOR Flash、SD卡、NAND Flash、SPI Flash等多个地方启动具体从哪里启动由板上的拨码开关决定。这个设置一定要在第一次上电前确认清楚因为它直接决定了你能不能看到串口日志。我拿到板子的习惯是先把所有拨码拨到出厂默认的NOR启动位置确认出厂U-BOOT能正常跑起来再改到SD启动去烧自己编译的镜像。为什么因为NOR Flash里本来就有出厂固件即使后面测试镜像刷坏了拨回NOR启动就能恢复相当于留了一条保底命。如果你一开始就折腾SD启动或者NAND启动还不小心把Flash刷了那就只能靠JTAG救砖麻烦得多。启动源相关的拨码状态不同批次板卡标注可能略有差异但几乎都是通过SW1、SW2这一类开关组合控制。操作前先对着板卡丝印拍张照或者翻一下附带的快速入门手册千万不靠记忆盲拨。另外板载DDR、核心电压等跳线保持默认即可不要在准备阶段动它们等后续调电压域方案时再研究。3. 主机Linux侧的开发调试环境3.1 交叉编译工具链怎么选T2080的e5500核心是Power Architecture指令集X86主机上编译U-BOOT和内核必须用交叉编译器。工具链选型上我推荐按照“先能用再合规范”的顺序来。第一顺手的是系统自带交叉编译器。以Ubuntu为例一条命令就能装好sudo apt install gcc-powerpc-linux-gnu装好后工具链前缀是powerpc-linux-gnu-包括powerpc-linux-gnu-gcc、powerpc-linux-gnu-ld等。优点是省事缺点是和NXP官方SDK的编译环境可能有差异遇到代码或库版本敏感的场景编译结果会有些奇怪。所以我只是把系统包用来做前期验证和快速编译真正合入完整工程后还是建议切换到NXP的QorIQ SDK工具链或者自己用crosstool-NG构建一套独立工具链。如果你手头有旧项目需要保持老代码稳定编译那就用crosstool-NG自己编译一个固定版本的GCC输出工具链固定在某个路径后续所有工程统一用CROSS_COMPILE/opt/toolchains/xxx/bin/powerpc-linux-gnu-指定。这块地方最值得花时间因为工具链版本不统一导致的诡异编译错误远比代码本身的问题难排查。建议每拿到一款新板卡先把工具链版本和编译参数固定下来不要频繁换。3.2 TFTP、NFS、串口终端一个都不能少工具链只是编译侧的环境。真正让开发调试效率起飞的是三个网络服务类的工具TFTP用于U-BOOT下载镜像NFS用于内核启动时挂载根文件系统串口终端用于查看日志和输入命令。TFTP服务在Ubuntu上安装配置很简单sudo apt install tftpd-hpa sudo mkdir -p /srv/tftp sudo chown tftp:tftp /srv/tftp配置文件在/etc/default/tftpd-hpa默认目录是/srv/tftp如果没有特别需求就保持默认。注意TFTP没有加密和账号概念权限搞错就会报“TFTP timeout”或“File not found”。配置完记得重启服务并确认端口69在监听sudo systemctl restart tftpd-hpa sudo netstat -lnup | grep :69NFS服务主要用于内核启动后挂根文件系统好处是宿主机上的文件改动立即生效不用反复烧写存储介质。配置方法是安装nfs-kernel-server然后在/etc/exports里加一行/srv/t2080/rootfs *(rw,sync,no_root_squash,no_subtree_check)关键字no_root_squash很重要否则开发板上的root用户对NFS目录没有写权限程序根本没法调试。添加后执行sudo exportfs -ra生效。串口终端方面我偏爱picocom比minicom配置简单比screen看起来清爽sudo apt install picocom picocom -b 115200 /dev/ttyUSB0T2080RDB调试串口的波特率固定是1152008N1没有流控。如果串口没有反应优先检查USB转串口芯片是否被识别lsusb看设备ls /dev/ttyUSB*看节点。3.3 工作目录与版本管理的心得环境不只是软件服务目录结构也得规划清楚。我自己在~/t2080_workspace下面建了这样一套目录t2080_workspace/ ├── u-boot/ ├── linux/ ├── rootfs/ ├── images/ ├── tools/ └── logs/u-boot和linux放源码rootfs放提取出来的根文件系统images放编译产物和用来烧写的镜像logs放每次上电的串口日志。日志目录很容易被忽略但后面调启动流程时对比前后两次日志的变化几乎是最有效的定位手段。所以我的习惯是每次上电前先存一个带时间戳的日志文件再按电源键date %Y%m%d_%H%M%S.log另外源码仓库建议打上自己的版本标签不要只留一份“最新代码”。U-BOOT和内核迭代很快一个功能调通后如果没记录三天后再回来看可能就不知道当时用的是哪份源码了。准备阶段花十分钟把目录规划好后面会省下大量时间。4. 获取U-BOOT与内核源码并完成首批编译4.1 源码版本怎么选T2080RDB在U-BOOT主线里本身就有支持不需要去翻那些乱七八糟的第三方仓库。我的建议是直接拉U-BOOT官方主线版本选2015.01以后都行越新的版本对现代GCC编译器的兼容性越好。老版本U-BOOT用新版GCC编译经常会冒出“-fno-tree-loop-distribute-patternsnot recognized”之类的错误处理起来纯属浪费时间。内核版本选择上优先选LTS长支持版本。我一般在4.19和5.10这两个版本上做T2080原因只有一个NXP的底层驱动补丁在这些版本上验证得最充分。Electron的Superpi…不跑题了。反正选内核的准则是“能跑通优先追新不着急”。新内核确实对e5500的调度、AltiVec支持有优化但如果你的目标是先看到系统起来用大家验证过的版本会更稳妥。代码拉取的命令没什么特别git clone https://github.com/u-boot/u-boot.git git clone https://github.com/torvalds/linux.git拉下来后checkout到指定版本cd linux git checkout v5.104.2 编译U-BOOT的完整命令与产物U-BOOT编译分三步make T2080RDB_defconfig make CROSS_COMPILEpowerpc-linux-gnu- -j8如果你的工具链前缀不是上面那个把CROSS_COMPILE替换成你自己的前缀注意末尾的连字符不能丢。第一次编译大概率会卡在缺少依赖上缺bison、flex、libssl-dev是家常便饭装齐再编译sudo apt install bison flex libssl-dev swig python3-dev编译完成后会在当前目录生成u-boot.bin同时还会有u-boot-with-spl.bin这类文件。T2080RDB从NOR启动时烧写的是u-boot.bin如果要从SD卡启动则需要根据板卡启动方式选择带SPL或不带SPL的镜像。这里要注意T2080的启动流程里有一个叫PBLPre-Boot Loader的机制它和RCW一起决定芯片上电后怎么初始化DDR、从哪里加载U-BOOT。这些内容我会在系列后续专门写一篇准备阶段你只要知道不是编译出一个u-boot.bin就万事大吉烧错位置或烧错镜像现象就是串口完全没输出。4.3 编译内核与设备树内核编译的命令也不复杂关键是要用对配置文件。make t2080rdb_defconfig make CROSS_COMPILEpowerpc-linux-gnu- -j8 uImage dtbs在PowerPC 32位平台上通常编译出的是uImage格式的内核镜像配合t2080rdb.dtb设备树文件使用。设备树在PowerPC平台上的作用甚至比ARM更重要因为e5500处理器直接挂在CCB上各种外设的中断、时钟、寄存器映射都靠设备树来描述。改错一个compatible字符串驱动就加载不上。这批编译产物在验证阶段主要放在TFTP目录里用等后续彻底稳定了再考虑烧写固化。注意用TFTP下载的内核和板载U-BOOT的版本没有强绑定关系只要U-BOOT支持bootm和fdt命令就行。这也是我坚持用官方主线U-BOOT的原因——命令集完整、文档多、遇到问题搜索成本低。5. 首次上电串口打印、U-BOOT命令行与网络验证5.1 上电前的检查清单环境都搭好了第一次上电必须谨慎。我在上电前会按下面这张清单过一遍缺一项都先不上电串口线已连接USB转串口芯片被主机识别终端已打开并处于等待状态。网线直连主机与板卡管理网口主机网卡手工配置为固定IP例如192.168.1.101/24。TFTP目录下已经放好编译出的uImage和t2080rdb.dtb文件名和后续命令保持一致。板卡拨码开关处于NOR启动位置确保出厂U-BOOT能先跑起来。电源线连接牢固供电电压正确不要用低功率适配器碰运气。确认完再按电源键。这一条我不能更强调了先开串口记录再上电。一旦板卡因为某种原因瞬间启动完又复位没有日志就等于什么都没发生。5.2 启动日志怎么看上电后串口终端里应该会看到类似下面这样一段日志不同批次U-BOOT打印细节有差异但大结构相似U-Boot 2015.01 (Jan ...) CPU0: T2080, Version: 1.0, (0x85350010) Core: E5500, Version: 2.0, (0x80240020) Clock Configuration: CPU:1800 MHz, CCB:600 MHz, DDR: 1333 MHz (MT/s) Board: T2080RDB, Sys ID: 0x2E, Sys Ver: 0x11 I2C: ready SPI: ready MMC: FSL_SDHC: 0 Net: FM1DTSEC1, FM1DTSEC2, FM1DTSEC3, FM1DTSEC4, FM2DTSEC9看到“U-Boot 2015.01”和“CPU0: T2080”这两行就说明芯片和U-BOOT基本工作正常。启动日志里值得重点关注的信息是CPU主频是否和预期一致、DDR频率是否在合理范围、网卡驱动有没有初始化成功。如果看到“DDR: 0 MiB (Failed)”或者卡在“DDR Clock”相关位置那大概率是DDR配置或硬件连接问题这类问题在后续移植中会经常遇到。等日志停住出现提示符就进入了U-BOOT命令行。这个提示符表示U-BOOT已经完全初始化完成等待你输入命令。这时先敲一个help确认命令列表正常然后再敲printenv看当前环境变量。5.3 用TFTP和NFS验证环境是否真正打通U-BOOT能进命令行只说明板卡自身基本健康。开发调试环境有没有真正打通还得靠网络引导来验证。我在首次上电后通常做两步验证。第一步在U-BOOT命令行走一下ping setenv ipaddr 192.168.1.10 setenv serverip 192.168.1.101 ping 192.168.1.101如果得到“host 192.168.1.101 is alive”说明板卡到主机的二层网络是通的。这步不通后面TFTP下载肯定失败先查网线、IP、防火墙。第二步用TFTP下载内核和设备树 tftp 0x10000000 t2080/uImage tftp 0x20000000 t2080/t2080rdb.dtb下载正常会显示文件大小和传输用时。下载完成后先不急着bootm因为内核启动还需要根文件系统。准备阶段更方便的做法是先配好NFS根文件系统再启动 setenv bootargs consolettyS0,115200 root/dev/nfs nfsroot192.168.1.101:/srv/t2080/rootfs,prototcp rw ipdhcp bootm 0x10000000 - 0x20000000bootm命令中两个地址之间的横杠表示“不加载ramdisk”。如果一切顺利Linux内核会打印启动日志最后出现类似Welcome to ...或登录提示符说明从U-BOOT到内核、从网络服务到根文件系统整条链路全部打通。到了这一步你的开发调试环境才算真正可用后续移植工作就有了一个可以随时验证的战场。6. 常见问题与排查技巧实录6.1 串口无输出、乱码串口没输出是第一次上电遇到最多的问题。先确认拨码在不在NOR启动位置再确认串口终端波特率然后确认线序。USB转串口线很坑如果板卡串口是DB9公头你又要一根DB9母头线公母不对、交叉线直连线不对都会导致没输出。乱码基本就是波特率不对。T2080RDB固定115200你在终端里设置成了9600或者57600打印出来必然是花屏。另外有些USB转串口芯片对高速波特率支持不好可以换一个芯片型号试试。串口问题基本就是这三种线、口、率按顺序排查十分钟内肯定能定位。6.2 网络不通、TFTP反复超时U-BOOT里ping不通主机先别怀疑板卡网口坏了绝大部分情况是主机防火墙问题或IP没配对。Ubuntu桌面版默认开UFW防火墙会拦掉TFTP的69端口和NFS的2049端口。最简单的做法在调试阶段先把防火墙关掉sudo ufw disable或者单独放行需要端口的规则。主机网卡要手工设置静态IP并且和板卡在同一网段。如果板卡是192.168.1.10主机必须是192.168.1.x不能是192.168.2.x。还有个小细节部分笔记本网卡会自动检测“无Internet访问”然后启用省电模式导致网口链路忽通忽断建议在网卡设置里把节能选项关掉。TFTP超时还有一个很隐蔽的原因——文件权限。tftpd-hpa默认以tftp用户权限运行如果你把镜像文件放到/srv/tftp但文件权限是600U-BOOT下载时就会一直停在“TFTP from server...”然后超时。给文件一个755权限即可chmod 755 /srv/tftp/t2080/uImage6.3 NFS根文件系统挂载失败NFS挂载失败的表现通常是内核启动到“VFS: Unable to mount root fs via NFS”就停下来。排查顺序先确认主机上/srv/t2080/rootfs目录真实存在且里面至少有最基础的/sbin/init或/bin/sh。再确认/etc/exports里的no_root_squash选项写没写没写的话开发板root用户无法写入文件很多程序跑不起来。检查内核命令行里的nfsroot路径、IP地址、网段是否匹配。最后看主机的NFS服务是否正常sudo systemctl status nfs-kernel-server。另外老一点的内核版本默认使用NFSv3协议如果主机NFS服务只支持NFSv4也会挂不上。此时可以在nfsroot参数后面加prototcp,nfsvers3强制指定版本。这一条我在老内核上踩过不止一次写在这里希望大家不要重复走弯路。6.4 JTAG与调试探针连接不上JTAG调试器在T2080这类平台上是高级工具常用于U-BOOT早期初始化阶段的调试因为那时候串口还没起来。但它的连接问题也最多。首先确认板卡已经上电、时钟正常、复位信号稳定然后检查JTAG排针的引脚方向方向插反轻则连不上重则烧接口最后确认调试探针软件里选择的芯片型号是T2080别选错成T1040。在准备阶段我不建议新手一上来就依赖JTAG。先用串口日志和U-BOOT命令行把问题定位清楚只有当问题发生在串口初始化之前才需要考虑JTAG。需要的时候手里有块官方TAP探针或者Lauterbach会更顺手OpenOCD虽然开源免费但对QorIQ平台的支持程度一般准备工作量不比商业方案少。最后分享一个我坚持了很多年的习惯每次上电之前先在终端里启动日志记录。不管是不是调试期日志文件都按日期保存文件名带上板卡编号和备注。这一步看起来蠢实际帮我在调RCW、DDR参数和内核启动时序的时候快速对比过不下十次差异。开发调试环境的意义不在于工具多高级而在于每一条信息都能被记录、被比较、被追溯。准备篇到这里主机侧、板卡侧、网络通路都已经打通下一篇我们就正式打开U-BOOT源码从T2080的复位配置字和PBL流程开始一步步拆硬件初始化。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门