Flash ONLY bootloader on Jetson tx2 with external SSD

Hello,
THE SITUATION: I have a Jetson TX2. It has an external SSD connected. It used to boot from that external drive, but now it boots from the internal drive (This drive already has a linux system installed and I want to keep this setup).
MY GOAL: I want to flash the bootloader to have it boot form the external drive.
APPROACH: I want to use the flash.sh utility from here:

to flash the bootloader. I put the jetson into recovery mode and run:

$ sudo ./flash.sh --no-flash jetson-tx2 sda1

The output can be found at the end of this post.

THE PROBLEM: Do I only flash the bootloader? In order for the utility to work I had to supply a rootfs and the output talks about the kernel. So I am worried the script changes more than just the bootloader. Am I mistaken? Did I overlook or misunderstand something in the explenation in:

https://docs.nvidia.com/jetson/l4t/index.html#page/Tegra%20Linux%20Driver%20Package%20Development%20Guide/flashing.html

How do I flash the bootloader and only the bootloader? I am happy about any sort of help.

PROMISED OUTPUT:

$ sudo ./flash.sh --no-flash jetson-tx2 sda1
###############################################################################
    # L4T BSP Information:
    # R32 , REVISION: 5.1
    ###############################################################################
    Board ID() version() sku() revision()
    Copy /mnt/00linux/recovery/Linux_for_Tegra/kernel/dtb/tegra186-quill-p3310-1000-c03-00-base.dtb to /mnt/00linux/recovery/Linux_for_Tegra/kernel/dtb/tegra186-quill-p3310-1000-c03-00-base.dtb.rec
    copying bctfile(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/t186ref/BCT/P3310_A00_8GB_lpddr4_A02_l4t.cfg)... done.
    copying misc_config(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/t186ref/BCT/tegra186-mb1-bct-misc-si-l4t.cfg)... done.
    copying pinmux_config(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/t186ref/BCT/tegra186-mb1-bct-pinmux-quill-p3310-1000-c03.cfg)... done.
    copying pmic_config(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/t186ref/BCT/tegra186-mb1-bct-pmic-quill-p3310-1000-c04.cfg)... done.
    copying pmc_config(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/t186ref/BCT/tegra186-mb1-bct-pad-quill-p3310-1000-c03.cfg)... done.
    copying prod_config(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/t186ref/BCT/tegra186-mb1-bct-prod-quill-p3310-1000-c03.cfg)... done.
    copying scr_config(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/t186ref/BCT/minimal_scr.cfg)... done.
    copying scr_cold_boot_config(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/t186ref/BCT/mobile_scr.cfg)... done.
    copying bootrom_config(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/t186ref/BCT/tegra186-mb1-bct-bootrom-quill-p3310-1000-c03.cfg)... done.
    copying dev_params(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/t186ref/BCT/emmc.cfg)... done.
    Existing bootloader(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/nvtboot_cpu.bin) reused.
    copying initrd(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/l4t_initrd.img)... done.
    	populating kernel to rootfs... done.
    	populating initrd to rootfs... done.
    	populating /mnt/00linux/recovery/Linux_for_Tegra/kernel/dtb/tegra186-quill-p3310-1000-c03-00-base.dtb to rootfs... done.
    Making Boot image... done.
    /mnt/00linux/recovery/Linux_for_Tegra/bootloader/tegraflash.py  --chip 0x18 --key  --cmd sign boot.img
    Welcome to Tegra Flash
    version 1.0.0
    Type ? or help for help and q or quit to exit
    Use ! to execute system commands
     
    [   0.0025 ] Generating signature
    [   0.0068 ] tegrasign_v2 --key  --getmode mode.txt
    [   0.0115 ] Assuming zero filled SBK key
    [   0.0238 ] 
    [   0.0265 ] sign_type   : 0
    [   0.0265 ] header_magic: 414e4452
    [   0.0309 ] tegrahost_v2 --chip 0x18 --align 1_boot.img
    [   0.0415 ] 
    [   0.0443 ] tegrahost_v2 --appendsigheader 1_boot.img zerosbk
    [   0.0567 ] 
    [   0.0624 ] tegrasign_v2 --key  --list 1_boot_sigheader.img_list.xml --pubkeyhash pub_key.key
    [   0.0639 ] Assuming zero filled SBK key
    [   0.0941 ] 
    [   0.0980 ] tegrahost_v2 --updatesigheader 1_boot_sigheader.img.encrypt 1_boot_sigheader.img.hash zerosbk
    [   0.1208 ] 
    [   0.1314 ] Signed file: /mnt/00linux/recovery/Linux_for_Tegra/bootloader/temp_user_dir/boot_sigheader.img.encrypt
    l4t_sign_image.sh: Generate header for boot_sigheader.img.encrypt
    l4t_sign_image.sh: chip 0x18: Don't need to do anything
    l4t_sign_image.sh: Generate 16-byte-size-aligned base file for boot_sigheader.img.encrypt
    l4t_sign_image.sh: the signed file is /mnt/00linux/recovery/Linux_for_Tegra/bootloader/temp_user_dir/boot_sigheader.img.encrypt
    done.
    Making recovery ramdisk for recovery image...
    Re-generating recovery ramdisk for recovery image...
    /mnt/00linux/recovery/Linux_for_Tegra/bootloader/ramdisk_tmp /mnt/00linux/recovery/Linux_for_Tegra/bootloader /mnt/00linux/recovery/Linux_for_Tegra
    30402 blocks
    _BASE_KERNEL_VERSION=4.9.201-tegra
    /mnt/00linux/recovery/Linux_for_Tegra/bootloader/ramdisk_tmp/lib /mnt/00linux/recovery/Linux_for_Tegra/bootloader/ramdisk_tmp /mnt/00linux/recovery/Linux_for_Tegra/bootloader /mnt/00linux/recovery/Linux_for_Tegra
    65765 blocks
    Making Recovery image...
    copying recdtbfile(/mnt/00linux/recovery/Linux_for_Tegra/kernel/dtb/tegra186-quill-p3310-1000-c03-00-base.dtb.rec)... done.
    20+0 records in
    20+0 records out
    20 bytes copied, 0,00117681 s, 17,0 kB/s
    Existing sosfile(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/mb1_recovery_prod.bin) reused.
    copying tegraboot(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/t186ref/nvtboot.bin)... done.
    Existing cpu_bootloader(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/nvtboot_cpu.bin) reused.
    Existing mb2blfile(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/nvtboot_recovery.bin) reused.
    Existing mtspreboot(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/preboot_d15_prod_cr.bin) reused.
    Existing mts(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/mce_mts_d15_prod_cr.bin) reused.
    Existing mb1file(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/mb1_prod.bin) reused.
    Existing bpffile(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/bpmp.bin) reused.
    copying bpfdtbfile(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/t186ref/tegra186-a02-bpmp-quill-p3310-1000-c04-00-te770d-ucm2.dtb)... done.
    Existing scefile(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/camera-rtcpu-sce.img) reused.
    Existing spefile(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/spe.bin) reused.
    Existing drameccfile(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/dram-ecc.bin) reused.
    Existing badpagefile(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/badpage.bin) reused.
    copying wb0boot(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/t186ref/warmboot.bin)... done.
    Existing tosfile(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/tos-trusty.img) reused.
    Existing eksfile(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/eks.img) reused.
    copying dtbfile(/mnt/00linux/recovery/Linux_for_Tegra/kernel/dtb/tegra186-quill-p3310-1000-c03-00-base.dtb)... done.
    Copying nv_boot_control.conf to rootfs
    /mnt/00linux/recovery/Linux_for_Tegra/bootloader/tegraflash.py  --chip 0x18 --key  --cmd sign kernel_tegra186-quill-p3310-1000-c03-00-base.dtb
    Welcome to Tegra Flash
    version 1.0.0
    Type ? or help for help and q or quit to exit
    Use ! to execute system commands
     
    [   0.0012 ] Generating signature
    [   0.0028 ] tegrasign_v2 --key  --getmode mode.txt
    [   0.0053 ] Assuming zero filled SBK key
    [   0.0062 ] 
    [   0.0084 ] sign_type   : 808464433
    [   0.0084 ] header_magic: d00dfeed
    [   0.0104 ] tegrahost_v2 --chip 0x18 --align 1_kernel_tegra186-quill-p3310-1000-c03-00-base.dtb
    [   0.0122 ] 
    [   0.0145 ] tegrahost_v2 --appendsigheader 1_kernel_tegra186-quill-p3310-1000-c03-00-base.dtb zerosbk
    [   0.0199 ] 
    [   0.0260 ] tegrasign_v2 --key  --list 1_kernel_tegra186-quill-p3310-1000-c03-00-base_sigheader.dtb_list.xml --pubkeyhash pub_key.key
    [   0.0276 ] Assuming zero filled SBK key
    [   0.0527 ] 
    [   0.0551 ] tegrahost_v2 --updatesigheader 1_kernel_tegra186-quill-p3310-1000-c03-00-base_sigheader.dtb.encrypt 1_kernel_tegra186-quill-p3310-1000-c03-00-base_sigheader.dtb.hash zerosbk
    [   0.0614 ] 
    [   0.0673 ] Signed file: /mnt/00linux/recovery/Linux_for_Tegra/bootloader/temp_user_dir/kernel_tegra186-quill-p3310-1000-c03-00-base_sigheader.dtb.encrypt
    l4t_sign_image.sh: Generate header for kernel_tegra186-quill-p3310-1000-c03-00-base_sigheader.dtb.encrypt
    l4t_sign_image.sh: chip 0x18: Don't need to do anything
    l4t_sign_image.sh: Generate 16-byte-size-aligned base file for kernel_tegra186-quill-p3310-1000-c03-00-base_sigheader.dtb.encrypt
    l4t_sign_image.sh: the signed file is /mnt/00linux/recovery/Linux_for_Tegra/bootloader/temp_user_dir/kernel_tegra186-quill-p3310-1000-c03-00-base_sigheader.dtb.encrypt
    done.
    generating system.img for booting... 
    Making system.img... 
    	populating rootfs from /tmp/tmp.udCLDicirD ... done.
    	populating /boot/extlinux/extlinux.conf ... done.
    	Sync'ing system.img ... done.
    	Converting RAW image to Sparse image... done.
    system.img built successfully. 
    Existing tbcfile(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/cboot.bin) reused.
    copying tbcdtbfile(/mnt/00linux/recovery/Linux_for_Tegra/kernel/dtb/tegra186-quill-p3310-1000-c03-00-base.dtb)... done.
    copying cfgfile(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/t186ref/cfg/flash_l4t_t186.xml) to flash.xml... done.
    Existing flasher(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/nvtboot_recovery_cpu.bin) reused.
    Existing flashapp(/mnt/00linux/recovery/Linux_for_Tegra/bootloader/tegraflash.py) reused.
    ./tegraflash.py --bl nvtboot_recovery_cpu.bin --sdram_config P3310_A00_8GB_lpddr4_A02_l4t.cfg --odmdata 0x1090000 --applet mb1_recovery_prod.bin --cmd "flash; reboot"  --cfg flash.xml --chip 0x18 --misc_config tegra186-mb1-bct-misc-si-l4t.cfg --pinmux_config tegra186-mb1-bct-pinmux-quill-p3310-1000-c03.cfg --pmic_config tegra186-mb1-bct-pmic-quill-p3310-1000-c04.cfg --pmc_config tegra186-mb1-bct-pad-quill-p3310-1000-c03.cfg --prod_config tegra186-mb1-bct-prod-quill-p3310-1000-c03.cfg --scr_config minimal_scr.cfg --scr_cold_boot_config mobile_scr.cfg --br_cmd_config tegra186-mb1-bct-bootrom-quill-p3310-1000-c03.cfg --dev_params emmc.cfg  --bins "mb2_bootloader nvtboot_recovery.bin; mts_preboot preboot_d15_prod_cr.bin; mts_bootpack mce_mts_d15_prod_cr.bin; bpmp_fw bpmp.bin; bpmp_fw_dtb tegra186-a02-bpmp-quill-p3310-1000-c04-00-te770d-ucm2.dtb; tlk tos-trusty.img; eks eks.img; bootloader_dtb tegra186-quill-p3310-1000-c03-00-base.dtb" --skipuid  
    saving flash command in /mnt/00linux/recovery/Linux_for_Tegra/bootloader/flashcmd.txt
    saving Windows flash command to /mnt/00linux/recovery/Linux_for_Tegra/bootloader/flash_win.bat
    *** no-flash flag enabled. Exiting now... ***

