Solution: Jetson Orin (Seeed A603) UART not receiving (Silent) after JetPack upgrade / PX4 TELEM2 connection

We experienced the exact same issue where the onboard UART (connected to PX4 TELEM2) was silent and not receiving any data, even though a 3-wire USB-TTL adapter worked fine.

We found that this is often caused by DMA configuration issues in the device tree (similar to recent JetPack/Orin serial port bugs). We resolved this issue by modifying the device tree (.dts) to disable DMA for the target UART node.

Here are the exact steps we took to fix it:

1. Modify the target UART node in temp.dts

Open your device tree source file:

Bash

sudo vi temp.dts

Press Esc and search for /dmas by typing:

/dmas

2. Comment out the dmas and dma-names lines

Locate the relevant lines under your UART node and comment them out like this, then save and exit (:wq):

DTS

/*
dmas = <&gpcdma 8>, <&gpcdma 8>;
dma-names = "rx", "tx";
*/

3. Compile the Device Tree

Convert the modified .dts back to a .dtb file:

Bash

sudo dtc -I dts -O dtb -o new.dtb temp.dts

4. Backup and Replace the Existing DTB File

(Note: Replace kernel_tegra234-p3768-0000+p3767-0000-nv.dtb with your specific DTB file name if it differs)

Bash

sudo cp kernel_tegra234-p3768-0000+p3767-0000-nv.dtb kernel_tegra234-p3768-0000+p3767-0000-nv.dtb.bak
sudo cp new.dtb kernel_tegra234-p3768-0000+p3767-0000-nv.dtb

5. Reboot the System

Bash

sudo reboot

After applying this fix, the UART port started receiving MAVLink data from PX4 TELEM2 successfully without any silence issues. Hope this helps anyone facing the same problem!

We had the exact same issue on our setup. This thread and the following NVIDIA developer forum discussion helped us resolve it:

PX4 Discuss: Jetson Orin NX (Seeed A603) header UART not receiving PX4 TELEM2

NVIDIA Developer Forums: UART serial port not working after upgrading to JetPack

We found that this is often caused by DMA configuration issues in the device tree (similar to recent JetPack/Orin serial port bugs). Instead of directly modifying the main DTB file (which can cause boot failures), we resolved this issue cleanly by applying a Device Tree Overlay (.dtbo) via extlinux.conf.

Here are the exact steps we took to fix it:

  1. Create the Overlay Source File

    Create a new overlay source file to target the specific UART node and disable its DMA properties:

Bash

sudo vi uart-overlay.dts

Add the following content (adjust the target path to match your specific UART node, e.g., serial@3140000), then save and exit (:wq):

DTS

/dts-v1/;
/plugin/;

/ {
    compatible = "nvidia,p3767-0000+p3768-0000", "nvidia,tegra234";

    fragment@0 {
        target = <&{/bus@0/serial@3140000}>; 
        
        __overlay__ {
            /delete-property/ dmas;
            /delete-property/ dma-names;
        };
    };
};
  1. Compile the Overlay

    Convert the .dts overlay file into a compiled binary .dtbo file with symbol support (-@):

Bash

sudo dtc -I dts -O dtb -o uart-overlay.dtbo -b 0 -@ uart-overlay.dts
sudo cp uart-overlay.dtbo /boot/
  1. Configure extlinux.conf to Load the Overlay

    Open the boot configuration file:

Bash

sudo vi /boot/extlinux/extlinux.conf

Under your LABEL primary section, add the FDT and OVERLAYS lines right below INITRD:

Plaintext

LABEL primary
   MENU LABEL primary kernel with UART overlay
   LINUX /boot/Image
   INITRD /boot/initrd
   FDT /boot/dtb/kernel_tegra234-p3768-0000+p3767-0000-nv.dtb
   OVERLAYS /boot/uart-overlay.dtbo
   APPEND ${cbootargs} root=/dev/nvme0n1p1 rw rootwait rootfstype=ext4 mce=0 console=ttyTCU0,115200 ...

Save and exit (:wq).

  1. Reboot the System

Bash

sudo reboot

After applying this fix, the UART port started receiving MAVLink data from PX4 TELEM2 successfully without any silence issues or boot loops. Hope this helps anyone facing the same problem!

