Tegra T30 - UB3_RXD pinmux

I do have an issue with RX pin not working for UART2(B) (0x70006040) on Tegra T30.

The Loopback mode works correctly. Moreover, TX works always (with enabled and disabled DMA - i.e. as ttyS3 and ttyTHS3).

In the TRM (DP-05644-001_v03p) there is a chapter: “34.5.5 COM-SLAVE Interface (UART B)” - “Table 93” - there is UB3_RXD signal. But this is all about it in the TRM.

The “UB3_RXD” also is not present in both Linux and u-boot sources.

Can anybody shed some light on this pin setup?

Hi, I’m the Toradex AI Assistant.

I might make mistakes. Our support team will step in if needed. If I answered your question, please tick the “Solution” checkbox. For follow-up questions to me, please use @ToradexAI in your post.

Did you like my answer? :+1: :-1:


Hello! Thank you for your detailed explanation. I can help clarify the UART2(B) RX pin setup on Apalis T30 (Tegra T30).

Summary of Signal Mapping

  • The UART2 interface (“UART2(B)”) at the Apalis connector actually maps to UART4 in the Tegra T30.
  • The RX pin for UART2(B) is:
    • Apalis X1 Pin 132 (“ULPI_DIR”)
    • Internally: UART4.A-RXD
    • Also referred to as GPIO-Y.01 and has alternative functions like SPI1.A-MISO.

Source:
Apalis T30 Module Pinout
Pin Multiplexing Table

Common Issues With RX Pin Not Working

Given that loopback works, your UART hardware (TX+RX) is likely functional, but the external RX path or configuration may be at fault.

Most often, RX issues are due to pinmux misconfiguration:

  • The Apalis T30 pins support multiple alternate functions.
  • By default, ULPI_DIR may be set as SPI or GPIO rather than UART.

What To Check & Do

  1. Device Tree / Pinmux Configuration

    Ensure your device tree or board initialization code configures the pin as UART4.A-RXD—not as SPI1 or GPIO.

    • For Linux Device Trees under the tegra30 SoC, find the pinmux section and set ULPI_DIR to the correct function (uart4 rxd).

    Example snippet:

    pinctrl-names = "default";
    pinctrl-0 = <&uart4_pins>;
    
    uart4_pins: uart4 {
        nvidia,pins = "ulpi_dir_pj01"; // corresponding to X1 pin 132
        nvidia,function = "uartd";     // 'd' is UART4 (SoC-specific convention)
        nvidia,pull = <0>;
        nvidia,tristate = <0>;
    };
    

    You may need to adjust according to your kernel’s pinmux syntax.

  2. Check for Conflicting Drivers

    • Make sure SPI/GPIO drivers aren’t claiming ULPI_DIR.
    • Only one function should be active per pin at any time.
  3. Verify at Runtime

    • With devmem2 or a similar tool, confirm that the Tegra pinmux register for ULPI_DIR is set for UART.
    • Investigate /sys/kernel/debug/pinctrl/ (if available) for the current pin state.
  4. Hardware Connections

    • Verify the external wiring to X1 pin 132.
    • Ensure TX/RX aren’t swapped and voltages are compatible.
  5. No Mention of UB3_RXD

    • “UB3_RXD” in the TRM corresponds to the UART B RX, which (on hardware) is routed via the Apalis pinout as described above.
    • In software (Linux/u-boot), it shows up as the RX pin for UART4 (ttyS3 or ttyTHS3), depending on DMA configuration.

Resources

If you need guidance for a specific BSP (Linux kernel version, Torizon, etc.), please provide more details so I can offer more targeted advice.

Best regards,
Toradex AI Assistant.

@ToradexAI - The UART base address is 0x70006040 - it is the UART-B in TRM
I’m using the T30 Colibri module, not Appalis.

The problem is that UART-B on Tegra T30 also is used with VFIR (IRDA) element.

Thanks for your response.

Please remember to tick the “Solution” checkbox below if my response solves your question. If you have follow-up questions, just continue to tag me using @ToradexAI in your new posts.

Did you like my answer? :+1: :-1:


Thank you for the clarification! You’re correct—UART base address 0x70006040 corresponds to UART-B in the Tegra T30 TRM, and you’re using the Colibri T30 module.

UART-B Pin Configuration on Colibri T30

For Colibri T30, UART-B (UART2 in some references) is available on the following pins (1):

  • UART_B_RXD: X1 Pin 36 (GMI_A17, GPIO-B.00)
  • UART_B_TXD: X1 Pin 38 (GMI_A16, GPIO-J.07)
  • UART_B_RTS: X1 Pin 34 (GMI_A19, GPIO-K.07)
  • UART_B_CTS: X1 Pin 32 (GMI_A18, GPIO-B.01)

VFIR/IrDA Conflict Issue

As you pointed out, UART-B can also be configured as a VFIR (Very Fast Infra-Red) interface, and this dual-purpose can lead to conflicts if the hardware or pinmuxing is not correctly set for normal UART operation (1).

If IrDA/VFIR mode is inadvertently enabled in the pinmux or registers, UART RX operation may be disrupted, while TX (and even loopback) could continue working. This is consistent with the symptoms you describe.

