4K HDMI Capture Module based on TC358840

Hi

We have tested capturing with these devices:

- Nvidia Shield (1920x1080p60, 3840x2160p30)
- WD Live TV (1920x1080p60)
- GoPro Hero 4 (1920x1080p60)
- QuantumData 780B (all enabled formats)

The HDMI2CSI board acts like a HDMI sink and thus uses a EDID file to describe its capabilities. Supported formats that are currently enabled in the EDID:

16:9
    - 3840x2160p30
    - 1920x1080p24/25/30/50/60
    - 1280x720p30
64:27 ("21:9")
    - 1920x1080p29.97/30/60
    - 1280x720p29.97/30

You can always modify the EDID by editing and recompiling the tc358840 driver [1]. You could even choose custom resolutions with unusual apsect ratios.

But keep in mind the upper bandwidth limitation that is imposed by the Toshiba TC358840 bridge IC. Since it supports only HDMI 1.4b on the HDMI input, this is 3840x2160p30 or 4096x2160p24.

[1]

Hi kamm,

I was able to flash the latest APP and EBT image. I tried to get the 4K30 capture running with the gstreamer pipeline.

gst-launch-1.0 v4l2src device=/dev/video0 do-timestamp=true ! ‘video/x-raw, width=3840, height=2160, framerate=30/1, format=UYVY’ ! nvvidconv ! ‘video/x-raw(memory:NVMM), width=3840, height=2160, framerate=30/1, format=I420’ ! nvoverlaysink sync=false

But my output is as shown in this pic. I am using nvidia shield as the source.

External Media

If I use 1080P60 pipeline mentioned below, the output is proper.

gst-launch-1.0 v4l2src ! ‘video/x-raw, width=1920, height=1080, framerate=60/1, format=UYVY’ ! nvvidconv ! ‘video/x-raw(memory:NVMM), width=1920, height=1080, framerate=60/1, format=I420’ ! nvoverlaysink sync=false

I rebooted the source (NVidia Shield) and board to check if it is persistent. The issue was seen even after reboot.

Can you help me figure out the problem?

Hi

The HDMI2CSI driver does not restrict the allowed formats to what you specify in the GStreamer pipeline. So you have to “know” in advance, what format your HDMI source delivers.
The Nvidia Shield appears to be set to a fixed output of 1080p. If you connect the Shield directly to a HDMI TV/display, you can set the resolution in the menu:
Settings → HDMI → Resolution → 4K (30Hz)

After that you should be able to capture 4K from the Shield with the GStreamer pipeline you used.

Best Regards,
Tobias

Hi,

I changed the settings in Nvidia Shield to use best resolution, with that the above issue is solved.
Thanks frma.

But I see one more issue, the capture framerate is not reaching 30 fps. I increased log level in gstreamer and checked. This is the log

0:00:19.371860878 2229 0x51b850 INFO v4l2src gstv4l2src.c:810:gst_v4l2src_create: sync to 0:00:09.533333238 out ts 0:00:19.267669763

0:00:19.438720045 2229 0x51b850 INFO v4l2src gstv4l2src.c:810:gst_v4l2src_create: sync to 0:00:09.566666571 out ts 0:00:19.334439617

0:00:19.505633691 2229 0x51b850 INFO v4l2src gstv4l2src.c:810:gst_v4l2src_create: sync to 0:00:09.599999904 out ts 0:00:19.401431638

0:00:19.572287389 2229 0x51b850 INFO v4l2src gstv4l2src.c:810:gst_v4l2src_create: sync to 0:00:09.633333237 out ts 0:00:19.468018451

0:00:19.638856659 2229 0x51b850 INFO v4l2src gstv4l2src.c:810:gst_v4l2src_create: sync to 0:00:09.666666570 out ts 0:00:19.534630503

0:00:19.705544264 2229 0x51b850 INFO v4l2src gstv4l2src.c:810:gst_v4l2src_create: sync to 0:00:09.699999903 out ts 0:00:19.601285149

0:00:19.772124941 2229 0x51b850 INFO v4l2src gstv4l2src.c:810:gst_v4l2src_create: sync to 0:00:09.733333236 out ts 0:00:19.667899836