There are few things to clarify and explain here

  1. First, I want to clarify your goal " I want to flash the bootloader to have it boot form the external drive.".
    Actually, there is no need to “flash” bootloader to let it boot from external drive. You can just configure the uboot boot-target / boot-order to let external device have higher priority than emmc. It can be done by directly interrupt the boot process through UART serial console and change the order. Or it can be done by modifying the uboot binary. If you are talking flashing the new uboot binary with new boot order, then your goal is correct. If it is not, then please elaborate what you want to do.

  2. “bootloader” on jetson is a large scope. We have MB1/MB2/Cboot/Uboot and they are all “bootloader”. The only one that is related to your boot is the uboot.

  3. The parameters of your command, which is as its name, “–no-flash” means there is no actual flash… you don’t really write anything to your board. It is just preparing some binaries that will be flashed to the board later on your host.

$ sudo ./flash.sh --no-flash jetson-tx2 sda1

If you don’t see a progress bar from flash.sh log and says it is writing to specific partition, then it is not flashing.

  1. You can use “sudo ./flash -r -k partition_name jetson-tx2 sda1” and replace the partition_name to the one you need. It will flash corresponding binaries to that partition.
    You can refer to developer guide to understand those partitions.

https://docs.nvidia.com/jetson/l4t/index.html#page/Tegra%20Linux%20Driver%20Package%20Development%20Guide/part_config.html

