Jetson nano devkit module with sdcard does not want to boot in custom board with L4T32.7.6

Hello,

I would like to ask for help:

I have a Jetson Nano devkit module with an SD card (P3448-0000) and a custom board instead of the NVIDIA board (P3449-0000).

The module works perfectly in my custom board and L4T32.7.2. Also, the module with emmc (p3448-0002) works perfectly with my custom board and L4T32.7.6. But when I want to use P3448-0000 with L4T32.7.6, it does not want to boot on my custom board

I tried to flash it with several variants of params for flash.sh script, e.g.:

  • `./flash.sh jetson-nano-devkiti mmcblk0p1`
  • `sudo BOARDID=3448 FAB=300 BOARDSKU=0000 BOARDREV=B00 PYTHON=python2 ./flash.sh p3448-0000-max-spi mmcblk0p1`
  • `sudo BOARDID=3448 FAB=300 BOARDSKU=0002 BOARDREV=B00 PYTHON=python2 ./flash.sh p3448-0000-max-spi mmcblk0p1`
  • and several other

can you help me? here is output from minicom

[0000.125] [L4T TegraBoot] (version 00.00.2018.01-l4t-b1625959)
[0000.131] Processing in cold boot mode Bootloader 2
[0000.135] A02 Bootrom Patch rev = 1023
[0000.139] Power-up reason: pmc por
[0000.142] No Battery Present
[0000.145] pmic max77620 reset reason
[0000.148] pmic max77620 NVERC : 0x10
[0000.151] RamCode = 0
[0000.154] Platform has DDR4 type RAM
[0000.157] max77620 disabling SD1 Remote Sense
[0000.161] Setting DDR voltage to 1125mv
[0000.165] Serial Number of Pmic Max77663: 0xd06ae
[0000.173] Entering ramdump check
[0000.176] Get RamDumpCarveOut = 0x0
[0000.179] RamDumpCarveOut=0x0,  RamDumperFlag=0xe59ff3f8
[0000.184] Last reboot was clean, booting normally!
[0000.189] Sdram initialization is successful 
[0000.193] SecureOs Carveout Base=0x00000000ff800000 Size=0x00800000
[0000.199] Lp0 Carveout Base=0x00000000ff780000 Size=0x00001000
[0000.205] BpmpFw Carveout Base=0x00000000ff700000 Size=0x00080000
[0000.211] GSC1 Carveout Base=0x00000000ff600000 Size=0x00100000
[0000.216] GSC2 Carveout Base=0x00000000ff500000 Size=0x00100000
[0000.222] GSC4 Carveout Base=0x00000000ff400000 Size=0x00100000
[0000.228] GSC5 Carveout Base=0x00000000ff300000 Size=0x00100000
[0000.234] GSC3 Carveout Base=0x000000017f300000 Size=0x00d00000
[0000.250] RamDump Carveout Base=0x00000000ff280000 Size=0x00080000
[0000.256] Platform-DebugCarveout: 0
[0000.259] Nck Carveout Base=0x00000000ff080000 Size=0x00200000
[0000.265] Non secure mode, and RB not enabled.
[0000.269] BoardID = 3448, SKU = 0x0
[0000.273] QSPI-ONLY: SkipQspiOnlyFlag = 0
[0000.277] Nano-SD: checking PT table on QSPI ...
[0000.281] Initialize FailControl
[0000.284] Read PT from (2:0)
[0000.314] PT crc32 and magic check passed.
[0000.318] Using BFS PT to query partitions 
[0000.324] Loading Tboot-CPU binary
[0000.352] Verifying TBC in OdmNonSecureSBK mode
[0000.363] Bootloader load address is 0xa0000000, entry address is 0xa0000258
[0000.370] Bootloader downloaded successfully.
[0000.375] Downloaded Tboot-CPU binary to 0xa0000258
[0000.380] MAX77620_GPIO5 configured
[0000.383] CPU power rail is up
[0000.386] CPU clock enabled
[0000.390] Performing RAM repair
[0000.392] Updating A64 Warmreset Address to 0xa00002e9
[0000.397] BoardID = 3448, SKU = 0x0
[0000.401] QSPI-ONLY: SkipQspiOnlyFlag = 0
[0000.405] Nano-SD: checking PT table on QSPI ...
[0000.409] NvTbootFailControlDoFailover: No failover; Continuing ...
[0000.415] Loading NvTbootBootloaderDTB
[0000.481] Verifying NvTbootBootloaderDTB in OdmNonSecureSBK mode
[0000.553] Bootloader DTB Load Address: 0x83000000
[0000.558] BoardID = 3448, SKU = 0x0
[0000.561] QSPI-ONLY: SkipQspiOnlyFlag = 0
[0000.565] Nano-SD: checking PT table on QSPI ...
[0000.569] NvTbootFailControlDoFailover: No failover; Continuing ...
[0000.575] Loading NvTbootKernelDTB
[0000.641] Verifying NvTbootKernelDTB in OdmNonSecureSBK mode
[0000.712] Kernel DTB Load Address: 0x83100000
[0000.717] BoardID = 3448, SKU = 0x0
[0000.720] QSPI-ONLY: SkipQspiOnlyFlag = 0
[0000.724] Nano-SD: checking PT table on QSPI ...
[0000.728] NvTbootFailControlDoFailover: No failover; Continuing ...
[0000.736] Loading cboot binary
[0000.852] Verifying EBT in OdmNonSecureSBK mode
[0000.893] Bootloader load address is 0x92c00000, entry address is 0x92c00258
[0000.900] Bootloader downloaded successfully.
[0000.905] BoardID = 3448, SKU = 0x0
[0000.908] QSPI-ONLY: SkipQspiOnlyFlag = 0
[0000.912] Nano-SD: checking PT table on QSPI ...
[0000.916] NvTbootFailControlDoFailover: No failover; Continuing ...
[0000.922] PT: Partition NCT NOT found ! 
[0000.926] Warning: Find Partition via PT Failed
[0000.930] Next binary entry address: 0x92c00258 
[0000.935] BoardId: 3448
[0000.939] Overriding pmu board id with proc board id
[0000.944] Display board id is not available 
[0000.948] BoardID = 3448, SKU = 0x0
[0000.952] QSPI-ONLY: SkipQspiOnlyFlag = 0
[0000.955] Nano-SD: checking PT table on QSPI ...
[0000.960] NvTbootFailControlDoFailover: No failover; Continuing ...
[0001.066] Verifying SC7EntryFw in OdmNonSecureSBK mode
[0001.156] /bpmp deleted
[0001.159] SC7EntryFw header found loaded at 0xff700000
[0001.566] OVR2 PMIC
[0001.568] Bpmp FW successfully loaded
[0001.571] BoardID = 3448, SKU = 0x0
[0001.575] QSPI-ONLY: SkipQspiOnlyFlag = 0
[0001.578] Nano-SD: checking PT table on QSPI ...
[0001.583] NvTbootFailControlDoFailover: No failover; Continuing ...
[0001.590] WB0 init successfully at 0xff780000
[0001.594] Verifying NvTbootWb0 in OdmNonSecureSBK mode
[0001.599] Set NvDecSticky Bits
[0001.603] GSC2 address ff53fffc value c0edbbcc
[0001.609] GSC MC Settings done
[0001.612] BoardID = 3448, SKU = 0x0
[0001.615] QSPI-ONLY: SkipQspiOnlyFlag = 0
[0001.619] Nano-SD: checking PT table on QSPI ...
[0001.623] NvTbootFailControlDoFailover: No failover; Continuing ...
[0001.630] TOS Image length 53680
[0001.633]  Monitor size 53680
[0001.636]  OS size 0
[0001.651] Secure Os AES-CMAC Verification Success!
[0001.656] TOS image cipher info: plaintext
[0001.660] Loading and Validation of Secure OS Successful
[0001.676] SC7 Entry Firmware - 0xff700000, 0x4000
[0001.680] NvTbootPackSdramParams: start. 
[0001.685] NvTbootPackSdramParams: done. 
[0001.689] Tegraboot started after 52344 us
[0001.693] Basic modules init took 937234 us
[0001.697] Sec Bootdevice Read Time = 12 ms, Read Size = 61 KB
[0001.703] Sec Bootdevice Write Time = 0 ms, Write Size = 0 KB
[0001.708] Next stage binary read took 102860 us
[0001.712] Carveout took -132462 us
[0001.716] CPU initialization took 770183 us
[0001.720] Total time taken by TegraBoot 1677815 us