0:00:19.838807493 2229 0x51b850 INFO v4l2src gstv4l2src.c:810:gst_v4l2src_create: sync to 0:00:09.766666569 out ts 0:00:19.734614909

The difference between out ts gives the capture frame gap, it is usually 66ms. The capture seems to be happening at 15 fps. The played out video did not look smooth and hence i checked the capture framerate, which turns out to be 15 fps (occationally 33ms (30 fps)).

I checked the source by connecting it to a TV and that is giving out 4K30 consistently.

Does anyway know the solution to this issue?

Hi

The HDMI2CSI driver does not restrict the allowed formats to what you specify in the GStreamer pipeline. So you have to “know” in advance, what format your HDMI source delivers.
The Nvidia Shield appears to be set to a fixed output of 1080p. If you connect the Shield directly to a HDMI TV/display, you can set the resolution in the menu:
Settings → HDMI → Resolution → 4K (30Hz)

After that you should be able to capture 4K from the Shield with the GStreamer pipeline you used.

Best Regards,
Tobias

To the 15 FPS issue:

We have seen a similar issue:
After reboot and loading the driver, the first capture works as expected (e.g. 2160p30).
Subsequent captures appear to fall back to the half framerate.

Some workarounds we found:

  • Apply the performance scripts [1] or
  • Run all cores at full capacity “stress -c 4”
    Unforunately this does not increase the performance to stable 30 FPS (only something around 20-25 FPS).

We are investigating this problem. It appears to be related to our drivers, as it can not be reproduced with e.g. the CSI camera from Nvidia.

PS: You can also check the FPS as reported by the driver after a capture is finished (meaning the GStreamer pipeline is exited) with “dmesg | grep fps”

One more observation is that even on the first run, initially the capture framerate is as expected (i.e 4K30 and 1080P60) but after a while (around 5-6 min) the framerate drops to half. This is observed for 1080P60 capture as well, it runs at 1080P30.

Thanks kamm for the workarounds, I will try these and see if it helps.

Hi,

Does anyone know how to capture audio from this card?

It says audio is supported from R24.2.1. Is it a alsa source? can we use arecord?

Hi zeitgeist

Yes it is now possible to capture stereo audio on HDMI-In-B.
We have documented it here: captureHdmiAudio · InES-HPMM/linux-l4t Wiki · GitHub

Hi kamm,

Do you have any update on the 15 FPS (4K capture) issue which is explained in the above posts?
It would be good if you can share the plan for the resolution of the issue.
I have seen the issue with 1080p also. 1080p@60 capture gives 30fps.

Also, I would like to know where the issue is?
Is it that the video port is not able to detect and capture the frames at the right time?
Or Is it that the TC358840 IC it self is not giving the data at the right fps?

Thanks & Regards

Hi there

We intend to resolve this issue as soon as possible. Unfortunately I have to
work on a different project first, so I can only really work on this problem starting
in a week (30th of January).

We have observed the problem with the half frame rate to appear only ever in the
second capture that we start (per HDMI-In). The capture has been tested to run
at 2160p30 for 60 minutes. Then the capture was stopped and restarted. From this
point on all captures ran at 2160p15. We measured fps counter built in to the driver
and alternatively using the “out ts” produced by v4l2src in a GStreamer pipeline.

We have also confined the problem to our own driver (it does not appear with the
default Nvidia CSI camera that comes with the Jetson TX1).
Our current ideas are as follows:

  • The problem appears after the capture is halted and restarted. So there might be
    a problem with deinitialization in the driver
  • The framerate falls to exactly half (2160p30->2160p15, 1080p60->1080p30).
    Therefore it is plausible to think that there is a problem with the dual link capture
    on two CSI ports.
    The first thing I would look at in the code is the handling of syncpt values for the two
    CSI ports in the capture thread [1]. The syncpts are just counters, one for each CSI
    port. For each capture we wait for the syncpt on each port to get incremented
    (caused by the VI_MW*_ACK condition). Is it possible that after we stop a capture,
    the syncpt values on one (or both) of these counters are still incremented but not yet
    acknowledged?

Thats as much as I can say at the moment, I will look into the problem as soon as
possible.

Best Regards,
Tobias

[1]

