ZYNQ FLASH+EMMC手动移植LINUX启动

本文介绍如何手动移植ZYNQ Linux至EMMC启动。主要内容包括u-boot的配置与修改、设备树调整、uEnv.txt的定制等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

虽可使用Petalinux进行移植,简单方便,但为了更清楚明白的了解整个流程,还是尝试了一波手动移植。

参考资料

ZYNQ Linux 移植:包含petalinux移植和手动移植debian9

ZYNQ #5 - 从vivado工程开始,从emmc启动Linux_里先森-CSDN博客

流程

对于手动移植,所需的文件为:

BOOT.bin(FSBL+fpga_bit文件+u_boot.elf)、uImage、devicetree.dtb、uEnv.txt、文件系统

文件放置位置说明:

FLASH:BOOT.bin(FSBL+fpga_bit文件+u_boot.elf)

EMMC:

第一个分区放置:uImage、devicetree.dtb、uEnv.txt

第二个分区放置:文件系统

启动流程为:板子设置为QSPI启动模式,FSBL执行调u-boot执行,u-boot根据uEnv.txt调EMMC分区1中的内核执行,内核最后跳到分区二中的文件系统。

FSBL、bit文件、uImage、文件系统都可复用SD卡移植模式下的内容:参考参考资料第一个链接。

本文章主要讲述的重点在于:u-boot、设备树、uEnv.txt的更改部分

板子主要信息说明:板子芯片:ZYNQ7035,板子的调试打印串口为PS0,板子上有SD卡(SD0)、EMMC(SD1),板子上有FLASH。其他外设不赘述。

u-boot移植说明:

