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

LS1046ARDB开发板启动与系统部署:从flex-installer自动化到U-Boot手动烧录

1. 项目概述与核心价值

拿到一块崭新的NXP Layerscape开发板,比如LS1046ARDB,第一件事是什么?没错,就是让它“活”起来,跑起一个可用的系统。这个过程,我们称之为“板卡启动与系统部署”。对于刚接触嵌入式开发的朋友,或者从其他平台(如树莓派、STM32)转过来的工程师,面对LS系列这种高性能、多核、网络功能强大的处理器,可能会觉得启动流程有些复杂。但别担心,NXP提供的Layerscape SDK(LSDK)已经为我们封装好了一套相当成熟的工具链和流程。

简单来说,LSDK就是NXP为Layerscape系列处理器量身定做的软件开发套件,它包含了U-Boot引导程序、Linux内核、根文件系统以及一系列驱动和中间件。而flex-installer则是这个套件里的“瑞士军刀”,一个自动化部署脚本,它能帮你从NXP服务器下载预编译好的镜像,并正确地烧录到SD卡或QSPI NOR Flash中。这套流程的技术价值在于,它将原本需要手动操作多个步骤(如下载镜像、分区、格式化、拷贝文件、配置启动参数等)的过程,简化为几条命令,极大地降低了入门门槛和出错概率,让开发者能快速将精力投入到应用开发本身。

本文将以LS1046ARDB开发板为例,手把手带你走通两种最常用的启动方式:SD卡启动和QSPI NOR Flash启动。我们会深入每个步骤背后的原理,解释为什么这么做,并分享我在实际调试中积累的避坑经验和技巧。无论你是嵌入式新手,还是想快速上手Layerscape平台的有经验工程师,这篇指南都能为你提供一条清晰的路径。

2. 启动介质选择与前期准备

在开始烧录之前,我们得先搞清楚两个核心概念:TinyDistro完整的LSDK发行版,以及两种主要的启动介质:SD卡QSPI NOR Flash

2.1 TinyDistro vs. 完整LSDK发行版

TinyDistro是一个极简的、预构建的RAM磁盘根文件系统。它被直接集成在开发板的固件镜像里,通常存储在板载的Flash中。你可以把它理解为一个“急救盘”或“最小化救援系统”。它的特点是体积小、启动快,但功能有限,不可定制。主要用途有两个:一是当你的主要启动介质(如SD卡)没有系统时,板子可以自动从Flash里的TinyDistro启动,给你一个基本的Linux环境;二是在这个环境里,你可以运行flex-installer等工具,去部署完整的系统到SD卡或另一个Flash Bank上。

完整的LSDK发行版则是功能齐全的Linux系统,包含了更丰富的软件包、开发工具和库。这是我们进行实际应用开发的主要环境。flex-installer工具部署的就是这个版本。

2.2 启动介质:SD卡 vs. QSPI NOR Flash

SD卡的优势是灵活、容量大、可重复擦写方便。特别适合在开发初期频繁更换系统、调试内核模块或进行原型验证。你可以准备多张SD卡,分别存放不同版本的系统。LS1046ARDB支持从SD卡启动。

QSPI NOR Flash是焊接在板载的存储芯片,速度更快,可靠性更高,更适合产品化或需要脱机运行的场景。LS1046ARDB板上有两颗QSPI Flash(Flash0和Flash1),通过拨码开关或CPLD命令可以切换启动源。通常,出厂固件或稳定版本会烧录在Flash0(默认启动),而我们把正在测试的新镜像烧录到Flash1,测试无误后再通过命令切换,这是一种安全的开发实践。

重要提示:在进行任何烧录操作前,请务必备份SD卡或Flash中原有的重要数据。flex-installer和U-Boot的写命令会完全覆盖目标存储设备上的所有数据。