The “frame rate falls to half in subsequent captures” issue has been resolved. The fix is described in [1].
The source code is available on our Github and a new pre-built image on the Wiki.

[1]
https://github.com/InES-HPMM/linux-l4t/issues/3

Hi Kamm,
Our team tried to flash prebuilt L4T 24.2.1 image from your Github fork on Jetson TX1. The script completed successfully, but HDMI-display connected to TX1 stays black after booting. We checked “EDID read” problem and disconnecting monitor during booting not successful.
Unfortunately at the moment we do not have USB Serial UART cable, we can not adequately check serial console.
Is there any way without the serial console to know what the problem is?

Best regards, Quantron Systems team.

Hi

This problem is difficult to debug without a Serial cable, but I can try to give you some pointers.
Generally the system might be stuck in U-Boot before the Linux kernel has been booted or Linux might have booted, but your monitor might not work.

For the monitor I would suggest to try with a different monitor. We had issues with certain TVs that caused the Linux kernel to crash while booting. Although in that situation there was at least some output on the monitor before it crashed.

So if you see absolutely nothing on the monitor it is possible that the system is stuck somewhere in U-Boot before even booting the Linux kernel.
Did you follow the complete procedure for flashing on [1] ? This includes flashing both the APP partition and the EBT partition (for U-Boot).

What version of L4T was running on your TX1 before you have flashed our pre-built image? Was it already at 24.2.1? If you were running an older L4T or if you have just taken the TX1 out-of-the-box, I would suggest to first flash the newest Jetpack to get you 24.2.1. After that you can flash our pre-built image again.

Hope this helps you. Unfortunately it is quite difficult to give a precise answer without serial debug capability.

Regards,
Tobias

[1]

Hi
We got serial cable, as a result it was found out that we were faced with the problem described in GitHub issue [1].
The solution proposed by Tkammacher was very helpful and now everything works fine.
We test video capturing as described in [2], it also works perfectly.

Now we are trying to use Live Camera Detection Demo from [3].
We tried different versions of LaunchStr modifications in camera/gstCamera.cpp.
In some cases, the pipeline does not set to state PLAYING, in others we see only a green screen and 0 bounding boxes in the output of the ./detectnet-camera

Has anyone tried to use the code from jetson-inference with hdmi2csi board and can help to make the correct LaunchStr for gstreamer?

[1] Fails to boot with prebuilt image · Issue #4 · InES-HPMM/linux-l4t · GitHub

[2] l4t_prebuilt_image · InES-HPMM/linux-l4t Wiki · GitHub

[3] GitHub - dusty-nv/jetson-inference: Hello AI World guide to deploying deep-learning inference networks and deep vision primitives with TensorRT and NVIDIA Jetson.

Unfortunately the driver is not quite compatible with the method of using Gstreamer/V4L2 as it is done in this jetson-inference code.

We have connected the HDMI2CSI board to a HDMI source (1280x720p60 UYVY) on input HDMI-In B.
The gst-camera application does work with the following modification.

