Problem

Flashing JetPack 6.2.2 (L4T R36.5.0) onto a Jetson AGX Orin 64GB Developer Kit fails at the tegrarcm_v2 stage with ERROR: might be timeout in USB write when using an AMD B650-based host PC. This occurs regardless of host OS environment (Windows WSL2, Ubuntu Live Boot, Ubuntu native install).

[ 0.2574 ] Sending bct_br
[ 0.2576 ] ERROR: might be timeout in USB write.
Error: Return value 3
Command tegrarcm_v2 --new_session --chip 0x23 ...

Background

The target setup was a real-time voice chat demo (LlamaSpeak) running on-device. The board came pre-flashed with JetPack 5.1.3 (CUDA 11.4), and text-based LLM inference (Llama 3 8B via MLC) was already functional. However, every available ASR path required JetPack 6:

ASR OptionFailure Reason on JP5.1.3
Riva 2.14.0Models removed from NGC (HTTP 403)
Riva 2.19.0Requires CUDA 12 — cudaError_t 35
Riva 2.13.1riva_init.sh internal NGC CLI ignores host API keys
whisper_trtJP6-only module — ImportError

This made a JetPack 6 reflash mandatory.

Environment

Host PC (AMD — fails):

  • AMD B650 AORUS ELITE V2
  • RTX 4060 Ti
  • USB 3.x ports (AMD USB controller)

Host PC (Intel — works):

  • Samsung NT930SBE laptop
  • Intel Core i5-8265U
  • 8GB RAM, USB-C only (3 ports)

Target:

  • Jetson AGX Orin 64GB Developer Kit
  • eMMC + 1TB NVMe
  • Original USB-A to C data cable

Root Cause: AMD USB Controller Incompatibility

NVIDIA’s tegrarcm_v2 tool communicates with the Jetson in APX recovery mode over USB. On the AMD B650 USB controller, this communication fails at the very first stage (Sending bct_br) with a write timeout.

The following environments were tested on the AMD host — all produced the identical error:

Host EnvironmentResult
Windows SDK Manager (WSL2)USB timeout
Ubuntu 22.04 Live Boot (USB)USB timeout
Ubuntu 22.04 Native (External SSD)USB timeout
Windows SDK Manager (Native WSL)USB timeout

Mitigations attempted (all ineffective):

  • Disabling USB autosuspend: echo -1 > /sys/module/usbcore/parameters/autosuspend
  • Different USB ports (front/rear)
  • Zadig driver replacement (VBoxUSB → WinUSB)
  • Different host OS environments

The common denominator was the AMD USB controller. Switching to an Intel-based host resolved the USB timeout entirely — tegrarcm_v2 completed with zero errors on the first attempt.

Partial Flash Consequences

Before identifying the root cause, one flash.sh run on the AMD host partially completed. The result:

  • CLI boot worked (tty2 login functional)
  • Internet connectivity intact
  • nvidia kernel modules loaded
  • dpkg showed L4T 36.5.0 packages installed
  • GUI completely broken — black screen after NVIDIA logo
  • /dev/nvhost* missing — zero GPU device nodes
  • Xorg: eglInitialize() failed, no screens found
  • Weston: NvRmMemInitNvmap failed with Permission denied

The root cause was an incomplete Device Tree Blob (DTB) due to corrupted USB transfer. This is not recoverable through software — no amount of xorg.conf editing, package reinstallation, or ldconfig configuration will fix missing device tree entries. A clean reflash with reliable USB transfer is required.

Key takeaway: flash.sh reporting success does not guarantee a clean flash. USB transmission errors can silently corrupt firmware/DTB. Always verify /dev/nvhost* presence after flashing.

Solution: Intel Host + chroot

The Intel laptop had only 8GB RAM and couldn’t boot from the external SSD via BIOS. This introduced two additional problems that had to be solved:

  1. RAM exhaustion: flash.sh builds a ~6GB system.img in memory. With Ubuntu GUI running in Live Boot, 8GB RAM is insufficient → segfault during sed operations on rootfs.
  2. SQUASHFS corruption: Ubuntu Live Boot loads system binaries from a SQUASHFS filesystem on the USB stick. Under heavy I/O, the USB stick degraded → read errors → segfault when loading sed, bash, etc.