2.3 硬件与网络准备

  1. 硬件连接

    • 通过USB转串口线连接开发板的调试串口(通常是UART1)到你的PC。在Linux上常用minicomscreen,Windows上常用PuttyMobaXterm。串口参数通常为115200 8N1。
    • 连接网线。为了使用TFTP或让TinyDistro下载flex-installer,开发板需要能访问互联网。你可以将开发板连接到与主机同一局域网的路由器下,或者直接使用交叉网线连接到主机(并配置主机网络共享)。
    • 准备一张容量至少为8GB的Micro SD卡和一个读卡器。
  2. 确定存储设备名(在Linux主机上操作): 插入SD卡到读卡器并连接到Linux主机。打开终端,在插入前后分别执行lsblkcat /proc/partitions命令,新增的设备就是你的SD卡。请务必确认设备名,例如/dev/sdb。如果主机有内置SD读卡器,设备名可能是/dev/mmcblk0

    # 插入SD卡前 $ lsblk # 插入SD卡后,再次执行,观察新增的设备,例如 /dev/sdb 和 /dev/sdb1 $ lsblk

    警告:后续命令中的<device>参数(如/dev/sdb)必须指向整个磁盘设备,而不是某个分区(如/dev/sdb1)。错误的选择会导致主机其他磁盘数据丢失。

3. 方法一:在Linux主机上使用flex-installer自动化部署

这是最推荐给新手的“一键部署”方法。整个过程在你的Linux开发主机上完成,无需预先在板子上运行任何系统。

3.1 下载并安装flex-installer

首先,我们需要在Linux主机上获取这个自动化工具。NXP将其托管在官方网站上。

$ wget https://www.nxp.com/lgfiles/sdk/lsdk2004-update-290520/flex-installer $ chmod +x flex-installer $ sudo mv flex-installer /usr/bin/

chmod +x赋予脚本可执行权限,sudo mv将其移动到系统路径下,方便在任何目录直接调用。

3.2 执行自动化部署命令

现在,使用flex-installer命令,指定模型和存储设备,开始自动下载和烧录。

$ sudo flex-installer -i auto -m ls1046ardb -d /dev/sdb

我们来拆解这个命令:

  • -i auto: 告诉工具自动从NXP服务器下载默认的镜像包。镜像包通常包含两个文件:bootpartition_LS_arm64_lts_4.19.tgz(内核与设备树)和rootfs_lsdk2004_LS_arm64_main.tgz(根文件系统)。
  • -m ls1046ardb: 指定目标板型号为LS1046ARDB。工具会根据型号选择正确的内核配置和设备树。
  • -d /dev/sdb: 指定目标存储设备。请务必替换/dev/sdb为你上一步确认的实际设备名。

执行命令后,flex-installer会依次完成以下工作:

  1. 对SD卡进行分区(通常会创建两个分区:一个FAT格式的boot分区和一个ext4格式的rootfs分区)。
  2. 从NXP服务器下载指定的镜像压缩包。
  3. 解压bootpartition包的内容到boot分区。
  4. 解压rootfs包的内容到rootfs分区。
  5. 安装并配置U-Boot引导程序到SD卡的特定扇区。

整个过程需要几分钟,取决于你的网速和SD卡速度。完成后,终端会显示成功信息。

3.3 配置开发板并从SD卡启动

  1. 安全移除SD卡:在主机上执行sudo umount /dev/sdb*确保所有分区卸载,然后拔出SD卡,插入开发板的SD卡槽。
  2. 设置启动开关:参考LS1046ARDB的板级手册,将启动模式拨码开关设置为从SD卡启动。对于LS1046ARDB,通常需要设置SW3[1:8]=01000110, SW4[1:8]=00111011, SW5[1:8]=00100000(0代表OFF,1代表ON)。这个步骤极其重要,开关设错会导致无法启动。
  3. 上电启动:给开发板上电,通过串口终端观察启动日志。你应该能看到U-Boot的启动信息,随后Linux内核开始加载,最终进入LSDK发行版的登录界面。
  4. 登录系统:使用默认用户名和密码登录。通常是root/rootuser/user

至此,你已经成功通过SD卡启动了完整的LSDK系统。这是最快捷的上手方式。

4. 方法二:在开发板上通过TinyDistro部署

如果你的开发板已经能从一个基本的介质(如默认的QSPI Flash0)启动到TinyDistro,或者SD卡启动失败需要修复,你可以直接在板子上进行操作。这种方法适合网络环境好,或者需要直接部署到板载Flash的场景。