1 Like

Hi,
thanks again for the quick answer. I just want to boot from the external drive. I was told that for this I need to flash the bootloader, but the other methods you list seem cleaner. Do I need this special connector to enter the UART serial console as shown here:
https://www.jetsonhacks.com/2017/03/24/serial-console-nvidia-jetson-tx2/
Or is it possible to use the serial connector, I would use to flash the board?

For the case the UART approach does not work for me: I was unable to find a concise tutorial online on how to configure the u-boot binary. Do I download the source from their git (U-Boot / U-Boot · GitLab), configure and compile it from there? Or does the jetson require something special?

https://www.jetsonhacks.com/2017/03/24/serial-console-nvidia-jetson-tx2/

Yes, you need this.

For the case the UART approach does not work for me: I was unable to find a concise tutorial online on how to configure the u-boot binary.

I am not sure what do you mean “does not work for me”. Is it because you cannot interact with the board? If so, then I think you can just remove the /boot/extlinux/extlinux.conf on the emmc so that uboot will fail to boot from emmc and then it shall move to next boot device in your case. It is still worthy of using the uart console to dump the bootloader log once. At least to see what is printed there and how uboot scan the boot device.

1 Like

I need to again express my gratitude for the quick responses in this forum.

I acuired a serial-usb adapter to enter the UART serial console and connected the adapter as described in this post:

