TC358743 in jetpack 6.2

Hello,

I’m trying to enable the TC358743 HDMI-to-CSI bridge driver on my NVIDIA Orin Nano Developer Kit running JetPack 6.2 (L4T R36.4.3, kernel 5.15.148-tegra).
Although the kernel source already includes the relevant files (drivers/media/i2c/tc358743.c, tc358743_regs.h, and include/media/i2c/tc358743.h), the default .config does not contain CONFIG_VIDEO_TC358743.

When I enable it manually using scripts/config --module CONFIG_VIDEO_TC358743, the option appears correctly in .config, but running make ARCH=arm64 olddefconfig removes it automatically. This means the option cannot persist through standard configuration regeneration.

I can compile the driver by manually adding obj-m += tc358743.o to the Makefile, but that approach bypasses Kconfig dependencies. Could you please advise why olddefconfig removes this option, which dependencies might be missing, and what the proper way is to enable this driver on JetPack 6.2?


$ sudo scripts/config --enable CONFIG_MEDIA_SUPPORT
$ sudo scripts/config --enable CONFIG_MEDIA_CONTROLLER
$ sudo scripts/config --enable CONFIG_VIDEO_V4L2
$ sudo scripts/config --enable CONFIG_VIDEO_V4L2_SUBDEV_API
$ sudo scripts/config --enable CONFIG_I2C
$ sudo scripts/config --enable CONFIG_MEDIA_CAMERA_SUPPORT
$ sudo scripts/config --enable CONFIG_DYNAMIC_DEBUG
$ sudo scripts/config --enable CONFIG_DEBUG_PINCTRL
$ sudo scripts/config --enable CONFIG_MODULE_FORCE_UNLOAD
$ grep TC358743 .config
CONFIG_VIDEO_TC358743=m
$ sudo make ARCH=arm64 olddefconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/confdata.o
  HOSTCC  scripts/kconfig/expr.o
  LEX     scripts/kconfig/lexer.lex.c
  YACC    scripts/kconfig/parser.tab.[ch]
  HOSTCC  scripts/kconfig/lexer.lex.o
  HOSTCC  scripts/kconfig/menu.o
  HOSTCC  scripts/kconfig/parser.tab.o
  HOSTCC  scripts/kconfig/preprocess.o
  HOSTCC  scripts/kconfig/symbol.o
  HOSTCC  scripts/kconfig/util.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#
$ grep TC358743 .config
$


I flashed the board and downloaded the kernel sources before running these commands.
The reason I followed this sequence is that I successfully enabled and built the TC358743 driver on JetPack 5.x using the same .config modification method, so I tried to apply the same approach here with JetPack 6.2.

Any insights on what changed in JetPack 6.x or how to properly enable this driver would be greatly appreciated.

You may need to implement a new driver follow below document for Jetson Orin.

Thank you for directing me to the Sensor Software Driver Programming guide.

I would like to clarify my setup and purpose: TC358743 is not a new sensor driver—it is already available in-tree in the JetPack 6.2 kernel sources (e.g. drivers/media/i2c/tc358743.c, tc358743_regs. h and include/media/i2c/tc358743.h) and the Kconfig symbol CONFIG_VIDEO_TC358743. My goal is not to write a new driver from scratch, but to properly enable the existing bridge/decoder driver on Orin (JP 6.2, L4T R36.4.3, kernel 5.15.148-tegra).

My observation is this: even if I manually set CONFIG_VIDEO_TC358743=m (or via scripts/config), then run make ARCH=arm64 olddefconfig, this option is deleted. In JP 5.x, the option could be persistent; in JP 6.x, the Media ancillary drivers → Video decoders submenu appears different/hidden, so the symbol cannot be permanently selected.

Can you advise on the correct way to keep the CONFIG_VIDEO_TC358743 option permanently enabled in JP 6.x?

Is there a recommended defconfig part (or NVIDIA’s preferred method) that enables the menu where TC358743 is located to be visible?

I also looked into this topic. When I run the commands below, I still cannot see the tc358743 driver in menuconfig.

$ cd /usr/src/kernel/kernel-jammy-src
$ sudo make ARCH=arm64 menuconfig

Do you confirm this driver compatible with JP5?

I would suggest download the kernel source code to build the ko file by add obj += tc358743.ko to ../drivers/media/i2c/MakefileMak