$ git diff
diff --git a/camera/gstCamera.cpp b/camera/gstCamera.cpp
index 22e981e..7940da8 100644
--- a/camera/gstCamera.cpp
+++ b/camera/gstCamera.cpp
@@ -277,6 +277,7 @@ void gstCamera::checkBuffer()
 // buildLaunchStr
 bool gstCamera::buildLaunchStr()
 {
+
        // gst-launch-1.0 nvcamerasrc fpsRange="30.0 30.0" ! 'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, format=(string)I420, framerate=(fraction)30/1' ! \
        // nvvidconv flip-method=2 ! 'video/x-raw(memory:NVMM), format=(string)I420' ! fakesink silent=false -v
        std::ostringstream ss;
@@ -284,17 +285,18 @@ bool gstCamera::buildLaunchStr()
 //#define CAPS_STR "video/x-raw(memory:NVMM), width=(int)2592, height=(int)1944, format=(string)I420, framerate=(fraction)30/1"
 //#define CAPS_STR "video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, format=(string)I420, framerate=(fraction)30/1"
 
-       if( onboardCamera() )
+       if( false ) //onboardCamera() )
        {
                ss << "nvcamerasrc fpsRange=\"30.0 30.0\" ! video/x-raw(memory:NVMM), width=(int)" << mWidth << ", height=(int)" << mHeight << ", format=(string)NV12 ! nvvidconv flip-method=2 ! "; //'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, format=(string)I420, framerate=(fraction)30/1' ! ";
                ss << "video/x-raw ! appsink name=mysink";
        }
        else
-       {
+       {/*
                ss << "v4l2src device=/dev/video" << mV4L2Device << " ! ";
                ss << "video/x-raw, width=(int)" << mWidth << ", height=(int)" << mHeight << ", "; 
-               ss << "format=RGB ! videoconvert ! video/x-raw, format=RGB ! videoconvert !";
-               ss << "appsink name=mysink";
+               ss << "format=UYVY ! videoconvert ! video/x-raw, format=RGB ! videoconvert !";
+               ss << "appsink name=mysink";*/
+               ss << "v4l2src device=/dev/video2 ! video/x-raw, width=1280, height=720, framerate=60/1, format=UYVY ! videoconvert ! video/x-raw, format=NV12 ! videoconvert ! appsink name=mysink";
        }
        
        mLaunchStr = ss.str();

Basically we use a custom GStreamer pipeline with the input source set to /dev/video2 and the resolution set to 1280x720 (which is what the application seems to expect) and the correct format conversion.

Rebuild the application (make in the build directory) and start it with these commands:

$ sudo modprobe tc358840
$ DISPLAY=:0 aarch64/bin/gst-camera

Edit: removed ^M newline characters from diff

Hello kamm,

I recently bought your HDMI 2 CSI module for TX1.

I have tested your board with prebuild image “tx1_hdmi2csi_l4t_r24_2.1_g1685ac7”.
I have tested with another TX1(1080p60) as HDMI source and its working fine on both HDMI IN A & B.

But now i want to build kernel and create custom kernel image with R24.2.1.
I have downloaded source from GitHub - InES-HPMM/linux-l4t at hdmi2csi/l4t-r24-2.1

i followed below step

make O=$TEGRA_KERNEL_OUT tegra21_hdmi2csi_defconfig
make O=$TEGRA_KERNEL_OUT zImage
make O=$TEGRA_KERNEL_OUT dtbs
make O=$TEGRA_KERNEL_OUT modules

by above steps i’m getting kernel image.
But i am not able to find any “tegra210-jetson-tx1-p2597-2180-a01-devkit-hdmi-4k.dtb” as mentioned in customKernelCompilation · InES-HPMM/linux-l4t Wiki · GitHub

without replacing dtb,

  • on modprobe, i’m getting below error.
[   28.677060] tegra-vii2c 546c0000.i2c: no acknowledge from address 0x1f
[   28.677347] tegra-vii2c 546c0000.i2c: no acknowledge from address 0x1f
[   28.677626] tegra-vii2c 546c0000.i2c: no acknowledge from address 0x1f
[   28.677900] tegra-vii2c 546c0000.i2c: no acknowledge from address 0x1f
[   28.678109] tc358840 6-001f: i2c_rd: reading register 0x0 from 0x1f failed
[   28.685013] tc358840 6-001f: Invalid chip ID 0x0006
  • and in lsmod, showing tc358840 used by only 1, where as in your prebuild image its shown used by 2.

  • HDMI IN 2 error message.

148.072031] tegra_vi_channel_open: entered
[  148.072043] tegra_vi_channel_set_input: entered, got tegra_vi_input_id i=-1, old input was: -1
[  148.072050] tegra_vi_channel_set_input: available_input_count=3
[  148.080762] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.080774] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.080794] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.080799] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.080813] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.080828] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.080833] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.080844] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.080850] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.080859] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.080870] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.080876] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.080886] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.080892] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.080900] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.080911] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.080917] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.080927] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.080933] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.080941] tegra_vi_input_get_mbus_flags: Error: input or sensor not existent!
[  148.082389] tegra_vi_channel_set_input: entered, got tegra_vi_input_id i=-1, old input was: -1
[  148.082398] tegra_vi_channel_set_input: available_input_count=3
  • HDMI IN A, error message