4.1 启动至TinyDistro环境

  1. 确保开发板启动开关设置为从QSPI NOR Flash(默认Bank 0)启动。
  2. 上电,在U-Boot倒计时阶段快速按下任意键,中断自动启动,进入U-Boot命令行提示符=>
  3. 在U-Boot中,运行启动TinyDistro的命令。对于LS1046ARDB,命令是:
    => run qspi_bootcmd
    这个命令会从Flash中加载TinyDistro这个微型根文件系统到内存并执行。稍等片刻,串口终端会出现TinyDistro的登录提示。
  4. 使用root用户登录(密码通常也是root)。

4.2 配置网络并下载flex-installer

TinyDistro是一个极简系统,我们需要先配置网络,然后下载flex-installer

  1. 配置网络(以动态获取IP为例,假设网口名为eth0):
    $ udhcpc -i eth0
    如果udhcpc不可用,可以尝试用ifconfig手动配置:
    $ ifconfig eth0 192.168.1.100 netmask 255.255.255.0 up $ route add default gw 192.168.1.1
    使用ping命令测试网络是否连通。
  2. 下载flex-installer
    $ wget https://www.nxp.com/lgfiles/sdk/lsdk2004-update-290520/flex-installer $ chmod +x flex-installer $ mv flex-installer /usr/bin/

    注意:TinyDistro的/usr/bin目录可能是只读的。如果mv命令失败,可以将flex-installer放在当前目录(如/tmp)或/home/root下,然后通过./flex-installer来执行。

4.3 部署镜像到目标存储设备

现在,我们可以在TinyDistro环境下,将LSDK镜像部署到另一个存储设备上,例如一张新的SD卡或者另一个QSPI Flash Bank(Flash1)。

场景A:部署到SD卡

  1. 将空白SD卡插入开发板的SD卡槽。
  2. 在TinyDistro中,使用cat /proc/partitions查看设备名。SD卡在开发板Linux系统中通常被识别为/dev/mmcblk0/dev/mmcblk1(取决于插槽)。请仔细核对大小。
  3. 执行部署命令:
    $ flex-installer -i auto -m ls1046ardb -d /dev/mmcblk0
    这里的设备名是整个SD卡设备(如/dev/mmcblk0),而不是分区(如/dev/mmcblk0p1)。

场景B:部署到QSPI NOR Flash1(备用Bank)如果你想更新或测试新镜像到Flash1,命令类似,但设备名不同。QSPI Flash通常被映射为MTD设备。

  1. 首先,需要确认Flash1对应的MTD设备号。在TinyDistro中执行cat /proc/mtd查看。通常,Flash0是mtd0,Flash1是mtd1mtd4(具体取决于CPLD映射,U-Boot日志中会显示vBank)。

  2. 部署命令需要指定MTD设备,并且flex-installer可能对直接写Flash有特定支持或限制。更常见的做法是,在U-Boot环境下使用tftpsf命令来烧写Flash,这将在下一节详细说明。

  3. 部署完成后,关闭开发板电源,调整启动开关。

    • 如果部署到SD卡,将开关设为SD卡启动模式,然后上电。
    • 如果部署到Flash1,需要通过U-Boot命令cpld reset altbank切换启动Bank,或者调整拨码开关(如果支持),然后上电。

5. 手动烧录固件镜像与U-Boot操作详解

虽然flex-installer很方便,但理解其背后的手动流程对于深度调试和解决复杂问题至关重要。例如,你可能需要烧写一个特定的、非默认的固件镜像,或者修复损坏的启动引导。

5.1 固件镜像是什么?

这里提到的“LSDK composite firmware image”(复合固件镜像)是一个打包好的文件(如firmware_ls1046ardb_uboot_qspiboot.img),它内部包含了U-Boot、RCW(复位配置字)、PPA(平台安全固件)、设备树和TinyDistro等组件。烧录这个镜像相当于一次性把板子从硬件上电到进入最小系统所需的所有代码都写进去了。

5.2 通过U-Boot和TFTP烧录QSPI NOR Flash

这是最经典和强大的烧录方式,需要你的开发主机搭建一个TFTP服务器。