Failed Intermediate Approaches

ApproachFailure
Live Boot + GUISegfault — RAM exhaustion
Live Boot + GUI + 4GB swap on SSDSegfault — GUI still consuming too much RAM
Live Boot + CLI (systemd.unit=multi-user.target)Segfault — SQUASHFS read errors on dying USB stick

Working Approach: CLI Boot + chroot

The solution was to use the USB stick only as a minimal bootstrap, then chroot into a full Ubuntu installation on the external SSD. Inside the chroot, all binaries load from the SSD — completely bypassing the USB stick’s SQUASHFS.

Step 1: Boot into CLI mode

At the GRUB menu, press e to edit the boot entry. Append systemd.unit=multi-user.target to the linux line:

linux /casper/vmlinuz file=/cdrom/preseed/ubuntu.seed maybe-ubiquity quiet splash --- systemd.unit=multi-user.target

Press F10 to boot. Login with ubuntu (no password).

Step 2: Mount SSD and enter chroot

sudo -i
mount -o rw /dev/sda1 /mnt
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
mount --bind /run /mnt/run
chroot /mnt /bin/bash
export PATH=/usr/bin:/usr/sbin:/bin:/sbin

Step 3: Configure networking

WiFi must be configured outside the chroot (NetworkManager runs on the host):

# Exit chroot
exit

# Connect WiFi
nmcli dev wifi connect <BSSID> password "<password>"

# Re-enter chroot
chroot /mnt /bin/bash
export PATH=/usr/bin:/usr/sbin:/bin:/sbin
echo "nameserver 8.8.8.8" > /etc/resolv.conf

Step 4: Install dependencies

apt-get update && apt-get install -y libxml2-utils binutils

Both are required by flash.shxmllint for XML validation and strings for binary inspection.

Step 5: Flash

Put the Jetson in recovery mode (unplug power → hold middle Force Recovery button → plug power → wait 10s → release), connect the USB cable, then:

cd /home/<user>/nvidia/nvidia_sdk/JetPack_6.2.2_Linux_JETSON_AGX_ORIN_TARGETS/Linux_for_Tegra/
./flash.sh jetson-agx-orin-devkit internal

The internal flag targets eMMC, preserving any data on NVMe.

Result

[ 913.6337 ] Flashing completed
[ 913.6338 ] Coldbooting the device
*** The target generic has been flashed successfully. ***

All 60 partitions written at 100%. After rebooting the Jetson:

  • Ubuntu GUI: functional
  • /dev/nvhost*: 15+ device nodes present
  • nvidia-smi inside Docker: Driver 540.5.0, CUDA 12.6

Post-Flash Setup

# Install JetPack SDK components
sudo apt update && sudo apt install -y nvidia-jetpack

# Verify CUDA
export PATH=/usr/local/cuda/bin:$PATH
nvcc --version  # Should show CUDA 12.6

# Mount NVMe (if applicable)
sudo mkdir -p /mnt/nvme
sudo mount /dev/nvme0n1p1 /mnt/nvme
echo "/dev/nvme0n1p1 /mnt/nvme ext4 defaults 0 2" | sudo tee -a /etc/fstab

# Docker setup with NVMe storage
sudo apt install -y docker.io nvidia-container-toolkit
sudo tee /etc/docker/daemon.json << 'EOF'
{
  "data-root": "/mnt/nvme/docker",
  "default-runtime": "nvidia",
  "runtimes": {
    "nvidia": {
      "path": "nvidia-container-runtime",
      "runtimeArgs": []
    }
  }
}
EOF
sudo systemctl restart docker

# Verify Docker + GPU
sudo docker run --rm --runtime nvidia nvidia/cuda:12.6.0-base-ubuntu22.04 nvidia-smi

Summary

FactorDetail
Root causeAMD USB controller incompatible with tegrarcm_v2
SolutionUse Intel USB host
RAM constraintchroot into SSD-based Ubuntu to avoid Live Boot SQUASHFS dependency
CLI bootRequired to keep RAM usage under 8GB
Flash targetinternal (eMMC) to preserve NVMe data
VerificationCheck /dev/nvhost* — not just flash.sh exit status

References