I could activate it directly from the .config file or menuconfig in jetpack 5.*. But I couldn’t find this configuration in Jetpack 6 either. I was not sure if editing it via the makefile is the correct method. So I asked. I’ll try it now.

Hello again
I’ve compiled the TC358743 driver as an out-of-tree module on JetPack 6.2 (L4T R36.x):

  • Added to drivers/media/i2c/Makefile:
obj-m += tc358743.o
ccflags-y += -I/usr/src/nvidia/nvidia-oot/include
  • Built and obtained tc358743.ko successfully (no full kernel or module rebuild yet).

  • Some outputs and commands are shown below:

  • $ modinfo tc358743
    filename:       /lib/modules/5.15.148-tegra/kernel/drivers/media/i2c/tc358743.ko
    license:        GPL
    author:         Mats Randgaard <matrandg@cisco.com>
    author:         Mikhail Khelik <mkhelik@cisco.com>
    author:         Ramakrishnan Muthukrishnan <ram@rkrishnan.org>
    description:    Toshiba TC358743 HDMI to CSI-2 bridge driver
    alias:          i2c:tc358743
    alias:          of:N*T*Ctoshiba,tc358743C*
    alias:          of:N*T*Ctoshiba,tc358743
    depends:        
    name:           tc358743
    vermagic:       5.15.148-tegra SMP preempt mod_unload modversions aarch64
    parm:           debug:debug level (0-3) (int)
    
    $ sudo dmesg | grep tc358743
    [sudo] password for adasi: 
    [ 6330.706555] tc358743: no symbol version for module_layout
    [ 6330.706873] tc358743: module verification failed: signature and/or required key missing - tainting kernel
    
    $ lsmod | grep tc358743
    tc358743               57344  0
    tegra_camera          217088  4 nvhost_isp5,nvhost_nvcsi_t194,tc358743,nvhost_vi5
    v4l2_dv_timings        36864  2 tegra_camera,tc358743
    v4l2_fwnode            20480  2 tegra_camera,tc358743
    v4l2_async             20480  3 v4l2_fwnode,tegra_camera,tc358743
    videodev              249856  5 v4l2_async,videobuf2_v4l2,tegra_camera,videobuf2_common,tc358743
    

    On JetPack 5.x I used to:

  1. patch nvidia/drivers/media/platform/tegra/camera/nvcsi/csi5_fops.c (mainly to set cil_config.mipi_clock_rate, cil_settletime, and lane polarity),
  2. rebuild the kernel/modules, and
  3. enable the bridge via DTB/DTBO. With that, /dev/video0/1 showed up and capture worked.
    On JetPack 6.2 I only have the .ko right now. I noticed csi5_fops.c isn’t in the kernel tree anymore but exists under NVIDIA OOT on the host sources:
./source/nvidia-oot/drivers/media/platform/tegra/camera/nvcsi/csi5_fops.c
  1. For JP6.2, is a device-tree overlay still required to make the TC358743 visible to the VI/NvCSI pipeline (i.e., create /dev/video*), assuming the module loads cleanly?
  2. Are any edits to csi5_fops.c (or its JP6.2 equivalent) still necessary, or should all timing/polarity be supplied via DT now?
    • On JP5.x I hard-set e.g.:
      • cil_config.mipi_clock_rate = 74250; (74.25 MHz)
      • cil_config.t_hs_settle from DT
      • lane_polarity (sometimes forced to 6) If JP6.2 expects these strictly from DT, could you point to the correct DT properties (and binding docs) that replace those manual edits?
  3. If a DT overlay is required on JP6.2, could someone share a minimal working DT/DTBO snippet for TC358743 (ports/endpoint, mclk, cil_settletime, lane_polarity, lane count, etc.)?
  4. Do I need to rebuild and install the NVIDIA OOT camera stack (not only my tc358743.ko) so that the NvCSI/VI side matches, or is loading tc358743.ko
    • DT overlay sufficient?
      Thanks a lot for any guidance or a reference DTS—much appreciated!

Suppose the DT should be the same with JP5 what you do before.

The kernel driver did move to nvidia-oot.