步骤1:准备TFTP服务器和镜像

  1. 在Linux主机上安装并配置TFTP服务器(如tftpd-hpa),设置好共享目录(例如/var/lib/tftpboot)。
  2. 将下载好的固件镜像(如firmware_ls1046ardb_uboot_qspiboot.img)放入TFTP共享目录。
  3. 确保主机防火墙开放TFTP端口(69),并且开发板与主机在同一网段,能互相ping通。

步骤2:在U-Boot中下载并烧写镜像

  1. 启动开发板至U-Boot命令行。
  2. 配置U-Boot的网络环境变量(通常只需一次,或已预设):
    => setenv serverip 192.168.1.xxx # 你的TFTP服务器IP => setenv ipaddr 192.168.1.yyy # 开发板的IP地址 => saveenv # 保存设置
  3. 使用TFTP命令将镜像加载到开发板的内存(DDR)中。$load_addr是一个预定义的环境变量,代表加载地址。
    => tftp $load_addr firmware_ls1046ardb_uboot_qspiboot.img
    如果成功,会显示传输的字节数。
  4. 擦除并编程QSPI NOR Flash。这里以编程到Flash1(altbank)为例,这是安全做法,避免破坏默认的Flash0。
    => sf probe 0:1 # 探测并初始化SPI Flash,0:1通常代表CS1上的Flash(即Flash1) => sf erase 0 +$filesize # 从Flash地址0开始,擦除$filesize大小的区域($filesize是上一步tftp加载的文件大小) => sf write $load_addr 0 $filesize # 将内存$load_addr处的数据,写入Flash地址0开始的位置,写入大小为$filesize
    命令解析
    • sf probe 0:1:sf是SPI Flash命令。0代表SPI控制器索引,1代表芯片选择(Chip Select)。对于LS1046ARDB的双Flash设计,0:0通常对应vBank 0(默认启动),0:10:4对应vBank 4(备用Bank)。具体映射需参考板级文档或U-Boot启动日志。
    • sf erase 0 +$filesize:0是起始偏移,+$filesize表示擦除的大小等于文件大小。
    • sf write $load_addr 0 $filesize: 将内存中的数据写入Flash。

步骤3:切换启动Bank并测试

  1. 烧写完成后,使用CPLD命令切换到刚烧写的Flash1启动:
    => cpld reset altbank
  2. 开发板会复位,并从Flash1启动。如果看到U-Boot日志显示boot from QSPI vBank 4,并且能成功进入TinyDistro或LSDK,说明烧录成功。

5.3 通过U-Boot烧录SD卡镜像

烧录SD卡镜像到SD卡的过程类似,但目标设备是MMC/SD控制器。

  1. 将SD卡插入开发板。
  2. 在U-Boot中,通过TFTP或从其他介质(如USB)加载SD卡启动镜像firmware_ls1046ardb_uboot_sdboot.img到内存。
    => tftp $load_addr firmware_ls1046ardb_uboot_sdboot.img
  3. 使用mmc write命令将镜像写入SD卡。这个命令的参数格式是mmc write <内存地址> <SD卡块号> <块数量>
    => mmc dev 0 # 选择SD卡设备(通常是设备0) => mmc write $load_addr 8 1f000 # 从SD卡的第8个块开始,写入0x1f000个块
    关键点81f000(十六进制,即126976个块)这些数字是针对特定镜像和SD卡布局的硬编码值,来源于NXP的镜像设计。它确保了U-Boot被写入SD卡的引导扇区,而不会破坏后面的分区。不要随意更改这些值,除非你明确知道自己在做什么。
  4. 写入完成后,设置拨码开关为SD卡启动模式,然后复位或重新上电。
    => cpld reset sd

6. 核心原理深度解析:从硬件上电到系统登录

了解了“怎么做”之后,我们深入看看“为什么”。LS1046A的启动链是一个精密的协作过程。

