Enable and Use UART0 (THS0) on Jetson Orin Nano

The Jetson I am using:
NVIDIA Jetson Orin Nano Engineering Reference Developer Kit Super - Jetpack 6.2 [L4T 36.4.3]

Hardware:

  • P-Number: p3767-0005
  • Module: NVIDIA Jetson Orin Nano (Developer kit)

Platform:

  • Distribution: Ubuntu 22.04 Jammy Jellyfish
  • Release: 5.15.148-tegra

I’m using the Jetson Orin Nano Dev Kit and I want to use UART0 (THS0) as a general-purpose UART for communication with a microcontroller.

When I check available UARTs, I only see:

$ ls -l /dev/ttyTHS*
crw-rw---- 1 root dialout 240, 1 Jun  4  2025 /dev/ttyTHS1
crw-rw---- 1 root dialout 240, 2 Jun  4  2025 /dev/ttyTHS2

There is no /dev/ttyTHS0 exposed.

  1. Do I need to modify the device tree to enable UART0/THS0, or is it already configured for user applications?
  2. What is the correct pinmux setting for UART0 on Orin Nano?
  3. Is there any difference between /dev/ttyS0, /dev/ttyTHS0, and /dev/ttyTCU0 in this context?

*** Please note that this reply is generated by LLM automatically ***

Based on the provided context, I’ll address your questions regarding the NVIDIA Jetson Orin Nano Developer Kit and UART configuration.

UART Availability and Configuration

You’ve mentioned that you only see UART2 and UART3 available on your Jetson Orin Nano Developer Kit, but not UART0. According to the documentation, UART0 is not exposed by default on the Jetson Orin Nano Developer Kit.

To use UART0, you would need to modify the carrier board or use an alternate configuration. The documentation doesn’t provide explicit instructions on how to enable UART0, but it does mention that the Jetson Orin Nano Series has a debug UART (UART2) that can be used for communication.

UART0 Pin Configuration

The correct pin configuration for UART0 on the Orin Nano module is not explicitly stated in the provided documentation. However, Table 12-13 in the documentation provides information on the Orin Module Debug UART Pin Descriptions, which includes UART2_RXD and UART2_TXD pins. Unfortunately, there is no information on UART0 pin configuration.

UART0 vs. UART2/UART3

In the context of the Jetson Orin Nano Developer Kit, UART2 and UART3 are exposed and can be used for communication with a microcontroller. UART0, on the other hand, is not exposed by default and would require modifications to the carrier board or alternate configuration to use.

There is no significant difference between UART0, UART2, and UART3 in terms of functionality. All three are general-purpose UARTs that can be used for communication. However, UART2 is specifically mentioned as a debug UART, which might imply that it’s intended for debugging purposes rather than general-purpose communication.

Recommendation

If you need to use a UART for communication with a microcontroller, you can use UART2 or UART3, which are exposed on the Jetson Orin Nano Developer Kit. If you specifically require UART0, you would need to investigate modifying the carrier board or finding an alternate configuration to enable it.

Keep in mind that modifying the carrier board or using an alternate configuration might require additional hardware or software expertise. It’s recommended to consult the official NVIDIA documentation or seek support from NVIDIA or a qualified expert if you’re unsure about the best approach.

*** Please give the thumbs up if you get answers you like. Or provide feedback to help us improve the answer. ***

Hi spacelabs.eon,

Please refer to https://elinux.org/Jetson/L4T/peripheral/#Mapping_3 for the UART mapping on Orin Nano.
Do you mean the UART interface from 40-pins expansion header?
If so, it should be /dev/ttyTHS1 in JP6.x.

Please use pinmux spreadsheet to configure their pinmux.

It means that they used the different UART driver,
ttyS0: legacy UART driver
ttyTHS0: Tegra High Speed UART driver
ttyTCU0: Tegra Combined UART

1 Like

yes, in jp 5.x, it was THS0 in 40 pin expansion header and its THS1 in jp 6.x :)

Hi
i am not using 40 pin header UART1, In my custom Carrier board UART0 is using for RS232 communication,i have made changes in dtb file now the THS0 is detecting but not working no Response sending and receiving.i have shared the logs and dts file once check it.

tegra232-p3767.txt (316.4 KB)
esl@ubuntu:~/Desktop$ ls -l /dev/ttyTHS*
crw-rw---- 1 root dialout 240, 0 Jul 10 18:21 /dev/ttyTHS0
crw-rw---- 1 root dialout 240, 1 Jun 4 19:47 /dev/ttyTHS1
crw-rw---- 1 root dialout 240, 2 Jun 4 19:47 /dev/ttyTHS2
esl@ubuntu:~/Desktop$ sudo dmesg | grep tty
[sudo] password for esl:
[ 0.002365] printk: console [tty0] enabled
[ 6.159244] printk: console [tty0]: printing thread started
[ 6.370746] 3100000.serial: ttyTHS1 at MMIO 0x3100000 (irq = 112, base_baud = 0) is a TEGRA_UART
[ 6.373502] 3140000.serial: ttyTHS2 at MMIO 0x3140000 (irq = 113, base_baud = 0) is a TEGRA_UART
[ 6.376106] 3110000.serial: ttyTHS0 at MMIO 0x3110000 (irq = 196, base_baud = 0) is a TEGRA_UART
[ 50.619084] systemd[1]: Created slice Slice /system/serial-getty.
esl@ubuntu:~/Desktop$ sudo systemctl status serial-getty@ttyTHS0
○ serial-getty@ttyTHS0.service - Serial Getty on ttyTHS0
Loaded: loaded (/lib/systemd/system/serial-getty@.service; disabled; vendor preset: >
Active: inactive (dead)
Docs: man:agetty(8)
man:systemd-getty-generator(8)
lines 1-6/6 (END)

Are you using the UART from M.2 Key E?

From the original post, you said that you are using the devkit.
But you said you are using the custom carrier board now. Which one is the truth?

We are not clear about your custom design.
Have you also used the scope to check if there’s any signal?

Yes, i am using UART from M.2 key E.

In Custum carrier board Urat0 for rs232 i want to test it first in devkit ,but it not posible so now i am working on custum carrier board where i have made changes in dtb. Now i can detect THSO but while when i send commands its not working

If you are using UART from M.2 Key E, then it should be /dev/ttyTHS0 read from your log.

What do you mean about “its not working”?
Have you gotten a scope and you don’t get any signal when you send data?

Have you also configured its pinmux from pinmux spreadsheet before use?

I checked the logs and confirmed:

[    6.376106] 3110000.serial: ttyTHS0 at MMIO 0x3110000 (irq = 196, base_baud = 0) is a TEGRA_UART

/dev/ttyTHS0 is present (from the M.2 Key E slot). However, when I send data over /dev/ttyTHS0, nothing is received on the connected device — no response is observed.

So far, I have not made any pinmux changes using the pinmux spreadsheet.

👉 Do I need to configure the pins in pinmux before UART0 (THS0) can function through the M.2 Key E?

If yes, could you please clarify:

  • Which columns in the pinmux spreadsheet need to be updated (Function, Direction, Pull, Voltage, etc.)?

  • How to generate the .dtsi/pinmux files from the spreadsheet and apply them on the Jetson Orin Nano?

It seems they are configured fro UART by default in pinmux spreadsheet correctly.
image
As a result, you don’t need to update them manually.

Could you get a scope and check if there’s any signal when you send the data?

You can also short UART0_TX and UART0_RX to verify loopback test before connecting with your serial device.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.