What to Check

  1. Pinmux Configuration
    Ensure that X1 Pin 36 (UART_B_RXD) is configured as the UART RX function and not as a GPIO, IrDA, or other alternate function. Misconfigured pinmuxing is a common cause of these symptoms.

  2. Register/Driver Settings
    Make sure UART-B is set up for normal UART operation, not IrDA mode. This is usually controlled by specific bits in the UART controller registers. Double-check that no IrDA/VFIR driver or overlay is loaded/configuring the peripheral.

  3. Device Tree Settings (Linux)
    Confirm the device tree selects the UART mode for the relevant pins and peripheral. If you’re using Torizon or a custom device tree, review the pin group and function assignments for UART_B.

  4. Test With Minimal Configuration
    As a troubleshooting step, try disabling any features that are not strictly necessary (e.g., DMA, IrDA, or extra pin functions) and test with a basic pinmux that only enables UART RX/TX on the expected pins.

Alternative UARTs

If this VFIR conflict proves difficult to resolve, you might consider using another UART (such as UART_A or UART_C) for your application, if that is an option on your design (1).

Summary

  • The root of your RX problem is likely the shared VFIR/IrDA functionality of UART-B on T30.
  • Carefully review pinmux and UART controller settings to ensure standard UART operation.
  • Consult the Colibri T30 datasheet and your module’s device tree to validate all relevant settings.

If you have your Linux device tree, pinmux settings, or relevant code snippets, feel free to share them for more targeted assistance.

Best regards,
Toradex AI Assistant.

@ToradexAI

Do you have maybe the information about pinmux for UB3_RXD (mentioned in TRM)
and about usage of COMM-SERIAL IP block (for UART-B) in Tegra T30?

Thanks for your response.

Please remember to tick the “Solution” checkbox below if my response solves your question. If you have follow-up questions, just continue to tag me using @ToradexAI in your new posts.

Did you like my answer? :+1: :-1:


Hello, thank you for your follow-up!

Regarding your questions:


1. Pinmux for UB3_RXD (UART-B RX) on Tegra T30 / Colibri T30

The UB3_RXD signal mentioned in the TRM (UART-B RX) maps, on the Colibri T30, to:

  • Colibri X1 Pin 36
  • Carrier Pin Name: UART_B_RXD
  • T30 Signal Name: GMI_A17
  • T30 GPIO Name: GPIO-B.00
  • Pinmux Function: This pin must be set to select the UARTB RXD (not GPIO, not VFIR, not any other alternate function).

Pinmux Reference

You can find the Colibri T30 pinout and multiplexing details here:

In your Linux device tree or board config (if applicable), ensure that the pingroup controlling GMI_A17 selects the UARTB RX function (for example, nvidia,function = "uartb";).


2. Usage of the COMM-SERIAL IP block for UART-B

The “COMM-SERIAL IP block” is the UART controller peripheral in the Tegra T30 silicon. On the T30, there are multiple UARTs, and UART-B is the hardware IP instance at base address 0x70006040.

  • In Linux, this typically shows up as /dev/ttyS1 or /dev/ttyTHS1 (THS = Tegra High Speed, used when DMA is enabled).
  • The driver handles both regular UART and the alternative VFIR/IrDA modes, but by default, standard UART mode is used.
  • For the UART-B RX to operate correctly, the pinmux must select the pure UART mode and not VFIR (IrDA). VFIR mode is a feature of the hardware, enabled by special register settings, but in standard Linux configurations, you should ensure only the UART functionality is enabled.

Linux Device Tree Mapping Example

When using the standard Linux serial driver on T30 SoC:

serial@70006040 {
    compatible = "nvidia,tegra30-uart", "nvidia,tegra20-uart";
    reg = <0x70006040 0x40>;
    interrupts = <...>;
    status = "okay";
    // ... other configuration ...
};

your_uartb_pins: pinmux_uartb {
    nvidia,pins = "gmi_a17";
    nvidia,function = "uartb";
    nvidia,pull = <0>;
    nvidia,tristate = <0>;
};

Adjust nvidia,pins and nvidia,function according to your Linux BSP conventions.

In summary:

  • UB3_RXD is a hardware name from the TRM illustrating the specific signal for UART-B RX.
  • On Colibri T30, gmi_a17 (X1 Pin 36) must be pinmuxed as “uartb.”
  • The COMM-SERIAL IP block is supported by standard Linux serial drivers; just ensure pinmux is correct and no IrDA/VFIR mode is set.

You can find general information on pinmux and UARTs for Colibri T30 at:

If you have issues with pinmux settings, double-check your device tree or kernel configuration for the correct nvidia,function on your target pins.

Best regards,
Toradex AI Assistant.

Hey @Lukasz,

The Tegra T30 reached End of Life (EOL) in 2022, we no longer support them and don’t maintain firmware for them anymore.

We suggest following the steps in our Migration Guide to migrate your project to a newer, supported module. If you have any questions or find any issues during the migration, you can create another thread and we’ll help you going through the process.

Best regards,

Hi @leonardo.costa.tx

Thank you for your reply. The problem is that the customer already uses other Toradex modules…
but there are some large number of Collibri T30 present on the “field”.

To make them still usable - one would need to “update” them. And during this work I’ve encountered the issue with UART-B configuration.

Hey @Lukasz,

Unfortunately we can not offer further support for Tegra modules. Please look at our list of partners for one who can help you debug the modules.

Feel free to ask me if you’re not sure about which partner to choose, we can point you directly to one of our partners.

Best regards,

Hi Leonardo,

I’ve asked very specific question regarding the documentation of the module - the information regarding UB3_RXD pin.

Anyway, thanks for trying to help me.