Jetson Orin Nano Super Developer Kit connected to host laptop via USB-C for flashing with terminal showing flash.sh progress
jetsonorinyoctoflashorin-nano-supernvmeemmcembedded linux

Flashing a custom Yocto image to Jetson Orin Nano Super — NVMe and eMMC

Andres Campos ·

Flashing a custom Yocto image to Jetson Orin Nano Super involves a few specific choices around MACHINE name, storage target, and flash.sh flags that trip up engineers coming from other Jetson platforms. The Orin Nano Super uses the same MACHINE as the original Orin Nano in meta-tegra, the devkit has NVMe as primary storage (not eMMC), and the rootfs must be a compatible .ext4 image built with the scarthgap branch of meta-tegra.

Key Insights

  • MACHINE = jetson-orin-nano-devkit-nvme for the standard Orin Nano Super devkit setup with NVMe rootfs
  • scarthgap branch of meta-tegra is required — JP 6.2+ / L4T R36.x; do not use the kirkstone branch
  • flash.sh needs sudo and the L4T host tools — install from the BSP tarball or via SDK Manager; the Yocto build does not produce flash.sh
  • BOOTDEV_ROOTFS in the Yocto build controls which storage device the rootfs goes to — set to nvme0n1 for NVMe
  • First flash must be done via USB-C recovery mode — subsequent rootfs updates can use ota-update or A/B partition switching, but the initial flash requires recovery mode

Prerequisites

# Host requirements (Ubuntu 20.04 or 22.04 x86_64)
apt install -y python3 python3-distutils abootimg simg2img \
    libxml2-utils xxd img2simg bc cpp dtc

# Download L4T R36.x BSP (host tools for flash.sh)
# From developer.nvidia.com/embedded/jetson-linux
tar xf Jetson_Linux_R36.x.0_aarch64.tbz2   # extracts Linux_for_Tegra/

# Download rootfs tarball (only if not using custom Yocto image)
# tar xf Tegra_Linux_Sample-Root-Filesystem_R36.x.0_aarch64.tbz2 \
#     -C Linux_for_Tegra/rootfs/

Building the Yocto image for Orin Nano Super

# Clone tegra-demo-distro (includes meta-tegra as submodule)
git clone https://github.com/OE4T/tegra-demo-distro
cd tegra-demo-distro
git checkout scarthgap        # JetPack 6.x branch
git submodule update --init

# Set up build environment for Orin Nano NVMe
. ./setup-env --machine jetson-orin-nano-devkit-nvme

# Build the image
bitbake demo-image-full       # or your custom image

# Output: build/tmp/deploy/images/jetson-orin-nano-devkit-nvme/
# Key files:
# - demo-image-full-jetson-orin-nano-devkit-nvme.ext4   ← rootfs
# - tegra234-p3767-0000-p3768-0000-orin.dtb             ← device tree
# - Image                                                ← kernel

Flashing to NVMe (standard devkit setup)

cd Linux_for_Tegra/

# Put Orin Nano into recovery mode:
# 1. Power off
# 2. Hold Force Recovery button (button near USB-C port)
# 3. Apply power (or press Reset while holding Force Recovery)
# 4. Release Force Recovery after 2 seconds

# Verify device is in recovery mode
lsusb | grep NVIDIA
# Bus 001 Device XXX: ID 0955:7523 NVIDIA Corp. APX

# Copy Yocto rootfs image to Linux_for_Tegra/rootfs
sudo mount -o loop \
    ../build/tmp/deploy/images/jetson-orin-nano-devkit-nvme/demo-image-full-jetson-orin-nano-devkit-nvme.ext4 \
    /mnt/rootfs_tmp
sudo rsync -a /mnt/rootfs_tmp/ rootfs/
sudo umount /mnt/rootfs_tmp

# Run apply_binaries.sh to inject NVIDIA binaries into rootfs
sudo ./apply_binaries.sh

# Flash to NVMe
sudo ./flash.sh jetson-orin-nano-devkit-nvme nvme0n1p1

Faster: direct .ext4 image flash

For repeated development flashes, use the --direct-block-device method to write the rootfs image directly without rsync:

# Generate the flash package (does not actually flash)
sudo ./flash.sh --no-flash jetson-orin-nano-devkit-nvme nvme0n1p1

# The prepared package is in mnt/
# Now flash with your Yocto rootfs directly
sudo ./flash.sh \
    --no-root-check \
    -r \           # reuse existing package (skip re-preparation)
    -k APP \       # update only the rootfs partition
    --image ../build/tmp/deploy/images/jetson-orin-nano-devkit-nvme/demo-image-full-jetson-orin-nano-devkit-nvme.ext4 \
    jetson-orin-nano-devkit-nvme nvme0n1p1