https://www.jetsonhacks.com/2017/03/24/serial-console-nvidia-jetson-tx2/

I set up the software as the post describes, but there seems to be a hardware problem: because when the serial connector is connected the board does not start. Even worse when I connect the serial connector when the board is running the board instantly is shut off (Specifically as soon as the RX and GND connectors are connected.)

To make sure I made no mistake I looked twice, looked in the manuel. The Manual confirmed the pin layout from the post. To discuss the error I must have made I created a graphic illustration of what I did. Can you maybe see any problem with the way I connected the serial adapter?

Here is the illustration:

I was able to find my mistake. The Instructions said to connect the board TX with the cable RX and the board RX with the cable TX. Doing this prevented the board from starting and shut off the board if it was running.

The correct connection is same with same, meaning both RX and both TX connectors with each other respectively. In the end of this post will be an updated image with the correct connection, maybe it can help someone in the future.

But I still can’t start from my external drive.
So I was able to start the serial console and interact with the u-boot loader. However u-boot does not start from the external drive eventhough I tell it to and to me it seems to be correctly setup.

At the end are the two output files from minicom:

The output from minicom telling u-boot to boot from the external drive
and
The output from minicom telling u-boot to boot from the internal drive

The extlinux.conf should give the bootloader the option to boot from the external drive. Is the extlinux.conf incorrectly configured? I do not know, what I could try to fix this.
capturefile1 (78.8 KB)
capturefile2 (23.9 KB)