[  230.681534] tegra_vi_channel_open: entered
[  230.685630] tegra_vi_channel_set_input: entered, got tegra_vi_input_id i=-1, old input was: -1
[  230.694385] tegra_vi_channel_set_input: available_input_count=3
[  230.704423] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.711168] video4linux video0: Failed to get the format struct for format YU12
[  230.719034] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.725102] video4linux video0: Failed to get the format struct for format YU12
[  230.732800] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.738814] video4linux video0: Failed to get the format struct for format YU12
[  230.746386] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.752393] video4linux video0: Failed to get the format struct for format YU12
[  230.760023] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.766020] video4linux video0: Failed to get the format struct for format YU12
[  230.773698] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.779710] video4linux video0: Failed to get the format struct for format YV12
[  230.787285] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.793321] video4linux video0: Failed to get the format struct for format YV12
[  230.800989] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.806986] video4linux video0: Failed to get the format struct for format YV12
[  230.814607] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.820643] video4linux video0: Failed to get the format struct for format YV12
[  230.828296] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.834298] video4linux video0: Failed to get the format struct for format YV12
[  230.841924] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.847959] video4linux video0: Failed to get the format struct for format BGR3
[  230.855587] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.861627] video4linux video0: Failed to get the format struct for format BGR3
[  230.869386] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.875383] video4linux video0: Failed to get the format struct for format BGR3
[  230.882991] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.889062] video4linux video0: Failed to get the format struct for format BGR3
[  230.896658] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.902696] video4linux video0: Failed to get the format struct for format BGR3
[  230.910454] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.916450] video4linux video0: Failed to get the format struct for format RGB3
[  230.924095] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.930128] video4linux video0: Failed to get the format struct for format RGB3
[  230.937741] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.943737] video4linux video0: Failed to get the format struct for format RGB3
[  230.951384] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.957412] video4linux video0: Failed to get the format struct for format RGB3
[  230.965120] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[  230.971166] video4linux video0: Failed to get the format struct for format RGB3
[  230.981001] tegra_vi_channel_set_input: entered, got tegra_vi_input_id i=-1, old input was: -1
[  230.989735] tegra_vi_channel_set_input: available_input_count=3

I found that, you are using tegra210-jetson-tx1-p2597-2180-a01-devkit-hdmi2csi.dtb & tegra210-jetson-tx1-p2597-2180-a01-devkit-hdmi2csi-hdmib-disabled.dtb in your prebuild image.

I tried to adding these two files in my rootfs and modifying extlinux.conf to use new dtb. But didn’t get any success.

So what i am missing in compiling custom kernel with your driver.??

Hi

After building the device tree with make O=$TEGRA_KERNEL_OUT dtbs there should be a device tree blob that contains the entries required for the HDMI2CSI board:
arch/arm64/boot/dts/tegra210-jetson-tx1-p2597-2180-a01-devkit.dtb

I suggest you copy this file to the TX1 in the /boot/ directory and give it a new name, we chose /boot/tegra210-jetson-tx1-p2597-2180-a01-devkit-hdmi-4k.dtb .

Then you can add an entry to the extlinux configuration file /boot/extlinux/extlinux.conf to boot your custom Kernel that you built previously and this new device tree. Note that the idea is that you copy your own kernel (arch/arm64/boot/Image) to the TX1 to this path: /boot/Image_hdmi2csi
In the example extlinux config below, the default is to boot the “selfmade” kernel for HDMI2CSI.

The additional entry that we have on the prebuilt image for “tegra210-jetson-tx1-p2597-2180-a01-devkit-hdmi2csi-hdmib-disabled.dtb” was to completely disable the HDMI-Input B. It is not necessary.

Example extlinux.conf:

TIMEOUT 30
DEFAULT hdmi2csi

MENU TITLE p2371-2180 eMMC boot options