The -k APP flag flashes only the rootfs partition, skipping bootloader/UEFI re-flash. This takes 3-4 minutes instead of 8-10 for a full flash.

Partition layout verification

# After flashing and booting, verify partition layout
lsblk
# nvme0n1
# ├─nvme0n1p1   ← rootfs (APP partition)
# └─nvme0n1p2   ← var

# Check rootfs is mounted
df -h /
# /dev/nvme0n1p1  xxx G  xxx G  xxx G  xx% /

# Verify L4T version
cat /etc/nv_tegra_release
# # R36 (release), REVISION: 4.0 ...

Troubleshooting common flash failures

ErrorCauseFix
No NVIDIA device foundNot in recovery modeHold Force Recovery, power cycle
Partition APP not foundWrong MACHINE nameUse jetson-orin-nano-devkit-nvme not jetson-orin-nano-devkit
Error: NVMe device not detectedNVMe not installed in M.2 slotInsert NVMe SSD before flashing
apply_binaries.sh: rootfs not extractedSkipped rootfs stepExtract Sample-Root-Filesystem or sync Yocto rootfs first
Flash failed: protocol timeoutUSB-C cable issueUse a known-good USB-C cable; avoid USB 3.x hubs

For the complete Yocto build setup including branch selection and NVIDIA_DEVNET_MIRROR configuration, see Yocto BSP setup for Jetson Orin with meta-tegra. For flash.sh options and partition layout details, see flash.sh on Jetson Orin — complete guide.

FAQ

What is the Jetson Orin Nano Super?

A refreshed Orin Nano module with higher performance unlocked at 25W (MAXN mode), using the same T234 SoC as other Orin modules. Same carrier board as the original Orin Nano devkit. Requires JetPack 6.2+.

How do I flash a custom Yocto image to Jetson Orin Nano Super?

Build with MACHINE = jetson-orin-nano-devkit-nvme on the scarthgap meta-tegra branch, then flash with sudo ./flash.sh jetson-orin-nano-devkit-nvme nvme0n1p1 from the L4T host tools directory with the device in recovery mode.

What MACHINE name does Jetson Orin Nano Super use in meta-tegra?

jetson-orin-nano-devkit-nvme for NVMe rootfs. The Super uses the same MACHINE as the original Orin Nano — no separate name.

What is the difference between flashing to NVMe vs eMMC on Jetson Orin Nano?

The Orin Nano devkit uses NVMe as primary storage (no on-board eMMC). Use nvme0n1p1 as the rootfs target. microSD is available as an alternative with a different configuration.


NVIDIA Jetson Expert Support

Stuck on a Jetson bring-up?

We've debugged this failure mode before. BSP, device tree, camera pipelines, OTA, most blockers clear in the first session. No long retainers. No guessing.

Frequently Asked Questions

What is the Jetson Orin Nano Super?

The Jetson Orin Nano Super is NVIDIA's refreshed Orin Nano module (released early 2025) with higher AI performance than the original Orin Nano. It uses the same T234 SoC as other Orin modules with higher power limits unlocked: 25W MAXN mode. It uses the same carrier board as the original Orin Nano Developer Kit and the same MACHINE name in meta-tegra. JetPack 6.2+ is required.

How do I flash a custom Yocto image to Jetson Orin Nano Super?

Use flash.sh with the MACHINE name matching your carrier board and target storage. For the devkit with NVMe: flash.sh jetson-orin-nano-devkit-nvme nvme0n1p1. For eMMC: flash.sh jetson-orin-nano-devkit mmcblk0p1. The rootfs must be the Yocto-built .ext4 image. Use --no-flash to prepare the flash package for offline use or to inspect the partition layout.

What MACHINE name does Jetson Orin Nano Super use in meta-tegra?

jetson-orin-nano-devkit for the microSD/eMMC variant and jetson-orin-nano-devkit-nvme for the NVMe variant. The Orin Nano Super uses the same MACHINE as the original Orin Nano — there is no separate MACHINE name. The higher performance is enabled via JetPack firmware and nvpmodel, not a different BSP configuration.

What is the difference between flashing to NVMe vs eMMC on Jetson Orin Nano?

The Orin Nano Developer Kit has no built-in eMMC on the carrier board — the module itself has no eMMC storage in the standard Nano configuration. NVMe (M.2 slot on the carrier) is the primary storage. The MACHINE name jetson-orin-nano-devkit-nvme targets NVMe root. microSD can also be used as rootfs with a different MACHINE configuration, but NVMe is preferred for performance and reliability in production.

Andrés Campos, Co-Founder & CTO at ProventusNova

Written by

Andrés Campos

Co-Founder & CTO · ProventusNova

8 years deep in embedded systems, from underwater ROVs to edge AI. Andrés leads every technical delivery personally.

Connect on LinkedIn