I am still having diffrent issue.
I build and boot a custom kernel on JetPack 6.2 (5.15.148-tegra) with CONFIG_DYNAMIC_DEBUG=y and a tc358743 bridge driver (=m). Everything is consistent and the module loads. As soon as I enable a DTBO through jetson-io.py, the next boot seems to use a different kernel where CONFIG_DYNAMIC_DEBUG is off, and I start getting many Unknown symbol __dynamic_* errors. This looks like Jetson-IO changes my boot entry in a way that boots a different Image. I used the tc358743.c file from this forum. I made minor changes to the dts file I also obtained from this forum. How can I keep my custom Image while using Jetson-IO overlays?

What I do (and it works before enabling the DTBO)

  1. Build in-tree from /usr/src/kernel/kernel-jammy-src and install:

    # .config (both trees synced): key options
    CONFIG_MODULE_FORCE_UNLOAD=y
    CONFIG_DYNAMIC_DEBUG=y
    CONFIG_DYNAMIC_DEBUG_CORE=y
    CONFIG_DEBUG_PINCTRL=y
    CONFIG_EXPERT=y
    # CONFIG_MEDIA_HIDE_ANCILLARY_SUBDRV is not set
    CONFIG_MEDIA_SUPPORT=y
    CONFIG_MEDIA_CAMERA_SUPPORT=y
    CONFIG_MEDIA_CONTROLLER=y
    CONFIG_VIDEO_V4L2_SUBDEV_API=y
    CONFIG_V4L2_FWNODE=y
    # save this file and run $ sudo make olddefconfig
    # After that I can see the TC358743 and change 
    CONFIG_VIDEO_TC358743=m
    
    
    sudo make -j"$(nproc)" Image modules
    sudo make modules_install
    sudo cp -f arch/arm64/boot/Image /boot/Image
    sudo depmod -a
    sudo update-initramfs -u -k "$(uname -r)"
    
    
  2. Reboot and verify I am indeed running this kernel (dynamic debug ON):

    $ uname -r
    5.15.148-tegra
    
    $ zcat /proc/config.gz | egrep 'DYNAMIC_DEBUG|VIDEO_TC358743'
    CONFIG_VIDEO_TC358743=m
    # CONFIG_VIDEO_TC358743_CEC is not set
    CONFIG_DYNAMIC_DEBUG=y
    CONFIG_DYNAMIC_DEBUG_CORE=y
    
    
  3. Load the module; no symbol/version errors at this point:

    sudo modprobe tc358743
    dmesg | grep -i tc358743   # (no errors)
    
    

Then I enable the DTBO via Jetson-IO → next boot looks like a different kernel

  • I compile my overlay and enable it:

    sudo dtc -@ -I dts -O dtb \
      -o /boot/tegra234-p3767-camera-p3768-tc358743.dtbo \
      tegra234-p3767-camera-p3768-tc358743.dts
    
    sudo /opt/nvidia/jetson-io/jetson-io.py
    
    
  • Jetson-IO updates /boot/extlinux/extlinux.conf.

    TIMEOUT 30
    DEFAULT JetsonIO
    
    MENU TITLE L4T boot options
    
    LABEL primary
          MENU LABEL primary kernel
          LINUX /boot/Image
          INITRD /boot/initrd
          APPEND ${cbootargs} root=PARTUUID=f0ad7f84-4b4f-4309-843d-8d700534fb5a rw rootwait rootfstype=ext4 mminit_loglevel=4 console=ttyTCU0,115200 firmware_class.path=/etc/firmware fbcon=map:0 nospectre_bhb video=efifb:off console=tty0 
    
    LABEL JetsonIO
    	MENU LABEL Custom Header Config: <CSI Camera TC358743-HDMI>
    	LINUX /boot/Image
    	FDT /boot/dtb/kernel_tegra234-p3768-0000+p3767-0000-nv.dtb
    	INITRD /boot/initrd
    	APPEND ${cbootargs} root=PARTUUID=f0ad7f84-4b4f-4309-843d-8d700534fb5a rw rootwait rootfstype=ext4 mminit_loglevel=4 console=ttyTCU0,115200 firmware_class.path=/etc/firmware fbcon=map:0 nospectre_bhb video=efifb:off console=tty0
    	OVERLAYS /boot/tegra234-p3767-camera-p3768-tc358743.dtbo
    
    
  • After rebooting with the DTBO enabled, dynamic_debug suddenly appears OFF and a lot of drivers print unknown symbols:

    $ zcat /proc/config.gz | egrep 'DYNAMIC_DEBUG|VIDEO_TC358743'
    # CONFIG_DYNAMIC_DEBUG is not set
    # CONFIG_DYNAMIC_DEBUG_CORE is not set
    
    # lots of these in dmesg:
    ipv6: Unknown symbol __dynamic_netdev_dbg (err -2)
    ipv6: Unknown symbol __dynamic_pr_debug (err -2)
    mc:   Unknown symbol __dynamic_dev_dbg (err -2)
    mc:   Unknown symbol __dynamic_pr_debug (err -2)
    ...
    
    

    This is exactly what happens when the kernel is built without dynamic debug but modules were built with it → symbol mismatch. However, prior to enabling the DTBO, I was running the custom image with dynamic_debug=. What could be the reason for this?