LABEL primary
      MENU LABEL primary kernel
      LINUX /boot/Image
      INITRD /boot/initrd
      FDT /boot/tegra210-jetson-tx1-p2597-2180-a01-devkit.dtb
      APPEND fbcon=map:0 console=tty0 console=ttyS0,115200n8 androidboot.modem=none androidboot.serialno=P2180A00P00940c003fd androidboot.security=non-secure tegraid=21.1.2.0.0 ddr_die=2048M@2048M ddr_die=2048M@4096M section=256M memtype=0 usb_port_owner_info=0 lane_owner_info=0 emc_max_dvfs=0 touch_id=0@63 video=tegrafb no_console_suspend=1 debug_uartport=lsport,0 earlyprintk=uart8250-32bit,0x70006000 maxcpus=4 usbcore.old_scheme_first=1 lp0_vec=${lp0_vec} nvdumper_reserved=${nvdumper_reserved} core_edp_mv=1125 core_edp_ma=4000 gpt android.kerneltype=normal androidboot.touch_vendor_id=0 androidboot.touch_panel_id=63 androidboot.touch_feature=0 androidboot.bootreason=pmc:software_reset,pmic:0x0 net.ifnames=0 root=/dev/mmcblk0p1 rw rootwait

LABEL hdmi2csi
      MENU LABEL hdmi2csi
      LINUX /boot/Image_hdmi2csi
      INITRD /boot/initrd
      FDT /boot/tegra210-jetson-tx1-p2597-2180-a01-devkit-hdmi2csi.dtb
      APPEND fbcon=map:0 console=tty0 console=ttyS0,115200n8 androidboot.modem=none androidboot.serialno=P2180A00P00940c003fd androidboot.security=non-secure tegraid=21.1.2.0.0 ddr_die=2048M@2048M ddr_die=2048M@4096M section=256M memtype=0 usb_port_owner_info=0 lane_owner_info=0 emc_max_dvfs=0 touch_id=0@63 video=tegrafb no_console_suspend=1 debug_uartport=lsport,0 earlyprintk=uart8250-32bit,0x70006000 maxcpus=4 usbcore.old_scheme_first=1 lp0_vec=${lp0_vec} nvdumper_reserved=${nvdumper_reserved} core_edp_mv=1125 core_edp_ma=4000 gpt android.kerneltype=normal androidboot.touch_vendor_id=0 androidboot.touch_panel_id=63 androidboot.touch_feature=0 androidboot.bootreason=pmc:software_reset,pmic:0x0 net.ifnames=0 root=/dev/mmcblk0p1 rw rootwait

Does it work with your self-built device tree?

Actually that i have already tired before,

I have replaced zImage, Image and tegra210-jetson-tx1-p2597-2180-a01-devkit.dtb in /boot. And no change in extlinux.conf.

But this didn’t worked… !!
Still same error in modprobe.