Intermittent TX/RX Error Debugging Guide

1. Check the Target UART Device-Tree Node Path

Run the following command to find the exact node path for your target UART port:

Bash

readlink -f /sys/class/tty/ttyTHS1/device/of_node

This will output a path like /bus@0/serial@3100000. Note: The address may vary depending on your model/board, so always check it directly (do not guess or use hardcoded example values).

2. Create the Overlay Source

Create and edit the overlay source file:

Bash

sudo vi uart-overlay.dts

Add the following content:

DTS

/dts-v1/;
/plugin/;

/ {
    compatible = "nvidia,p3768-0000+p3767-0000", "nvidia,p3767-0000", "nvidia,tegra234";

    fragment@0 {
        target-path = "/bus@0/serial@3100000";

        __overlay__ {
            dma-names = "unused-rx", "unused-tx";
        };
    };
};
  • Use target-path (string path): While target = <&{/path}> (phandle reference) works syntactically, it is more fragile as it relies on symbol resolution.
  • Override dma-names: Overriding the DMA channel names with values different from what the driver expects ("rx"/"tx") causes name matching to fail. Once matching fails, the driver automatically falls back to non-DMA mode.
  • Leave dmas untouched: You don’t need to touch dmas since a failed name match prevents the subsequent array from being read.
  • Update the address: Make sure to replace serial@3100000 with the actual path verified in Step 1.

3. Compile and Verify

Compile the overlay and check the decompiled output:

Bash

sudo dtc -I dts -O dtb -o uart-overlay.dtbo -b 0 -@ uart-overlay.dts
sudo dtc -I dtb -O dts -f uart-overlay.dtbo

(The -f option ignores harmless __fixups__-related errors and forces output).

Crucial Check: Inspect the decompiled output to verify that dma-names = "unused-rx\0unused-tx"; actually exists inside the __overlay__ { } block. If it is empty, the overlay was not applied, and you must not proceed to the next step.

4. Deploy

Back up any existing file and copy the new overlay to the boot directory:

Bash

sudo cp /boot/uart-overlay.dtbo /boot/uart-overlay.dtbo.bak   # Backup if exists
sudo cp uart-overlay.dtbo /boot/uart-overlay.dtbo

Ensure that the following line exists under LABEL primary in /boot/extlinux/extlinux.conf (add it if missing):

Plaintext

OVERLAYS /boot/uart-overlay.dtbo
  • Note: Never touch the base FDT line. The original dtb remains untouched, meaning the system will still boot normally even if the overlay fails.

5. Reboot and Final Verification

Reboot the system:

Bash

sudo reboot

After rebooting:

Bash

# Check if the overlay took effect (verify if the property has been overwritten)
cat /proc/device-tree/bus@0/serial@3100000/dma-names

# Restart AMS and verify MAVLink reception
sudo systemctl restart ams
journalctl -u ams -f

If HEARTBEAT (id=0) prints regularly every second, the issue is resolved.

Troubleshooting

1. Decompilation Error: ERROR (property_name_chars): /__fixups__:... Bad character '/' in property name

This is not an issue with overlay compilation itself, but rather a cosmetic error that dtc encounters when converting __fixups__ (phandle reference resolution metadata) back to dts. Use dtc -I dtb -O dts -f to force output and inspect the actual contents.

2. dmas properties remain unchanged in /proc/device-tree/.../ after reboot

  • U-Boot/cboot overlay application logs often do not appear in Linux dmesg, so you cannot judge success/failure using dmesg | grep overlay. Always verify using live values in /proc/device-tree.
  • First, check if the md5sum of /boot/uart-overlay.dtbo matches the newly compiled file (the cp command itself may have failed).
  • Directly decompile the deployed file using sudo dtc -I dts -O dts -f /boot/uart-overlay.dtbo to check if the contents actually exist inside __overlay__. If it is empty, restart from the compilation stage (Steps 2–3).

3. Getty / Kernel Console might be hogging the same port

Though unrelated to DMA issues, it’s worth checking:

Bash

systemctl status serial-getty@ttyTHS1.service   # If active, the console is sharing the port
cat /proc/cmdline | grep console               # Check if an entry like console=ttyTHS1 exists