[0001.725] Starting CPU & Halting co-processor 

64NOTICE:  BL31: v1.3(release):269577911
NOTICE:  BL31: Built : 23:37:38, Nov  4 2024
ERROR:   Error initializing runtime service trusty_fast
[0001.847] RamCode = 0
[0001.857] LPDDR4 Training: found 4 entries (2 nominal, 2 derated)
[0001.862] EMC Training (SRC-freq: 204000; DST-freq: 1600000)
[0001.875] EMC Training Successful
[0001.878] EMC Training (SRC-freq: 204000; DST-freq: 1600000)
[0001.891] EMC Training Successful
[0001.894] 408000 not found in DVFS table
[0001.935] RamCode = 0
[0001.941] DT Write: emc-table@204000 succeeded
[0001.949] DT Write: emc-table@1600000 succeeded
[0001.958] DT Write: emc-table-derated@204000 succeeded
[0001.967] DT Write: emc-table-derated@1600000 succeeded
[0001.972] LPDDR4 Training: Write DT: Number of tables = 4
[0002.028] 
[0002.029] Debug Init done
[0002.032] Marked DTB cacheable
[0002.034] Bootloader DTB loaded at 0x83000000
[0002.039] Marked DTB cacheable
[0002.042] Kernel DTB loaded at 0x83100000
[0002.046] DeviceTree Init done
[0002.061] Pinmux applied successfully
[0002.066] gicd_base: 0x50041000
[0002.069] gicc_base: 0x50042000
[0002.072] Interrupts Init done
[0002.077] Using base:0x60005090 & irq:208 for tick-timer
[0002.082] Using base:0x60005098 for delay-timer
[0002.087] platform_init_timer: DONE
[0002.090] Timer(tick) Init done
[0002.094] osc freq = 38400 khz
[0002.098] 
[0002.099] Welcome to L4T Cboot
[0002.102] 
[0002.103] Cboot Version: 00.00.2018.01-t210-acb23272
[0002.108] calling constructors
[0002.111] initializing heap
[0002.114] initializing threads
[0002.117] initializing timers
[0002.120] creating bootstrap completion thread
[0002.124] top of bootstrap2()
[0002.127] CPU: ARM Cortex A57
[0002.130] CPU: MIDR: 0x411FD071, MPIDR: 0x80000000
[0002.135] initializing platform
[0002.143] Manufacturer: MF = 0xc2, ID MSB = 0x25
[0002.147] ID LSB = 0x36, ID-CFI len = 194 bytes
[0002.152] Macronix QSPI chip present
[0002.155] SPI device register
[0002.158] init boot device
[0002.161] allocating memory for boot device(SPI)
[0002.165] registering boot device
[0002.174] QSPI bdev is already initialized
[0002.178] Enable APE clock
[0002.180] Un-powergate APE partition
[0002.184] of_register: registering tegra_udc to of_hal
[0002.189] of_register: registering inv20628-driver to of_hal
[0002.195] of_register: registering ads1015-driver to of_hal
[0002.200] of_register: registering lp8557-bl-driver to of_hal
[0002.206] of_register: registering bq2419x_charger to of_hal
[0002.212] of_register: registering bq27441_fuel_gauge to of_hal
[0002.224] gpio framework initialized
[0002.228] of_register: registering tca9539_gpio to of_hal
[0002.233] of_register: registering tca9539_gpio to of_hal
[0002.238] of_register: registering i2[0000.125] [L4T TegraBoot] (version 00.00.2018.01-l4t-b1625959)
[0000.131] Processing in cold boot mode Bootloader 2
[0000.135] A02 Bootrom Patch rev = 1023
[0000.139] Power-up reason: pmc por
[0000.142] No Battery Present
[0000.145] pmic max77620 reset reason
[0000.148] pmic max77620 NVERC : 0x10
...

