Having recently upgraded to Ubuntu 22.04 LTS ( After the local power-company managed to destroy my HP ML350-G6 server, with a UPS installed, with a power surge or something – still no answers — 🙁 ) on a new more modern Desktop computer, I found some intermittent issues with my ESP32 / ESP8266 and Arduino boards… The Serial port would not work at all ( on devices with CH340G chips )…
A quick online search found the following, link to the original article here,
Instructions for Ubuntu 22.04 LTS x86_64
Get the currently installed kernel version:
sudo apt-get update -y sudo apt-get install neofetch -y neofetch
I think it came with Kernel: 5.13.8-...
Install latest kernel (GUI solution):
sudo add-apt-repository ppa:cappelikan/ppa sudo apt-get update -y sudo apt-get install mainline -y sudo apt autoremove -y
Run mainline and select the latest kernel (I tried, as of 16/05/2022, kernel version: 5.17.8-051708-generic
)
After installation and reboot, run neofetch
again and check if the latest linux kernel is loaded.
Install build tools (if not installed already):
sudo apt-get update -y sudo apt-get install build-essential dwarves dkms make cmake -y sudo apt autoremove -y
Install and fix CH34x drivers:
As per the guide here in sparkfun and https://github.com/juliagoda/CH341SER
git clone https://github.com/juliagoda/CH341SER cd CH341SER sudo make clean # The Makefile looks for vmlinux in a certain location (check that cat Makefile) # we need to move that # https://forum.proxmox.com/threads/kernel-module-not-found-when-compile-skipping-btf-generation.100974/ cp /sys/kernel/btf/vmlinux /usr/lib/modules/`uname -r`/build/ sudo make sudo make load lsmod | grep ch34* # NOTE: if other/prev ch34x drivers are loaded (and you know they were not working), then you can unload them by: sudo rmmod ch34x # Plug and unplug your CH340 device again on the USB port sudo dmesg # plug un-plug your device and then verify: ls /dev/tty* # make it accessible sudo usermod -a -G dialout $(whoami) sudo chmod a+rw /dev/ttyUSB0 # if /dev/ttyUSB0 was assigned # To unload: sudo rmmod ch34x # or sudo make unload
Disable some conflicting services.
It came out during my test, at least on my machine, a service for some external brail hardware was conflicting with the drivers. I saw that in sudo dmesg
... ch340 1-10:1.0: ch341-uart converter detected ... usb 1-10: ch341-uart converter now attached to ttyUSB0 . . . ... usb 1-10: usbfs: interface 0 claimed by ch341 while 'brltty' sets config #1 ... ch340-uart ttyUSB0: ch341-uart converter now disconnected from ttyUSB0
It was apearing and dis-appearing. so I tried to hunt the service as such:
sudo systemctl list-units | grep brltty
I then disabled it:
sudo systemctl stop <brl service name or other service that is interfering and not needed> sudo systemctl disable <brl service name or other service that is interfering and not needed> sudo systemctl mask <brl service name or other service that is interfering and not needed> for f in /usr/lib/udev/rules.d/*brltty*.rules; do sudo ln -s /dev/null "/etc/udev/rules.d/$(basename "$f")" done sudo udevadm control --reload-rules