SOR1(=DP1) for DP on Xavier

Hello everyone,

I would like to run an NX Xavier chip on the Orin Nano Devkit. This exercise allows me to make progress in the design of my custom board. More specifically, I am interested in activating the DisplayPort on channel DP1 via PinMux to use the DisplayPort of the Orin Nano Devkit.

I have reviewed this topic and this topic. I hope to use PinMux to generate the correct configuration. However, for DP1 channel, in the Xavier’s PinMux, I am not able to select anything other than an HDMI signal. What should I do?

Moreover, I believe it is crucial to pay attention to the configuration of these yellow-highlighted pins (tell me if not) but I’m not exactly sure what configurations assign to them.

Unfortunately, no test has been successful so far.


PS: To make progress, I have compared it with the PinMux available for the Orin. In this case, several sheets are available, including one configuration for HDMI and one for DP. The only difference to switch between them is to change the configuration like this:

Pin DP HDMI
77 DP0_TXDP2 HDMI0_TXDP2
75 DP0_TXDN2 HDMI0_TXDN2
71 DP0_TXDP1 HDMI0_TXDP1
69 DP0_TXDN1 HDMI0_TXDN1
65 DP0_TXDP0 HDMI0_TXDP0
63 DP0_TXDN0 HDMI0_TXDN0
83 DP0_TXDP3 HDMI0_TXDP3
81 DP0_TXDN3 HDMI0_TXDN3

Unfortunately, this option does not exist in the Xavier PinMux.

Pin DP HDM
100 DP_AUX_CH0_P I2C6_CLK
98 DP_AUX_CH0_N I2C6_DAT
96 DP_AUX_CH0_HPD GPIO3_PM.00

Jetson Orin NX & Jetson Orin Nano series modules are not pin-compatible with Jetson Xavier NX series modules, but you can design a carrier board for the I/Os they have in common, such that both modules are supported.
Jetson Orin Nano Series, Jetson Orin NX Series, and Jetson Xavier NX Series Interface Comparison & Migration Application Note

Thank you for your response. Regardless of the extent of compatibility, my issue is centered around the utilization of the DP1 channel for transmitting the DisplayPort signal on an NX Xavier. Based on my understanding, this process involves the PinMux, but the specific steps are not clear (as mentioned in my initial message).

I appreciate any assistance you can provide.

Hi,

We are talking about the hardware is not fully compatible…

It is totally not related to pinmux.

I understand very well. Let’s switch to a different use case so that you can better grasp my request. I want to design a custom carrier board that supports NX Xavier chip while routing the DisplayPort signal through DP1 channel.

Ok. Then you need to refer to this post.

For your case, you need to refer to DP0 device tree as example for your DP1.

It’s exactly what I’m trying to do, what a coincidence. Are you suggesting that I should modify the device tree directly without going through the pinmux?

In brief, you need to make both pinmux and device tree correct to make it work.

Here is the procedure (source) that I am using to try to make everything work:

  • Modify the pinmux configuration
  • Generate three .dtsi files
  • Use the pinmux-dts2cfg.py script to transform them into two config files to be placed in /bootloader/tt186ref/BCT/
  • Flash with this new configuration

So, it seems that the pinmux allows generating the correct configuration for the device tree through the .cfg files derived from the .dtsi files.

  1. Is there anything else to modify in the device tree? Should I recompile the kernel?

  2. And where can I find the exact location in the device tree files where DP0 and DP1 are described?

Hi,

Just to clarify. Pinmux is just a function to control pin. It has nothing else.
The format of pinmux is a cfg file from some dtsi files. They have nothing to do with kernel or the device tree I told.

The kernel driver is the one to decide whether you are using HDMI mode or DP mode. And the device tree I told is use to control kernel in this part.

Please download the kernel source code from website and go to xavier nx device tree first.

Also, you really need to find someone who has kernel device tree experience on your side. We really cannot teach you such Linux kernel knowledge from beginning.

