Usbserial Modprobe Failure on Nvidia Jetson Orin Nano with Custom Carrier Board
Issue Overview
Users of the Nvidia Jetson Orin Nano with JetPack 5.1.1 and a custom carrier board are experiencing issues when attempting to add the usbserial module using modprobe. The error message reported by dmesg indicates that usbserial is "exporting duplicate symbol usb_serial_resume." This problem is preventing users from adding the ch341 driver module, which is believed to depend on usbserial. The issue persists even after a fresh installation using the manufacturer’s instructions, suggesting a potential problem with the custom image setup.
Possible Causes
-
Module/Kernel Version Mismatch: The error message suggests a discrepancy between the module and kernel versions, which is a common cause for such issues.
-
Custom Carrier Board Incompatibility: The use of a custom carrier board (specifically mentioned as "custom carrier board 7") may introduce hardware-specific issues that are not accounted for in the standard JetPack image.
-
Incorrect Device Tree Configuration: The custom carrier board may require specific device tree modifications to properly map hardware functions to the correct pins.
-
Duplicate Driver Inclusion: The error message indicates a duplicate symbol, which could be caused by multiple versions of the same driver being present in the system.
-
Improper Module Compilation: If the usbserial module was not correctly compiled for the specific kernel version and configuration, it could lead to symbol conflicts.
Troubleshooting Steps, Solutions & Fixes
-
Remove Duplicate Driver:
The first step is to remove the duplicate usbserial driver:sudo rm /lib/modules/5.10.104-tegra/kernel/drivers/usb/serial/usbserial.ko
After removing the file, reboot the system.
-
Install Updated Drivers:
If the above step doesn’t resolve the issue, download and install the updated drivers provided in the forum:sudo mv usbserial.ko /lib/modules/5.10.104-tegra/kernel/drivers/usb/serial/ sudo mv Image /boot/
Reboot the system after applying these changes.
-
Check Kernel Configuration:
Verify if the ch341 driver is already included in the kernel:zcat /proc/config.gz | grep -i 'ch341'
This will help determine if the driver is already available or needs to be added.
-
Investigate Device Tree:
If the ch341 UART is directly wired to a bus (not connected via USB), you may need to modify the device tree to announce the correct hardware address to the driver. Consult the carrier board documentation for specific pin mappings and required device tree changes. -
Kernel Module Compilation:
If the issue persists, you may need to recompile the kernel modules. This process involves:- Obtaining the kernel source code matching your JetPack version
- Configuring the kernel (use
zcat /proc/config.gz > .config
to start with the current configuration) - Building the modules with
make modules
- Installing the new modules with
make modules_install
-
USB Connection Verification:
If the ch341 device is connected via USB, ensure that it’s properly recognized by the system:lsusb
Look for entries related to the ch341 device.
-
Udev Rules Check:
Verify that the appropriate udev rules are in place for the ch341 device. You may need to create a custom udev rule if one doesn’t exist:sudo nano /etc/udev/rules.d/99-ch341.rules
Add a rule like:
SUBSYSTEM=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE="0666"
(Replace the vendor and product IDs with those specific to your ch341 device)
-
Carrier Board Documentation:
Consult the documentation provided by the custom carrier board manufacturer for any specific instructions or known issues related to serial communication or the ch341 driver. -
Kernel Log Analysis:
Monitor the kernel logs for more detailed error messages:dmesg | tail -n 50
Look for any messages related to usbserial or ch341 when attempting to load the modules.
-
Alternative Driver Versions:
If all else fails, consider trying different versions of the ch341 driver that may be compatible with your specific kernel and hardware configuration.
Remember to backup important data before making significant system changes, and always follow proper safety procedures when modifying kernel-level components.