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 Option | Failure Reason on JP5.1.3 |
|---|---|
| Riva 2.14.0 | Models removed from NGC (HTTP 403) |
| Riva 2.19.0 | Requires CUDA 12 — cudaError_t 35 |
| Riva 2.13.1 | riva_init.sh internal NGC CLI ignores host API keys |
| whisper_trt | JP6-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 Environment | Result |
|---|---|
| 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 (
tty2login functional) - Internet connectivity intact
nvidiakernel modules loadeddpkgshowed 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:
- RAM exhaustion:
flash.shbuilds a ~6GBsystem.imgin memory. With Ubuntu GUI running in Live Boot, 8GB RAM is insufficient → segfault duringsedoperations on rootfs. - 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
| Approach | Failure |
|---|---|
| Live Boot + GUI | Segfault — RAM exhaustion |
| Live Boot + GUI + 4GB swap on SSD | Segfault — 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.sh — xmllint 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 presentnvidia-smiinside 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
| Factor | Detail |
|---|---|
| Root cause | AMD USB controller incompatible with tegrarcm_v2 |
| Solution | Use Intel USB host |
| RAM constraint | chroot into SSD-based Ubuntu to avoid Live Boot SQUASHFS dependency |
| CLI boot | Required to keep RAM usage under 8GB |
| Flash target | internal (eMMC) to preserve NVMe data |
| Verification | Check /dev/nvhost* — not just flash.sh exit status |