6.1 启动链(Boot Chain)剖析

  1. ROM Code:芯片上电后,首先运行固化在内部ROM中的一小段代码。它的职责非常有限:根据引脚(Boot Config)或fuse的配置,确定从哪里(QSPI, SD, eMMC等)加载下一阶段的代码。
  2. RCW (Reset Configuration Word):这是由ROM Code加载的第一个重要数据结构。它不是一个可执行程序,而是一组配置字,定义了SerDes(串行器/解串器)通道协议、时钟配置、DDR控制器初始化参数、外设映射等核心硬件设置。可以把它看作主板的“BIOS设置”。RCW通常存储在Flash的起始位置。
  3. BL2 (Bootloader Stage 2) / PBL (Pre-Boot Loader):在LS1046A的Trust Architecture启动流程中,ROM Code之后会加载并运行BL2。BL2负责初始化更复杂的安全硬件,并加载验证下一阶段的镜像。
  4. U-Boot SPL (Secondary Program Loader):一个精简的U-Boot,负责初始化DDR内存等关键外设,然后从存储设备加载完整的U-Boot。
  5. U-Boot (Das U-Boot):全功能的引导加载程序。它进一步初始化硬件,读取环境变量,根据预设的bootcmd从存储设备(SD卡、Flash、网络等)加载Linux内核镜像(Image)和设备树二进制文件(fsl-ls1046a-rdb.dtb),并传递启动参数(bootargs),最后将控制权交给内核。
  6. Linux Kernel:内核解压并启动,根据设备树信息探测和初始化CPU、内存、各种控制器和外设。
  7. 根文件系统 (Root Filesystem):内核最后会挂载根文件系统(/)。flex-installer部署的rootfs就是一个包含BusyBox、Glibc、系统工具和库的完整Linux用户空间。内核启动第一个用户进程(通常是/sbin/init),系统完成启动,呈现登录提示。

flex-installer所做的工作,就是精心准备第5步和第7步所需的内容:一个包含了正确U-Boot、内核、设备树的boot分区,以及一个完整的rootfs分区,并确保U-Boot被正确安装到存储介质的引导区。

6.2 RCW与设备树的关键作用

  • RCW:决定了物理层的连接。例如,它告诉SerDes模块,某个Lane是配置为PCIe、SGMII还是XFI。如果RCW配置错误,即使Linux驱动正确,网口或PCIe设备也无法被硬件识别。
  • 设备树 (Device Tree Blob, .dtb):描述了硬件的拓扑结构。它告诉Linux内核,板上有什么设备(如哪个I2C控制器上挂了什么设备,哪个GPIO控制LED),以及它们的地址、中断号等。对于LS1046ARDB,flex-installer会根据-m ls1046ardb参数选择对应的设备树文件。

6.3 Flex-installer的工作流程揭秘

当我们执行flex-installer -i auto -m ls1046ardb -d /dev/sdb时,它背后执行了以下关键操作:

  1. 分区:使用sfdiskparted/dev/sdb进行重新分区。典型布局是:第1个分区(FAT32,用于boot)和第2个分区(ext4,用于rootfs)。
  2. 下载与解压:从NXP服务器获取bootpartitionrootfs的tgz包并解压。
  3. 部署Boot分区:将解压出的Image(内核)、*.dtb(设备树)、可能还有ramdisk等文件拷贝到第1个分区(挂载点为/mnt/boot)。
  4. 部署Rootfs分区:将根文件系统的全部内容解压到第2个分区(挂载点为/mnt/rootfs)。
  5. 安装U-Boot:这是最关键的一步。它使用dd命令,将U-Boot镜像(可能是u-boot.binu-boot-with-spl.bin)写入SD卡最开始的、不被分区表覆盖的预留扇区(例如,从第8个扇区开始)。这就是为什么手动mmc write时起始块号是8的原因。
  6. 配置引导:它可能会更新/mnt/boot分区下的U-Boot环境脚本或extlinux.conf,设置正确的启动参数(如console=ttyS0,115200 root=/dev/mmcblk0p2)。

7. 实战问题排查与经验技巧

理论很完美,实践常踩坑。下面是我在多次部署中总结的常见问题与解决方法。

7.1 常见问题速查表