minicom output from another attempt:

...
[0002.180] Un-powergate APE partition
[0002.184] of_register: registering tegra_udc to of_hal
[0002.189] of_register: registering inv20628-driver to of_hal
[0002.195] of_register: registering ads1015-driver to of_hal
[0002.200] of_register: registering lp8557-bl-driver to of_hal
[0002.206] of_register: registering bq2419x_charger to of_hal
[0002.212] of_register: registering bq27441_fuel_gauge to of_hal
[0002.224] gpio framework initialized
[0002.228] of_register: registering tca9539_gpio to of_hal
[0002.233] of_register: registering tca9539_gpio to of_hal
[0002.239] of_register: registering i2c_bus_driver to of_hal
[0002.244] of_register: registering i2c_bus_driv[0000.125] [L4T TegraBoot] (version 00.00.2018.01-l4t-b1625959)
[0000.131] Processing in cold boot mode Bootloader 2
[0000.135] A02 Bootrom Patch rev = 1023
[0000.139] Power-up reason: pmc por
[0000.142] No Battery Present
[0000.145] pmic max77620 reset reason
...

Hi @mpalik,

The likely reason is the module/carrier-board combination.

P3448-0000 is the SD-card Jetson Nano module included with the NVIDIA Jetson Nano Developer Kit, and it is intended for development use with the NVIDIA P3449 carrier board. For a custom/production carrier board, the recommended module is P3448-0002, the production eMMC SOM.