The extlinux.conf has nothing wrong here. With the log, I can tell what is going on now.

In: serial
Out: serial
Err: serial
Net: eth0: ethernet@2490000
Hit any key to stop autoboot: 2 1 0
MMC: no card present
switch to partitions #0, OK
mmc0(part 0) is current device
Scanning mmc 0:1…
Found /boot/extlinux/extlinux.conf
Retrieving file: /boot/extlinux/extlinux.conf
334 bytes read in 104 ms (2.9 KiB/s)
L4T boot options
1: primary kernel SSD
2: eMMC kernel
Enter choice: 2
2: eMMC kernel

When the log says “Scanning mmc 0:1”, and mmc0 is current device, it means the uboot finds the extlinux.conf on your emmc and it uses the extlinux.conf to boot up. You just write two options with names “primary kernel SSD” and “emmc kernel”. But actually they are all reading the kernel from your emmc… thus, ssd is not getting involved here.

Also, after kernel is up from emmc, it tries to mount the file system as the kernel command line tells.

The capturefile1 log shows you tried to mount the file system from sda1. But unfortunately it seems you made a typo… so it still mount file system from emmc.

root/=dev/sda1

As for capturefile2, it mounts from emmc.

1 Like

Hello,
thanks again for the super fast response.

I am a little bit confused, because the abstract you show was from capturefile2, which was meant as a compare to show how the startup looks if I intentionally start form EMMC. ‘capturefile1’ is the one where something goes wrong (i.e. I want to start form SSD, but it boots from EMMC).

So if I understand you correctly: the bootloader loads the kernel from EMMC even if I tell it to boot from SSD. So that is why the SSD is never involved in any startup. But still it tries to mount the SSD? But why does it fail? In both capturefiles I ran ‘lsblk’ and ‘sda1’ is never mounted as anthing.

You discovered a typo by me? I am sorry, but I do not understand where you saw it. The only thing I typed was ‘1’ or ‘2’ when I was asked where I want to boot from (except for the two commands I ran ‘lsblk’ and ‘shut’ to show the mounted filesystems and to shut down again (shut is my alias for ‘shutdown now’)). You quote ‘root/=dev/sda1’, is that the typo you mean? Where is the typo? I did not type that.

I can only imagine you mean a typo in my /boot/extlinux/extlinux.conf file, but you said there is nothing wrong with this file. I will send it regardless in this post, because I want to make sure, there are no misunderstandings.

I tried to read your post carefully, but I am still not sure what I could try to fix this. Do you believe, there is something wrong with the files on my SSD? It used to boot from there and I can show more information about it, if this is helpful.

Thank you a lot for the help so far.

Here comes the extlinux.conf file.
extlinux.conf (334 Bytes)

Hi,

Ok, actually, I didn’t see the content of your extlinux.conf until now, so precisely I didn’t know your extlinux.conf is correct or not. Now I check it, the extlinux.conf is wrong because of the typo is inside it.

The point I wanted to say in the beginning is:

This is from your capture 1 log.