问题现象可能原因排查步骤与解决方案
串口无任何输出1. 电源未接通或电压不对。
2. 串口线连接错误或串口软件配置错误(波特率115200, 8N1, 无流控)。
3. 启动开关设置错误,板子未从预期介质启动。
4. 核心板或DDR故障。
1. 检查电源指示灯,测量核心电压。
2. 确认TX/RX线序正确,尝试更换串口软件或USB转串口工具。
3.反复核对拨码开关设置,参考板级手册确认。
4. 尝试其他已知好的启动介质(如原厂SD卡)。
U-Boot能启动,但无法加载内核(卡在## Booting kernel from FIT Image...或提示找不到文件)1. SD卡或Flash中的boot分区内容损坏或缺失。
2. 设备树文件名不匹配或位置错误。
3. U-Boot环境变量bootcmdbootargs设置错误。
1. 在U-Boot中尝试手动加载文件:=> load mmc 0:1 $kernel_addr_r Image,看是否成功。
2. 检查boot分区下是否有正确的.dtb文件,并确认U-Boot的fdtfile变量指向它。
3. 在U-Boot中打印并检查printenv bootcmd bootargs
内核Panic,提示VFS: Unable to mount root fs根文件系统挂载失败。原因可能是:
1.root=参数指定的设备错误(如/dev/mmcblk0p2写成了/dev/mmcblk0p1)。
2. 根文件系统分区损坏或格式不被内核支持(如内核未编译ext4支持)。
3. SD卡接触不良。
1. 在U-Boot中检查bootargs中的root=参数。
2. 将SD卡插回Linux主机,检查第二个分区是否正常,能否挂载。
3. 重新使用flex-installer部署一次,或尝试手动解压rootfs tgz包:sudo tar -xzf rootfs_lsdk2004_LS_arm64_main.tgz -C /mnt/rootfs
flex-installer执行失败,提示下载错误或分区失败1. 网络问题,无法连接到NXP服务器。
2. 指定的设备名(-d)错误,或该设备正在被系统挂载使用。
3. 权限不足,未使用sudo
1. 尝试ping www.nxp.com,或使用代理。
2.再次用lsblk确认设备名,并确保所有分区已卸载(sudo umount /dev/sdb*)。
3. 确保以root权限运行。
从SD卡启动正常,但从QSPI Flash启动失败1. Flash中的镜像损坏或版本不匹配。
2. 烧写Flash时地址或大小错误。
3. CPLD切换命令或拨码开关未正确切换到目标Flash Bank。
1. 在U-Boot中使用sf probesf read命令读取Flash内容,与原始镜像对比。
2.仔细核对sf erase/write命令的地址和大小,确保与镜像文件大小($filesize)一致。
3. 执行cpld reset altbank后,观察U-Boot启动第一行是否显示boot from QSPI vBank 4
网络接口在LSDK中无法识别或无法获取IP1. RCW中SerDes协议配置与物理连接不匹配(例如,板子连接了SGMII PHY,但RCW配置为XFI)。
2. 内核中对应的网络驱动未编译或未加载。
3. 设备树中网络节点状态被禁用(status = “disabled”)。
1. 检查硬件连接和RCW配置。这是最复杂的问题,需要对照原理图和RCW源码。
2. 在LSDK中执行dmesg | grep -i ethernetifconfig -a查看内核是否识别到网卡。
3. 检查设备树源文件中对应ethernet节点的状态。

7.2 独家实操心得与技巧

  1. “三核对”原则:在进行任何破坏性操作(如flex-installer -dsf erasemmc write)前,必须核对三遍:设备名板卡型号-m参数)、启动开关状态。这是避免“砖化”板子的最重要习惯。

  2. 善用U-Boot的命令行:U-Boot是一个强大的调试环境。除了tftpsf,这些命令非常有用:

    • mmc list/mmc info: 查看SD卡设备信息。
    • sf probe/sf info: 探测和显示Flash信息。
    • fatls mmc 0:1/ext4ls mmc 0:2: 列出SD卡分区上的文件,确认镜像是否部署成功。
    • md(memory display): 显示内存内容,用于校验下载的数据。
    • setenv/saveenv: 修改和保存环境变量。例如,可以临时修改bootcmd来测试不同的启动参数。
  3. 备份与恢复策略

    • 备份好的Flash:在成功烧录一个稳定的QSPI Flash镜像后,可以通过U-Boot命令将其读出来备份:=> sf read $load_addr 0 $filesize; tftp $load_addr backup_firmware.img $filesize。这样在实验失败后可以快速恢复。
    • 使用Flash1作为实验区:始终坚持将新镜像烧录到Flash1(altbank),用Flash0作为稳定备份。通过cpld reset altbank切换测试,不行就cpld reset切回来。
  4. 网络加载调试法:当存储介质上的系统损坏时,可以通过网络直接启动内核和根文件系统进行急救。

    • 在U-Boot中设置好网络,通过TFTP加载内核和设备树:
      => tftp $kernel_addr_r Image => tftp $fdt_addr_r fsl-ls1046a-rdb.dtb
    • 可以通过NFS挂载根文件系统:=> setenv bootargs console=ttyS0,115200 root=/dev/nfs ip=dhcp nfsroot=<server_ip>:/path/to/nfs/root,tcp,v3
    • 最后用booti $kernel_addr_r - $fdt_addr_r启动。这能帮你判断是内核问题还是根文件系统问题。
  5. 理解mmc write的块操作mmc write $load_addr 8 1f000中的81f000是十六进制块数。SD卡通常一个块是512字节。所以,这个命令是从SD卡的第8 * 512 = 4096字节(即4KB偏移)开始,写入0x1f000 * 512 = 126,976 * 512 ≈ 65MB的数据。这个偏移是为了避开MBR和可能的其他引导信息。如果你自己编译U-Boot,需要根据生成的u-boot-with-spl.bin的实际大小和布局来调整这个命令。

  6. 关注LSDK版本:本文基于LSDK 20.04版本。NXP会持续更新LSDK,镜像下载链接、默认内核版本(如lts_4.19vslts_5.4)、甚至flex-installer的选项可能会变。操作前,最好去NXP官方社区或GitHub查看对应板卡和SDK版本的最新文档。