Alright, I believe I now have all the necessary tools to successfully switch the display port to DP1.

Currently, what I am able to do is:

  • Modify the pinmux and generate a new configuration, placing it in /bootloader/tt186ref/BCT.
  • Adjust the device tree in the kernel source code, specifically modifying /source/public/hardware/nvidia/platform/t19x/jakku/kernel-dts/tegra194-p3509-disp.dtsi where I rely on the display port pattern as DPO to activate it on DP1, like this:
&sor0 {
	status = "okay";
	nvidia,active-panel = <&sor0_dp_display>;
	nvidia,sor-hdcp-not-supported;
};

&sor0_dp_display {
	status = "okay";
	nvidia,is_ext_dp_panel = <1>;
};

&sor1 {
	status = "okay";
	nvidia,active-panel = <&sor1_dp_display>;
	nvidia,sor-hdcp-not-supported;
};

&sor1_dp_display {
	status = "okay";
	nvidia,is_ext_dp_panel = <1>;
};

However, after flashing the new kernel with sudo ./flash.sh -r -k kernel-dtb jetson-xavier-nx-devkit-emmc mmcblk0p1, the status of /proc/device-tree/host1x@13e00000/sor1/hdmi-display/ remains ‘okay,’ and that of dp-display is still ‘disabled.’

I believe I have a good grasp of the entire toolchain to achieve my goals. I would just like to know which parameters to select in the pinmux and what further changes I need to make to the device tree, please.

Already a big thank you for the help you can provide me.

Hi,

I think the first question should be which jetpack version are you using… because the device tree is loaded from different place if the version is different…

You don’t really need to focus too much on pinmux. That is not your problem for now.

The situation is simple, your device tree didn’t get updated to the board…
It could be your dtb didn’t get your new change at all. It could also be your dtb get your new change but the board didn’t use it…

Thanks to your guidance, I was able to make progress!

For your information, I flashed my Xavier with JetPack 5.1.2.

My issue indeed stemmed from the fact that the board was not using the updated .dtb. I successfully addressed this issue. Now, the Xavier boots properly with the updated .dtb file. To confirm this, I retrieve the file /boot/dtb/kernel_tegra194-p3668-0001-p3509-0000.dtb. It’s the one present in the boot/extlinux/extlinux.conf file. I decompile it using the command dtc -I dtb -O dts -o output.dts kernel_tegra194-p3668-0001-p3509-0000.dtb. I can see that for &sor1, HDMI is ‘disabled’, and DP is ‘okay’. Excellent 😊

Now, when I connect my Xavier to a board with a physical HDMI on DP1, it no longer works. Excellent 😊

However, when I connect the Xavier to a board with a physical DP on DP1, no display appears. Not good 😥

Does my issue now stem from pinmux?
What would you suggest for debugging the situation?

Please share the dmesg with DP connected.

Here is the dmesg file.
dmesg.txt (65.4 KB)

Please really share the log with just one head enabled for now otherwise the logs of both heads would be mixed and hard to read.

Currently, the device is only connected to a single DP screen, and there are no other DP or HDMI ports available.

However, in the device tree of my NX Xavier, I haven’t disabled DP on the sor. Following your answer, I disabled head0 in the /jakku/kernel-dts/common/tegra194-p3509-disp.dtsi as follows:

&head0 {
    status = "disabled";
    nvidia,fb-bpp = <32>;
    nvidia,fbmem-size = <265420800>; /* 8K (7680*4320) 32bpp double buffered */
    nvidia,fb-flags = <TEGRA_FB_FLIP_ON_PROBE>;
    win-mask = <0x7>;
    nvidia,fb-win = <0>;
    nvidia,dc-connector = <&sor0>;
    nvidia,dc-flags = <TEGRA_DC_FLAG_ENABLED>;
  avdd_hdmi-supply = <&p3668_spmic_sd0>; /* 1v0 */
  avdd_hdmi_pll-supply = <&p3668_spmic_sd1>; /* 1v8 */
  vdd_hdmi_5v0-supply = <&p3509_vdd_hdmi_5v0>; /* 5v0 */
};