This also matches your test result: the P3448-0002 module boots on your custom carrier with L4T 32.7.6, but the P3448-0000 module does not.

From the UART log, this does not look like a simple SD-card/rootfs issue. TegraBoot and CBoot are already starting, then the board restarts during CBoot before the Linux kernel starts. That points to a pre-kernel bootloader/carrier-board configuration issue.

Changing the flash command or changing BOARDSKU alone will not solve this if the bootloader DTB / kernel DTB / flash configuration are still based on the NVIDIA P3449 carrier board. I also noticed one command used BOARDSKU=0002; please do not use the 0002 SKU for the P3448-0000 SD-card module, because that selects the eMMC SOM configuration.

Recommendation:

For your custom carrier board, please use P3448-0002 with the corresponding custom carrier BSP. This is the correct production/custom-carrier path.

For P3448-0000, please use it with the NVIDIA P3449 developer kit carrier and the stock jetson-nano-devkit configuration. If you put the same P3448-0000 module back on the NVIDIA carrier and it boots with L4T 32.7.6, then the module and L4T release are OK, and the remaining issue is the unsupported/custom carrier use case.

If you still want to use P3448-0000 on your custom carrier, there is no simple flash parameter workaround we can recommend. It would require maintaining a custom BSP/bootloader configuration for that exact module + carrier + L4T release, and that is outside the recommended production path. Since your P3448-0002 already works with L4T 32.7.6, the practical solution is to continue with P3448-0002 for this custom carrier.

The relevant documentation is the Jetson Nano Adaptation and Bring-Up guide:

Hope this helps!

Thanks for your explanation. But why does P3448-0000module work like a charm with L4T32.7.2 and my custom board? There is no need to use any custom BSP, any changes in the device tree, or anything like that. I simply flash the SD card (L4T32.7.2), insert it into P3448-0000, insert this module into my custom board, and everything works as expected. From my POV, it seems that for some reason, the problem is a combination P3448-0000 + L4T32.7.6 + my custom board. But I don’t know why. Do you have any idea?

Hi @mpalik,

Yes, your understanding is reasonable: the failing case is the specific combination of P3448-0000 + L4T 32.7.6 + your custom carrier board.

The reason it worked with L4T 32.7.2 is likely that the stock P3449 developer-kit BSP happened to be compatible enough with your custom carrier in that release. However, that does not mean the same stock BSP is guaranteed to work on a custom carrier across later L4T releases.

Between L4T releases, the bootloader, bootloader DTB, kernel DTB, pinmux, PMIC/I2C initialization, and flashing configuration may change. In your log, the board reaches TegraBoot and CBoot, then restarts during CBoot before the Linux kernel starts. So this still points to a bootloader/platform configuration dependency, not to a normal SD-card/rootfs issue.

For a custom carrier board, the expected path is to have a carrier-specific BSP for that exact module/carrier/L4T combination. Simply using the stock jetson-nano-devkit SD-card image means the bootloader and DTBs are still based on the NVIDIA P3449 carrier assumptions.

Recommendation:

For production or custom-carrier use, please continue with P3448-0002 and the corresponding custom carrier BSP. That is the recommended module path, and you already confirmed it works with L4T 32.7.6.

For isolation only, you can test the same P3448-0000 module with stock L4T 32.7.6 on the NVIDIA P3449 developer kit carrier. If it boots there, then the module, SD card image, and L4T 32.7.6 are OK, and the remaining difference is the custom carrier/platform configuration.

If you still need to use P3448-0000 on this custom carrier with L4T 32.7.6, then it should be treated as a custom BSP porting task for that exact combination. I do not think there is a simple flash.sh parameter or BOARDSKU change that can make the stock P3449 configuration valid for every custom carrier.

The relevant guide is still the Jetson Nano Adaptation and Bring-Up documentation:

Hope this clarifies the difference between “worked with one release” and “supported/validated for this custom carrier”.