In:    serial
Out:   serial
Err:   serial
Net:   eth0: ethernet@2490000
Hit any key to stop autoboot:  2  1  0 
MMC: no card present
switch to partitions #0, OK
mmc0(part 0) is current device
Scanning mmc 0:1...
Found /boot/extlinux/extlinux.conf
Retrieving file: /boot/extlinux/extlinux.conf
334 bytes read in 104 ms (2.9 KiB/s)
L4T boot options
1:	primary kernel SSD
2:	eMMC kernel
Enter choice: 1
1:	primary kernel SSD
Retrieving file: /boot/initrd
5565090 bytes read in 218 ms (24.3 MiB/s)
Retrieving file: /boot/Image
34179080 bytes read in 858 ms (38 MiB/s)
append: root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 console=ttyS0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0 video=tegrafb no_console_suspend=1 earlycon=uart8250,mmio32,0x3100000 nvdumper_reserved=0x2772e0000 gpt usbcore.old_scheme_first=1 tegraid=18.1.2.0.0 maxcpus=6 boot.slot_suffix= boot.ratchetvalues=0.2031647.1 bl_prof_dataptr=0x10000@0x275840000 sdhci_tegra.en_boot_part_access=1 root/=dev/sda1 rw rootwait

and this is from your capturefile2.

In: serial
Out: serial
Err: serial
Net: eth0: ethernet@2490000
Hit any key to stop autoboot: 2 1 0
MMC: no card present
switch to partitions #0, OK
mmc0(part 0) is current device
Scanning mmc 0:1…
Found /boot/extlinux/extlinux.conf
Retrieving file: /boot/extlinux/extlinux.conf
334 bytes read in 104 ms (2.9 KiB/s)
L4T boot options
1: primary kernel SSD
2: eMMC kernel
Enter choice: 2
2: eMMC kernel
Retrieving file: /boot/initrd
5565090 bytes read in 217 ms (24.5 MiB/s)
Retrieving file: /boot/Image
34179080 bytes read in 858 ms (38 MiB/s)
append: root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 console=ttyS0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0 video=tegrafb no_console_suspend=1 earlycon=uart8250,mmio32,0x3100000 nvdumper_reserved=0x2772e0000 gpt usbcore.old_scheme_first=1 tegraid=18.1.2.0.0 maxcpus=6 boot.slot_suffix= boot.ratchetvalues=0.2031647.1 bl_prof_dataptr=0x10000@0x275840000 sdhci_tegra.en_boot_part_access=1 quiet

If you see uboot says “mmc0 is current device in these logs” , then it means uboot boot the kernel from your emmc.

However, the kernel command line in your extlinux is the origin of the typo.

LABEL primary
MENU LABEL primary kernel SSD
LINUX /boot/Image
INITRD /boot/initrd
APPEND ${cbootargs} root/=dev/sda1 rw rootwait

If you didn’t type it, then you shall tell us who wrote this. What command did you use to set this in extlinux.conf?

The root device will tell the kernel where to mount the file system. Take emmc case for example,

root=/dev/mmcblk0p1

1 Like

The most common case that users cannot understand is the difference between “boot from” and “mount file system from”

  1. The boot from means where to find the extlinux.conf and the kernel.

  2. The filesystem case means where to load the file system. This is decided by the “root=” in your kernel command line.

The (1) depends on the capability of bootloader, thus, it does not 100% support each external drive. For example, below document lists each “boot from” case.

https://docs.nvidia.com/jetson/l4t/index.html#page/Tegra%20Linux%20Driver%20Package%20Development%20Guide/flashing.html#wwpID0E0HM0HA

Thus, you shall see something as below. The “applies to” does not have tx2, which means TX2 uboot is not able to load usb.

image

However, after kernel is up from emmc, you can still ask it to mount the rootfs from the usb drive. Just make it easier to understand, if you can see the device in /dev after boots up, it means kernel has ability to load it up.

Thus, there are different combination that can achieve. For example, you can boot from sdcard and then mount file system from usb. You can also boot from emmc and then mount the file system on nvme.

The only point here is make sure the bootloader or the kernel can load it or not.

1 Like

It finally worked! Thank you! There was indeed a typo in the /boot/extlinux/extlinux.conf file.

WRONG   --> APPEND ${cbootargs} root/=dev/sda1 rw rootwait
CORRECT --> APPEND ${cbootargs} root=/dev/sda1 rw rootwait

The config was not done by me, but by a coworker, so I believed it.

I will post a copy of the correct extlinux.conf here as well, in case someone will find it useful.
extlinux.conf (334 Bytes)

I can’t thank you enough.