TX2 Update dtb using dd

I would like to update dtb file using dd command but have few questions.

kernel-dtb partition is /dev/mmcblk0p25
My dtb file tegra186-quill-p3310-1000-c03-00-base.dtb size is 216866 bytes.

Normally I copy this to Linux_for_Tegra/kernel/dtb and run the flash script to update dtb. This seems to be signing the dtb file and copies it to ‘Linux_for_Tegra/bootloader’.
Now the dtb size increased to 217008 bytes.

So we have,

  1. Linux_for_Tegra/kernel/dtb/tegra186-quill-p3310-1000-c03-00-base.dtb
  2. Linux_for_Tegra/bootloader/tegra186-quill-p3310-1000-c03-00-base.dtb

Q1. Do we need to do this signing process even if we try to use dd to update dtb file?

I read the kernel-dtb parition using dd,
sudo dd if=/dev/mmcblk0p25 of=tx2_dtb bs=512K count=1

In some other post it was mentioned that kernel-dtb partition is a binary copy of dtb file except that it is padded with zeros with block size of 512.

When I compared the file created using dd and the file in ‘Linux_for_Tegra/bootloadertegra186-quill-p3310-1000-c03-00-base.dtb’, the content matches upto 217008 bytes as expected but the rest of the content are non-zeros.

So if I write dtb file from ‘Linux_for_Tegra/bootloader/tegra186-quill-p3310-1000-c03-00-base.dtb’ with size as 217008, is this enough?

Does this work?
[1] sudo dd if=Linux_for_Tegra/bootloader/tegra186-quill-p3310-1000-c03-00-base.dtb of=/dev/mmcblk0p25 bs=512 count=1024 conv=sync
[2] sudo dd if=Linux_for_Tegra/kernel/dtb/tegra186-quill-p3310-1000-c03-00-base.dtb of=/dev/mmcblk0p25 bs=512 count=1024 conv=sync

I have not yet looked at the dtb format on R28.2, but typically the device tree itself stops at the first NULL byte at the end. After that there may be leftover data from previous content, or some other application may use this data (but the device tree itself would be complete at that point, so the “dtc” utility can convert this to “dts” format and would not care about what goes on after that first NULL byte).

I have never looked at the signing process so I don’t know if signing at the end has any effect or not.

@linuxdev,

It looks like if I simply dd the file then that is enough. I wanted to get some clarifications before I try, but I tried anyway and it is working.

I have used the file Linux_for_Tegra/kernel/dtb/tegra186-quill-p3310-1000-c03-00-base.dtb, and from the target,

  1. sudo dd if=tegra186-quill-p3310-1000-c03-00-base.dtb of=/dev/mmcblk0p25
  2. reboot

worked for me.

kernel-dtb partition number is different in R28.2

Hi,

I have tried the dd method and this doesn’t seem to work for me on 28.2.

I have also tried using flash script for updating the dtb.

The only way I can update my dtb for 28.2 is to flash the whole image with dtb using

sudo ./flash.sh jetson-tx2 mmcblk0p1

A quick question how does the tx2 pick up the new dtb? I know in previous version of Jetson, the extlinux.conf was used to point to the dtb.

Regards
Paul

“dd” worked for me for L4T28.1 but not L4T28.2.

For L4T 28.2, the following worked for me

sudo ./flash -r -k kernel-dtb jetson-tx2 mmcblk0p1

for TX2, or

sudo ./flash -r -k kernel-dtb jetson-tx2i mmcblk0p1

for TX2i

it uses dtb in:

Linux_for_Tegra/kernel/dtb

I found kernel DTB for L4T28.2 is in /dev/mmcblk0p26 for TX2 and TX2i. “dd” does not work because kernel DTB for L4T28.2 is encrypted.

Hi,
i also used dd in the past . but im working now with L4T 28.2 and the TX wont boot with a device tree, which is copied by dd.
i there a way to fix it? in not able to use the USB Cable and recovery mode. dtb change need to be done OTA via ssh like in the past.
thanks!

You need to use the flash tool since signing is required. If you were to flash and save the signed version, then dd should work by using this signed version instead of the original dtb which is not signed. I can’t tell you specifics though, I have not tried to do this.

ok thanks for clearing this. i hope there will be a solution in future.
bye