1.下载u-boot源码:git clone [https://github.com/Xilinx/u-boot-xlnx.git](https://github.com/Xilinx/u-boot-xlnx.git)

NOTE:u-boot xilinx-v2018.3版本的zynq-common.h跟xilinx-v2018.1版本的不一样,这里检出v2018.1版本使用。

主要是CONFIG_EXTRA_ENV_SETTINGS 环境变量不一致。

默认的如下所示:

/* Default environment */
#ifndef CONFIG_EXTRA_ENV_SETTINGS
#define CONFIG_EXTRA_ENV_SETTINGS	\
	"ethaddr=00:0a:35:00:01:22\0"	\
	"kernel_image=uImage\0"	\
	"kernel_load_address=0x2080000\0" \
	"ramdisk_image=uramdisk.image.gz\0"	\
	"ramdisk_load_address=0x4000000\0"	\
	"devicetree_image=devicetree.dtb\0"	\
	"devicetree_load_address=0x2000000\0"	\
	"bitstream_image=system.bit.bin\0"	\
	"boot_image=BOOT.bin\0"	\
	"loadbit_addr=0x100000\0"	\
	"loadbootenv_addr=0x2000000\0" \
	"kernel_size=0x500000\0"	\
	"devicetree_size=0x20000\0"	\
	"ramdisk_size=0x5E0000\0"	\
	"boot_size=0xF00000\0"	\
	"fdt_high=0x20000000\0"	\
	"initrd_high=0x20000000\0"	\
	"bootenv=uEnv.txt\0" \
	"loadbootenv=load mmc 0 ${loadbootenv_addr} ${bootenv}\0" \
	"importbootenv=echo Importing environment from SD ...; " \
		"env import -t ${loadbootenv_addr} $filesize\0" \
	"sd_uEnvtxt_existence_test=test -e mmc 0 /uEnv.txt\0" \
	"preboot=if test $modeboot = sdboot && env run sd_uEnvtxt_existence_test; " \
			"then if env run loadbootenv; " \
				"then env run importbootenv; " \
			"fi; " \
		"fi; \0" \
	"mmc_loadbit=echo Loading bitstream from SD/MMC/eMMC to RAM.. && " \
		"mmcinfo && " \
		"load mmc 0 ${loadbit_addr} ${bitstream_image} && " \
		"fpga load 0 ${loadbit_addr} ${filesize}\0" \
	"norboot=echo Copying Linux from NOR flash to RAM... && " \
		"cp.b 0xE2100000 ${kernel_load_address} ${kernel_size} && " \
		"cp.b 0xE2600000 ${devicetree_load_address} ${devicetree_size} && " \
		"echo Copying ramdisk... && " \
		"cp.b 0xE2620000 ${ramdisk_load_address} ${ramdisk_size} && " \
		"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
	"qspiboot=echo Copying Linux from QSPI flash to RAM... && " \
		"sf probe 0 0 0 && " \
		"sf read ${kernel_load_address} 0x100000 ${kernel_size} && " \
		"sf read ${devicetree_load_address} 0x600000 ${devicetree_size} && " \
		"echo Copying ramdisk... && " \
		"sf read ${ramdisk_load_address} 0x620000 ${ramdisk_size} && " \
		"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
	"uenvboot=" \
		"if run loadbootenv; then " \
			"echo Loaded environment from ${bootenv}; " \
			"run importbootenv; " \
		"fi; " \
		"if test -n $uenvcmd; then " \
			"echo Running uenvcmd ...; " \
			"run uenvcmd; " \
		"fi\0" \
	"sdboot=if mmcinfo; then " \
			"run uenvboot; " \
			"echo Copying Linux from SD to RAM... && " \
			"load mmc 0 ${kernel_load_address} ${kernel_image} && " \
			"load mmc 0 ${devicetree_load_address} ${devicetree_image} && " \
			"load mmc 0 ${ramdisk_load_address} ${ramdisk_image} && " \
			"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}; " \
		"fi\0" \
	"usbboot=if usb start; then " \
			"run uenvboot; " \
			"echo Copying Linux from USB to RAM... && " \
			"load usb 0 ${kernel_load_address} ${kernel_image} && " \
			"load usb 0 ${devicetree_load_address} ${devicetree_image} && " \
			"load usb 0 ${ramdisk_load_address} ${ramdisk_image} && " \
			"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}; " \
		"fi\0" \
	"nandboot=echo Copying Linux from NAND flash to RAM... && " \
		"nand read ${kernel_load_address} 0x100000 ${kernel_size} && " \
		"nand read ${devicetree_load_address} 0x600000 ${devicetree_size} && " \
		"echo Copying ramdisk... && " \
		"nand read ${ramdisk_load_address} 0x620000 ${ramdisk_size} && " \
		"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
	"jtagboot=echo TFTPing Linux to RAM... && " \
		"tftpboot ${kernel_load_address} ${kernel_image} && " \
		"tftpboot ${devicetree_load_address} ${devicetree_image} && " \
		"tftpboot ${ramdisk_load_address} ${ramdisk_image} && " \
		"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
	"rsa_norboot=echo Copying Image from NOR flash to RAM... && " \
		"cp.b 0xE2100000 0x100000 ${boot_size} && " \
		"zynqrsa 0x100000 && " \
		"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
	"rsa_nandboot=echo Copying Image from NAND flash to RAM... && " \
		"nand read 0x100000 0x0 ${boot_size} && " \
		"zynqrsa 0x100000 && " \
		"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
	"rsa_qspiboot=echo Copying Image from QSPI flash to RAM... && " \
		"sf probe 0 0 0 && " \
		"sf read 0x100000 0x0 ${boot_size} && " \
		"zynqrsa 0x100000 && " \
		"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
	"rsa_sdboot=echo Copying Image from SD to RAM... && " \
		"load mmc 0 0x100000 ${boot_image} && " \
		"zynqrsa 0x100000 && " \
		"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
	"rsa_jtagboot=echo TFTPing Image to RAM... && " \
		"tftpboot 0x100000 ${boot_image} && " \
		"zynqrsa 0x100000 && " \
		"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
		DFU_ALT_INFO \
		BOOTENV
#endif

可以看到其上定义了一堆的东西及不同的启动指令。

不同的启动指令由#define CONFIG_BOOTCOMMAND指定。

这里想FLASH+EMMC启动,则可以选择sdboot,同时因为EMMC是SD1,所以上述的文件需要进行更改:更改uEnv.txt的存储位置为mmc 1;去掉sdboot中的ramdisk,及存储kernel、设备树位置为mmc 1;修改bootm参数。

"loadbootenv=load mmc 1 ${loadbootenv_addr} ${bootenv}\0" \
	"importbootenv=echo Importing environment from SD ...; " \
		"env import -t ${loadbootenv_addr} $filesize\0" \
	"sd_uEnvtxt_existence_test=test -e mmc 1 /uEnv.txt\0" \
"sdboot=if mmcinfo; then " \
			"run uenvboot; " \
			"echo Copying Linux from hahahah SD to RAM... && " \
			"load mmc 1 ${kernel_load_address} ${kernel_image} && " \
			"load mmc 1 ${devicetree_load_address} ${devicetree_image} && " \
			"bootm ${kernel_load_address} - ${devicetree_load_address}; " \
		"fi\0" \

上述命令的执行逻辑为:u-boot启动后,执行sdboot指令:

(1)装载uEnv.txt文件并运行;

(2)装载内核、设备树;

(3)运行;

2.由于是自己做的板子,则可以基于类似的板子defconfig进行修改适配u-boot:这里使用zynq_zed_defconfig文件:

(1)增加传统镜像文件支持:CONFIG_IMAGE_FORMAT_LEGACY=y

(2)因为已经知道是从EMMC启动相关文件,则可直接指定:CONFIG_BOOTCOMMAND="mmc dev 1;run sdboot"

mmc dev 1是为了避免u-boot死锁bug(移植petalinux中u-boot存在,为官方bug,这里加上,不知道有没有用);sdboot会直接调用执行zynq-common.h中的对应选项。

(3)因为板子上串口使用的是PS0,修改:CONFIG_DEBUG_UART_BASE=0xe0000000(地址可在设备树中查看)

文件参考:

CONFIG_ARM=y
CONFIG_ARCH_ZYNQ=y
CONFIG_SYS_TEXT_BASE=0x4000000
CONFIG_SPL_STACK_R_ADDR=0x200000
CONFIG_DEFAULT_DEVICE_TREE="zynq-zed"
CONFIG_DEBUG_UART=y
CONFIG_DISTRO_DEFAULTS=y
CONFIG_IMAGE_FORMAT_LEGACY=y
CONFIG_FIT=y
CONFIG_FIT_SIGNATURE=y
CONFIG_FIT_VERBOSE=y
CONFIG_BOOTCOMMAND="mmc dev 1;run sdboot"
# CONFIG_DISPLAY_CPUINFO is not set
CONFIG_SPL=y
CONFIG_SPL_STACK_R=y
CONFIG_SPL_OS_BOOT=y
CONFIG_SYS_PROMPT="Zynq> "
CONFIG_CMD_THOR_DOWNLOAD=y
CONFIG_CMD_DFU=y
# CONFIG_CMD_FLASH is not set
CONFIG_CMD_FPGA_LOADBP=y
CONFIG_CMD_FPGA_LOADFS=y
CONFIG_CMD_FPGA_LOADMK=y
CONFIG_CMD_FPGA_LOADP=y
CONFIG_CMD_GPIO=y
CONFIG_CMD_MMC=y
CONFIG_CMD_SF=y
CONFIG_CMD_USB=y
# CONFIG_CMD_SETEXPR is not set
CONFIG_CMD_TFTPPUT=y
CONFIG_CMD_CACHE=y
CONFIG_CMD_EXT4_WRITE=y
CONFIG_OF_EMBED=y
CONFIG_ENV_IS_IN_SPI_FLASH=y
CONFIG_NET_RANDOM_ETHADDR=y
CONFIG_SPL_DM_SEQ_ALIAS=y
CONFIG_DFU_MMC=y
CONFIG_DFU_RAM=y
CONFIG_FPGA_XILINX=y
CONFIG_DM_GPIO=y
CONFIG_MMC_SDHCI=y
CONFIG_MMC_SDHCI_ZYNQ=y
CONFIG_SPI_FLASH=y
CONFIG_SPI_FLASH_BAR=y
CONFIG_SF_DUAL_FLASH=y
CONFIG_SPI_FLASH_SPANSION=y
CONFIG_SPI_FLASH_STMICRO=y
CONFIG_SPI_FLASH_WINBOND=y
CONFIG_PHY_MARVELL=y
CONFIG_PHY_REALTEK=y
CONFIG_PHY_XILINX=y
CONFIG_ZYNQ_GEM=y
CONFIG_DEBUG_UART_ZYNQ=y
CONFIG_DEBUG_UART_BASE=0xe0000000
CONFIG_DEBUG_UART_CLOCK=50000000
CONFIG_ZYNQ_SERIAL=y
CONFIG_ZYNQ_QSPI=y
CONFIG_USB=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_ULPI_VIEWPORT=y
CONFIG_USB_ULPI=y
CONFIG_USB_STORAGE=y
CONFIG_USB_GADGET=y
CONFIG_USB_GADGET_MANUFACTURER="Xilinx"
CONFIG_USB_GADGET_VENDOR_NUM=0x03fd
CONFIG_USB_GADGET_PRODUCT_NUM=0x0300
CONFIG_CI_UDC=y
CONFIG_USB_GADGET_DOWNLOAD=y

3.修改u-boot的设备树:实际上u-boot也带了设备树,这里需要进行修改:

(1)修改uart为uart0;

(2)修改SD为mmc1;

(3)去除QSPI中的分区表;

文件参考:

/*
 * Xilinx ZED board DTS
 *
 *  Copyright (C) 2011 - 2015 Xilinx
 *  Copyright (C) 2012 National Instruments Corp.
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */
/dts-v1/;
#include "zynq-7000.dtsi"

/ {
	model = "Zynq Zed Development Board";
	compatible = "xlnx,zynq-zed", "xlnx,zynq-7000";

	aliases {
		ethernet0 = &gem0;
		serial0 = &uart0;
		spi0 = &qspi;
		mmc1 = &sdhci1;
	};

	memory@0 {
		device_type = "memory";
		reg = <0x0 0x20000000>;
	};

	chosen {
		bootargs = "";
		stdout-path = "serial0:115200n8";
	};

	usb_phy0: phy0@e0002000 {
		compatible = "ulpi-phy";
		#phy-cells = <0>;
		reg = <0xe0002000 0x1000>;
		view-port = <0x0170>;
		drv-vbus;
	};
};

&clkc {
	ps-clk-frequency = <33333333>;
};

&gem0 {
	status = "okay";
	phy-mode = "rgmii-id";
	phy-handle = <&ethernet_phy>;

	ethernet_phy: ethernet-phy@0 {
		reg = <0>;
		device_type = "ethernet-phy";
	};
};

&qspi {
	u-boot,dm-pre-reloc;
	status = "okay";
	is-dual = <0>;
	num-cs = <1>;
	flash@0 {
		compatible = "n25q128a11";
		reg = <0x0>;
		spi-tx-bus-width = <1>;
		spi-rx-bus-width = <4>;
		spi-max-frequency = <50000000>;
		#address-cells = <1>;
		#size-cells = <1>;

	};
};

&sdhci1 {
	u-boot,dm-pre-reloc;
	status = "okay";
};

&uart0 {
	u-boot,dm-pre-reloc;
	status = "okay";
};

&usb0 {
	status = "okay";
	dr_mode = "host";
	usb-phy = <&usb_phy0>;
};
  1. 编译u-boot:

清除中间编译:

make distclean

使用配置文件:

make CROSS_COMPILE=arm-linux-gnueabihf- zynq_zed_defconfig

通过下述指令可在界面中uboot进行进一步修改配置:改defconfig文件也可以,暂时默认即可

make CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

工具编译:

make CROSS_COMPILE=arm-linux-gnueabihf- tools

编译u-boot:

make CROSS_COMPILE=arm-linux-gnueabihf-

  1. 修改总设备树的boottags:console=ttyPS0,115200n8 root=/dev/mmcblk1p2 rw noinitrd rootfstype=ext4 rootwait

  2. 修改uEnv.txt为:mmc 0修改为mmc 1;root=/dev/mmcblk1p2

bootargs=console=ttyPS0,115200 root=/dev/mmcblk1p2 rw earlyprintk rootfstype=ext4 rootwait
load_image=fatload mmc 1 ${kernel_load_address} ${kernel_image} && fatload mmc 1 ${devicetree_load_address} ${devicetree_image}
uenvcmd=echo Copying Linux from SD to RAM... && mmcinfo &&  run load_image && bootm ${kernel_load_address} - ${devicetree_load_address}
  1. 组装BOOT.bin,不赘述。
  2. 烧录BOOT.bin到FLASH,对EMMC进行分区,EMMC分区一中放置uImage、devicetree.dtb、uEnv.txt,EMMC分区二中放置文件系统即可。
  3. 启动。
U-Boot 2018.01-dirty (Jul 26 2021 - 20:05:00 +0800)

Model: Zynq Zed Development Board
Board: Xilinx Zynq
Silicon: v3.1
DRAM:  ECC disabled 512 MiB
MMC:   sdhci_transfer_data: Error detected in status(0x208000)!
sdhci@e0101000: 1 (eMMC)
SF: Detected s25fl128s_64k with page size 256 Bytes, erase size 64 KiB, total 16 MiB
*** Warning - bad CRC, using default environment

In:    serial@e0000000
Out:   serial@e0000000
Err:   serial@e0000000
Net:   ZYNQ GEM: e000b000, phyaddr 0, interface rgmii-id
eth0: ethernet@e000b000
Hit any key to stop autoboot:  0 
sdhci_transfer_data: Error detected in status(0x208000)!
switch to partitions #0, OK
mmc1(part 0) is current device
Device: sdhci@e0101000
Manufacturer ID: 13
OEM: 14e
Name: Q2J55 
Tran Speed: 25000000
Rd Block Len: 512
MMC version 5.0
High Capacity: Yes
Capacity: 7.1 GiB
Bus Width: 4-bit
Erase Group Size: 512 KiB
HC WP Group Size: 8 MiB
User Capacity: 7.1 GiB WRREL
Boot Capacity: 16 MiB ENH
RPMB Capacity: 4 MiB ENH
reading uEnv.txt
356 bytes read in 11 ms (31.3 KiB/s)
Loaded environment from uEnv.txt
Importing environment from SD ...
Running uenvcmd ...
Copying Linux from SD to RAM...
Device: sdhci@e0101000
Manufacturer ID: 13
OEM: 14e
Name: Q2J55 
Tran Speed: 25000000
Rd Block Len: 512
MMC version 5.0
High Capacity: Yes
Capacity: 7.1 GiB
Bus Width: 4-bit
Erase Group Size: 512 KiB
HC WP Group Size: 8 MiB
User Capacity: 7.1 GiB WRREL
Boot Capacity: 16 MiB ENH
RPMB Capacity: 4 MiB ENH
reading uImage
4001616 bytes read in 377 ms (10.1 MiB/s)
reading devicetree.dtb
17052 bytes read in 18 ms (924.8 KiB/s)
## Booting kernel from Legacy Image at 02080000 ...
   Image Name:   Linux-4.14.0-xilinx
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    4001552 Bytes = 3.8 MiB
   Load Address: 00008000
   Entry Point:  00008000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 02000000
   Booting using the fdt blob at 0x2000000
   Loading Kernel Image ... OK
   Loading Device Tree to 1eb12000, end 1eb1929b ... OK

以上。

<think>好的,我现在需要帮助用户了解如何在Zynq-7020上固化VxWorks操作系统到SPI FlashEMMC。首先,我需要回忆相关的步骤和可能用到的工具。根据用户提供的引用,里面提到了生成BOOT.BIN和相关的ELF文件,这可能涉及到Petalinux和VxWorks的配置。 首先,固化到SPI Flash。用户提到的引用[1]是关于Linux环境下烧录BOOT.BIN到QSPI Flash启动,这可能与VxWorks的步骤类似。需要生成包含VxWorks镜像的启动文件,比如BOOT.BIN。可能需要配置FSBL(First Stage Bootloader)和VxWorks镜像,然后通过Vivado或Petalinux工具链生成启动镜像。之后,使用Flash编程工具将其烧录到SPI Flash。 然后是EMMC部分。EMMC通常作为存储设备,可能需要通过VxWorks的驱动来访问。可能需要将镜像写入EMMC分区,并配置启动参数。用户可能需要使用VxWorks的启动脚本或应用程序来完成这一步骤,或者通过U-Boot等引导程序来加载。 需要注意的是,VxWorks的启动流程可能与Linux不同,特别是在引导加载部分。可能需要参考Wind River提供的文档,确保生成的启动镜像符合Zynq-7020的启动要求。同时,SPI FlashEMMC的硬件连接是否正确配置在Vivado工程中,这会影响到驱动的可用性。 另外,用户提到的引用[2]中提到了生成zynq_vxworks_bootrom.elf,这可能与VxWorks的引导ROM相关。需要确认是否需要将bootrom和VxWorks镜像合并,或者通过其他方式配置启动顺序。可能需要使用特定的编译命令,如make clean和make目标来生成正确的文件。 接下来,可能需要分步骤说明:生成启动镜像、烧录到SPI Flash、烧录到EMMC,以及验证启动过程。每个步骤需要具体的命令和工具使用说明,比如在Vivado中配置硬件,使用SDK或XSCT工具进行烧录,或者使用VxWorks的dd命令写入EMMC。 同时,用户可能需要了解如何配置VxWorks的BSP(Board Support Package)以支持SPI FlashEMMC。这可能需要修改配置文件,确保相关驱动被正确编译进系统。此外,启动参数如BOOTADDR、BOOTDEVICE等也需要正确设置,确保系统能从指定设备启动。 在生成相关问题时,需要考虑用户可能遇到的常见问题,例如启动失败的原因、镜像格式是否正确、Flash驱动是否加载,以及如何调试启动过程。可能还需要涉及性能优化、不同存储介质的比较,以及如何备份和恢复系统镜像等。 最后,需要确保回答结构清晰,步骤明确,并且参考了用户提供的引用内容,正确标注引用标识。同时,检查是否有遗漏的步骤或潜在的误区,例如硬件配置错误或镜像生成参数不正确,导致启动失败的情况。</think>在Zynq-7020上固化VxWorks操作系统到SPI FLASHEMMC需要以下步骤: ### 1. 生成VxWorks启动镜像 #### 1.1 配置启动文件 - 需生成包含FSBL(First Stage Bootloader)、硬件比特流文件和VxWorks镜像的`BOOT.BIN`。 - 使用Vivado工具链配置硬件工程,确保QSPI FLASHEMMC控制器已正确连接[^1]。 - 通过VxWorks编译环境生成`vxWorks.elf`内核文件,例如: ```makefile make clean make zynq_vxworks_bootrom # 生成zynq_vxworks_bootrom.elf[^2] ``` #### 1.2 打包启动镜像 - 在Xilinx SDK中使用`bootgen`工具,通过`.bif`文件定义启动顺序: ``` // image.bif the_ROM_image: { [bootloader] fsbl.elf system.bit vxWorks.elf } ``` - 执行命令生成`BOOT.BIN`: ```bash bootgen -image image.bif -arch zynq -o BOOT.BIN ``` --- ### 2. 烧录到SPI FLASH #### 2.1 通过JTAG烧录 - 使用XSCT/XSDB工具连接开发板,执行Flash编程: ```tcl connect targets -set -filter {name =~ "ARM*#0"} rst -system dow BOOT.BIN program_flash -f BOOT.BIN -offset 0 -flash_type qspi_single ``` #### 2.2 通过U-Boot烧录 - 若已运行Linux/U-Boot,可使用`sf probe`和`sf write`命令: ```bash sf probe 0 # 初始化SPI FLASH sf erase 0x0 0x100000 # 擦除区域 sf write ${loadaddr} 0x0 ${filesize} ``` --- ### 3. 烧录到EMMC #### 3.1 分区与格式化 - 在VxWorks中加载EMMC驱动后,使用`fdisk`分区: ```c blkDevCreate("/blk/emmc", "emmc", 0); fdisk("/blk/emmc/0", 1); // 创建FAT32分区 ``` #### 3.2 写入镜像 - 将`BOOT.BIN`和`vxWorks.elf`拷贝到EMMC: ```bash copy "BOOT.BIN" "emmc0:/boot/" ``` #### 3.3 配置启动参数 - 在U-Boot或FSBL中设置启动路径: ```bash setenv bootcmd 'mmc dev 0; fatload mmc 0 0x800000 vxWorks.elf; bootelf 0x800000' saveenv ``` --- ### 4. 验证启动 - **SPI FLASH启动**:将启动模式跳线设置为QSPI模式,上电观察串口输出。 - **EMMC启动**:将启动模式设置为SD/EMMC模式,检查内核加载日志。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值