http://www.jsqmd.com/news/1076850/

相关文章:

  • NXP RW61x Wi-Fi与蓝牙开发实战:从SDK演示到物联网产品化
  • 6种落地级大模型推理优化方案:降本增效实战指南
  • sklearn LinearRegression实战:从销量预测到工业监控的12个关键细节
  • 专注实操落地的短视频获客培训机构,教你高效引流拓客技巧
  • 正规的地牛神奇垫供应商哪家强
  • 告别蜗牛下载:开源网盘助手让你重获极速下载体验
  • Sunshine游戏串流服务器:如何将旧PC变身高性能游戏云端
  • 迭代函数系统平稳测度的可微性与矩条件分析
  • 阴阳师自动化脚本终极指南:如何彻底解放双手,实现游戏时间自由
  • 电子小白:光耦到底是什么?
  • 基于森林与质心分解的图稀疏性判定算法详解
  • 3步掌握窗口自由:从新手到专家的WindowResizer完整指南
  • 【毕业设计】基于 Django+Vue 的情绪健康互助交流管理系统设计与实现 基于 Django+Vue 的双相情感知识科普交流平台(源码+文档+远程调试,全bao定制等)
  • 反向传播实战指南:从梯度爆炸到Grad-CAM的深度解析
  • Potplayer播放云盘视频终极指南:免费实现百度、迅雷、阿里云盘高清播放
  • 国内靠谱的健身房推雪橇毯厂商哪家靠谱
  • 【编号331】(安徽省)池州市基础地理矢量数据
  • 【小白向】多功能全能数字员工,虾壳云一键部署 OpenClaw v2.7.9 极简落地实操(最新安装包)
  • 「2026实测」直击Turnitin算法:英文毕业论文AI率97%降至8%的实操手册
  • PVE Tools终极指南:10分钟搞定Proxmox VE复杂配置的完整工具箱
  • Roblox帧率解锁终极指南:如何突破60FPS限制获得更流畅游戏体验
  • TikTok 东南亚新规
  • NAATI认证翻译件去哪办?NAATI认证翻译件怎么办理?
  • 基于魔珐星云数字人平台的职场顾问全双工语音交互系统实践
  • 广东精密机械设备公司10位工程师如何共用SolidWorks主机流畅设计
  • 基于 Quarto构建的互动式小学二年级数学下互动课件
  • 计算机毕业设计之基于ssm的冰淇淋在线购买网站
  • OpenRath:Session让Agent运行时状态可分支可重放
  • 5分钟快速掌握通达信缠论插件完整配置实战指南
  • 上海木门定制行业格局重塑:2025-2026年头部厂家解析与选型指南