Issue with CH340 USB-to-Serial Converter Not Creating Device Files on Jetson Orin Nano Super

I am using a Jetson Orin Nano Super, and I am facing an issue with detecting and communicating with my Arduino board using the CH340 USB-to-serial converter. The system detects the CH340 converter at the USB level (confirmed by lsusb), but the corresponding serial device files (/dev/ttyUSB0 or /dev/ttyACM0) are not being created, preventing communication with the Arduino.

Details:

  • The device is detected by the system (lsusb shows: ID 1a86:7523 QinHeng Electronics CH340 serial converter), but no serial device files are created.
  • When running ls /dev/ttyUSB* or ls /dev/ttyACM*, the output shows that these device files do not exist.
  • I also attempted to check for the CH340 driver by running dmesg | grep ch34, but there was no relevant output indicating the driver is loaded.

Kernel Version:

  • I am using kernel version 5.15.148-tegra on the Jetson Orin Nano Super.

Hi abdirisak,

Are you using the devkit or custom board for Orin Nano?
What’s the Jetpack version in use?

Have you tried to load the driver for CH340 with the following command?

$ sudo modprobe ch340
$ lsmod | grep ch340

If it can not be loaded, please run the following command to check if it is enabled in kernel config.

$ zcat /proc/config.gz | grep CONFIG_USB_SERIAL_CH341

If not, please enable CONFIG_USB_SERIAL_CH341 in kernel config and update kernel image or kernel module.

Thank you for your support and suggestions. Here are the details of the issue I am facing:

I am using the Jetson Orin Nano Super DevKit from NVIDIA, and my JetPack version is 6.2.

I attempted to load the CH340 driver using the following command:


$ sudo modprobe ch340

However, I received the error:


modprobe: FATAL: Module ch340 not found in directory /lib/modules/5.15.148-tegra

Additionally, running lsmod | grep ch340 showed no output, confirming that the CH340 driver is not loaded.

I installed the CH341 driver through the kernel customization method described in the thread this link, but the issue persists.

When attempting to load the CH341 driver, I received the following error:


$ sudo modprobe ch341

modprobe: ERROR: could not insert 'ch341': Exec format error

This suggests a mismatch between the CH341 driver and the current kernel version.

I also checked the kernel configuration for the driver using:


$ zcat /proc/config.gz | grep CONFIG_USB_SERIAL_CH341

The output was:


# CONFIG_USB_SERIAL_CH341 is not set

Where was this module compiled? Natively on the Jetson? Or cross compile from a PC? Normally this implies the architecture is wrong, e.g., trying to load an x86 desktop PC module on an arm64 Jetson.

I compiled the module natively on the Jetson

I would suggest you updating kernel config in defconfig and built it into kernel image.
After replacing the kernel image on the devkit, zcat /proc/config.gz | grep CONFIG_USB_SERIAL_CH341 should shows CONFIG_USB_SERIAL_CH341=y at least.

Did you set ARCH during the build? If you did, then even if this is native, and even if it is correct as arm64, then this probably is the cause. If building natively, then do not specify ARCH. If you did not set ARCH during the native build, then something else is the issue.

Btw, if you do build this in and not as a module, then I suggest you rebuild all modules.

I initially downloaded the lower version of Jetson Linux from this source:
🔗 L4T R36.2.0

It did not work, so I decided to download and build using the latest version instead:
🔗 L4T R36.4.3

I am using JetPack 6.2, and after rebuilding, the problem was solved! 🎉

Thanks for the help! 😊

Even Raspberry Pi’s Linux ARM build includes the ch340 driver built into the kernel by default. I was hoping the Jetson linux kernel would also have it prebuilt, as this driver is widely used in the embedded field.

1 Like

Hi hui4,
Thanks for your suggestion, but sorry that it could not be enabled by default since we align to upstream kernel from JP6.x.

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