&head1 {
    status = "okay";
    nvidia,fb-bpp = <32>;
    nvidia,fbmem-size = <265420800>; /* 8K (7680*4320) 32bpp double buffered */
    nvidia,fb-flags = <TEGRA_FB_FLIP_ON_PROBE>;
    win-mask = <0x38>;
    nvidia,fb-win = <3>;
    nvidia,dc-connector = <&sor1>;
    nvidia,dc-flags = <TEGRA_DC_FLAG_ENABLED>;
    vdd-dp-pwr-supply = <&p3668_spmic_sd0>;
    avdd-dp-pll-supply = <&p3668_spmic_sd1>;
    vdd-edp-sec-mode-supply = <&battery_reg>;
    vdd-dp-pad-supply = <&battery_reg>;
    vdd_hdmi_5v0-supply = <&p3509_vdd_hdmi_5v0>;
};

&sor0 {
    status = "disabled";
    nvidia,active-panel = <&sor0_dp_display>;
    nvidia,sor-hdcp-not-supported;
};

&sor0_dp_display {
    status = "disabled";
    nvidia,is_ext_dp_panel = <1>;
};

&sor1 {
    status = "okay";
    nvidia,active-panel = <&sor1_dp_display>;
    nvidia,sor-hdcp-not-supported;
};

&sor1_dp_display {
    status = "okay";
    nvidia,is_ext_dp_panel = <1>;
};


&dpaux0 {
    status = "okay";
};

&dpaux1 {
    status = "okay";
};

&tegra_cec {
    status = "okay";
};

Additionally, I have chosen head1 because I noticed it is more associated with DP than HDMI through its properties:

vdd-dp-pwr-supply = <&p3668_spmic_sd0>;
avdd-dp-pll-supply = <&p3668_spmic_sd1>;
vdd-edp-sec-mode-supply = <&battery_reg>;
vdd-dp-pad-supply = <&battery_reg>;

Compared to head0:

avdd_hdmi-supply = <&p3668_spmic_sd0>; /* 1v0 */
avdd_hdmi_pll-supply = <&p3668_spmic_sd1>; /* 1v8 */
vdd_hdmi_5v0-supply = <&p3509_vdd_hdmi_5v0>; /* 5v0 */

Everything is flashed correctly on the card, and here is the dmesg:
dmesg.txt (64.3 KB)

Hi,

[ 6.639071] hpd: switching from state 0 (Reset) to state 1 (Check Plug)
[ 6.639105] hpd: state 1 (Check Plug), hpd 0, pending_hpd_evt 0
[ 6.644327] usb usb1: SerialNumber: 3610000.xhci
[ 6.645614] hub 1-0:1.0: USB hub found
[ 6.650433] hpd: switching from state 1 (Check Plug) to state 3 (Disabled)

Hotplug does not detect anything. Please check your pinmux setting is correctly set or not.
The hpd pin cannot be GPIO. Must be SFIO.

[Solution found] It works 🎉

Upon reviewing the PinMux spreadsheet, I confirmed that pin 96 is indeed configured correctly as DP_AUX_CH1_HPD (SFIO0).

Could you please verify whether the PinMux file provided to us aligns with the base configuration in the Jetpack? I assume it does not. I generated the .dtsi files using the basic PinMux spreadsheet and reprogrammed the card with this configuration.

After this modification, the DisplayPort worked correctly.

That’s a good thing accomplished. Thank you for your availability.


PS : If I may, could you provide a brief explanation regarding the difference between Xavier and Orin? Specifically, concerning the ability to choose different signals for HDMI and DP for Orin, while they are identical for Xavier (see my first message) ?