If needed I can attach:

  • The DT source I’m using: tegra234-p3767-camera-p3768-tc358743.dts

  • The bridge driver source I built as a module: tc358743.c

The LINUX /boot/Image show didn’t change that tell the same kernel Image.

You may confirm by uname -a to confirm the kernel.

$ date
Mon Oct 20 06:04:08 AM UTC 2025

Before The Installation:

$ uname -a
Linux jetson-nx 5.15.148-tegra 1 SMP PREEMPT Tue Jan 7 17:14:38 PST 2025 aarch64 aarch64 aarch64 GNU/Linux

After The Driver and Image Installation:

$ uname -a
Linux jetson-nx 5.15.148-tegra 1 SMP PREEMPT Mon Oct 20 05:03:21 UTC 2025 aarch64 aarch64 aarch64 GNU/Linux

I compiled the dts file:

$ sudo dtc -@ -I dts -O dtb \
  -o /boot/tegra234-p3767-camera-p3768-tc358743.dtbo \
  tegra234-p3767-camera-p3768-tc358743.dts
[sudo] password for adasi: 
tegra234-p3767-camera-p3768-tc358743.dts:16.19-29.15: Warning (graph_child_address): /fragment@0/__overlay__/ports: graph node has single child node 'port@0', #address-cells/#size-cells are not necessary
tegra234-p3767-camera-p3768-tc358743.dts:154.23-170.19: Warning (graph_child_address): /fragment@2/__overlay__/tc358743@f/ports: graph node has single child node 'port@0', #address-cells/#size-cells are not necessary

After Jetson-io Process:

$ uname -a
Linux jetson-nx 5.15.148-tegra 1 SMP PREEMPT Tue Jan 7 17:14:38 PST 2025 aarch64 aarch64 aarch64 GNU/Linux

You can save the Image “After The Driver and Image Installation” and restore it after jetson-io

I saved Image that you said. I copied that image back to the boot partition and rebooted. But

$ date
Mon Oct 20 06:24:04 AM UTC 2025
$ uname -a
Linux jetson-nx 5.15.148-tegra #1 SMP PREEMPT Tue Jan 7 17:14:38 PST 2025 aarch64 aarch64 aarch64 GNU/Linux
$ ls -lah /boot/Image 
-rw-r--r-- 1 root root 43M Oct 20 06:19 /boot/Image

I don’t understand why it’s booting from another image rather than the one under the boot image.

Do I need to change the DTB file under boot/dtb to load the module? I did not. I am only using the DTBO file.

Using the dtbo file should be fine.

This is happening because of the dtbo file (overlay). I tested it with the monitor. I saw the following message on the monitor during the reboot. I think my dts file may be causing the error. I shared the file here. I couldn’t see any errors while compiling.

L4TLauncher: Attempting Direct Boot
L4T boot options:
0: primary kernel
1: Custom Header Config: <CSI-Camera tc358743-1001>
   Press 0-1 to boot selection within 3.0 seconds.
   Press any other key to boot default (Option: 1)
L4TLauncher: Unable to boot via extlinux: Device Error
L4TLauncher: Attempting Kernel Boot
EFI stub: Booting Linux Kernel...
EFI stub: Using DTB from configuration table
EFI stub: Loaded initrd from LINUX_EFI_INITRD_MEDIA_GUID device path
EFI stub: Exiting boot services...

tegra234-p3767-camera-p3768-tc358743.dts.txt (6.9 KB)