[   39.963364] tc358840 6-000f: Device Tree Parameters:
[   39.963535] tc358840 6-000f: reset_gpio = 148
[   39.963634] tc358840 6-000f: interrupt = 424
[   39.963657] tc358840 6-000f: refclk_hz = 48000000
[   39.963679] tc358840 6-000f: ddc5v_delay = 50 ms
[   39.963698] tc358840 6-000f: enable_hdcp = 0
[   39.963718] tc358840 6-000f: csi_port = 3
[   39.963738] tc358840 6-000f: lineinitcnt = 4000
[   39.963757] tc358840 6-000f: lptxtimecnt = 4
[   39.963777] tc358840 6-000f: tclk_headercnt = 1573379
[   39.963797] tc358840 6-000f: tclk_trailcnt = 262149
[   39.963817] tc358840 6-000f: ths_headercnt = 851972
[   39.963836] tc358840 6-000f: twakeup = 16000
[   39.963856] tc358840 6-000f: tclk_postcnt = 10
[   39.963875] tc358840 6-000f: ths_trailcnt = 524294
[   39.963895] tc358840 6-000f: hstxvregcnt = 32
[   39.963913] tc358840 6-000f: pll_prd = 10
[   39.963932] tc358840 6-000f: pll_fbd = 125
[   39.963954] tc358840 6-000f: Releasing System Reset (gpio 0x0094)
[   39.964048] tc358840 6-000f: Chip found @ 7h0F (Tegra I2C adapter)
[   39.964524] tc358840 6-000f: TC358840 ChipID 0x47, Revision 0x00
[   39.967905] tc358840 6-000f: tc358840_sleep_mode(): disable
[   39.968622] tc358840 6-000f: tc358840_reset():
[   39.972462] tc358840 6-000f: tc358840_reset():
[   39.972871] tc358840 6-000f: tc358840_set_csi: Enabling CSI TX0
[   39.973905] tc358840 6-000f: tc358840_set_pll:
[   39.974194] tc358840 6-000f: tc358840_set_pll: Updating PLL clock of CSI TX0
[   39.974729] tc358840 6-000f: tc358840_set_pll: Updating PLL clock of CSI TX1
[   39.987167] tc358840 6-000f: tc358840_set_csi: Enabling CSI TX1
[   39.988194] tc358840 6-000f: tc358840_set_pll:
[   39.988748] tc358840 6-000f: tc358840_set_pll: Updating PLL clock of CSI TX1
[   40.006239] tc358840 6-000f: tc358840_reset_phy:
[   40.008848] tc358840 6-000f: tc358840_set_hdmi_hdcp: DUMMY disable
[   40.011966] tc358840 6-000f: tc358840_set_csi_mbus_config: YCbCr 422 16-bit
[   40.013697] tc358840 6-000f: tc358840_enable_interrupts: cable connected = 0
[   40.014849] tc358840 6-000f: tc358840_s_edid, pad 0, start block 0, blocks 2
[   40.014858] tc358840 6-000f: tc358840_disable_edid:
[   40.027830] tc358840 6-000f: tc358840xbg found @ 7h0F (Tegra I2C adapter)
[   40.028151] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[   40.028476] tc358840 6-000f: tc358840_g_mbus_config: Lanes: 0x08
[   40.028609] tc358840 6-001f: Device Tree Parameters:
[   40.028739] tc358840 6-001f: reset_gpio = 149
[   40.028795] tc358840 6-001f: interrupt = 425
[   40.028807] tc358840 6-001f: refclk_hz = 48000000
[   40.028819] tc358840 6-001f: ddc5v_delay = 50 ms
[   40.028829] tc358840 6-001f: enable_hdcp = 0
[   40.028840] tc358840 6-001f: csi_port = 1
[   40.028851] tc358840 6-001f: lineinitcnt = 4000
[   40.028862] tc358840 6-001f: lptxtimecnt = 4
[   40.028874] tc358840 6-001f: tclk_headercnt = 1573379
[   40.028885] tc358840 6-001f: tclk_trailcnt = 262149
[   40.028896] tc358840 6-001f: ths_headercnt = 851972
[   40.028906] tc358840 6-001f: twakeup = 16000
[   40.028918] tc358840 6-001f: tclk_postcnt = 10
[   40.028930] tc358840 6-001f: ths_trailcnt = 524294
[   40.028940] tc358840 6-001f: hstxvregcnt = 32
[   40.028951] tc358840 6-001f: pll_prd = 10
[   40.028964] tc358840 6-001f: pll_fbd = 125
[   40.028978] tc358840 6-001f: Releasing System Reset (gpio 0x0095)
[   40.029043] tc358840 6-001f: Chip found @ 7h1F (Tegra I2C adapter)
[   40.029219] tegra-vii2c 546c0000.i2c: no acknowledge from address 0x1f
[   40.029426] tegra-vii2c 546c0000.i2c: no acknowledge from address 0x1f
[   40.029628] tegra-vii2c 546c0000.i2c: no acknowledge from address 0x1f
[   40.029827] tegra-vii2c 546c0000.i2c: no acknowledge from address 0x1f
[   40.029897] tc358840 6-001f: i2c_rd: reading register 0x0 from 0x1f failed
[   40.037314] tc358840 6-001f: Invalid chip ID 0x0006

I think its problem of dtb file. A problem during initialization of the TC358840. This causes the driver to abort initialization of HDMI-A and HDMI-B.
describes in https://github.com/InES-HPMM/linux-l4t/issues/1

Do i need to update or modify U-Boot??

Because i am not using Jetpack to flash.

I am using Linux_for_Tegra (Tegra210_Linux_R24.2.1_aarch64.tbz2).
I replaced zImage, Image & driver modules.
And use scripts to flash image.

./apply_binaries.sh
./flash.sh jetson-tx1 mmcblk0p1

So do i need to flash using Jetpack before updating kernel image and dtb in /boot?