Instalar o CH340 no UBUNTU

1) Pré-requisitos

Instale ferramentas de compilação e cabeçalhos do kernel:

sudo apt update
sudo apt install -y git build-essential dkms \
  linux-headers-$(uname -r) kmod mokutil

O dkms é opcional, mas útil para recompilar o módulo após atualização de kernel.

2) Baixar o código-fonte

git clone -b ubuntu https://github.com/juliagoda/CH341SER.git
cd CH341SER

3) Compilar

make

Se tudo der certo, será gerado ./ch34x.ko.

4) (Opcional) Assinar o módulo para Secure Boot

Se o Secure Boot estiver ativado, o kernel só carrega módulos assinados.

4.1) Tentar assinar com MOK existente

Se seu sistema já possui uma chave MOK instalada (caminho padrão do Ubuntu):

sudo kmodsign sha512 \
  /var/lib/shim-signed/mok/MOK.priv \
  /var/lib/shim-signed/mok/MOK.der \
  ./ch34x.ko

4.2) Se não existir MOK (arquivos ausentes)

Crie e insira uma MOK (vai pedir senha e requer reboot para concluir o enrolment):

sudo mokutil --import /var/lib/shim-signed/mok/MOK.der
# ou gere uma nova chave:
# sudo update-secureboot-policy --new-key
sudo reboot

Depois do reboot (MOK enrolada), volte à pasta do projeto e rode a assinatura (4.1).


5) Carregar o módulo

sudo make load

Isso deve carregar ch34x (e usbserial como dependência).
Para descarregar depois: sudo make unload ou sudo rmmod ch34x usbserial.


6) Verificar se o dispositivo apareceu

  1. Conecte seu Arduino/dispositivo CH341 na USB.
  2. Verifique logs e dispositivos:
dmesg | tail -n 50
lsmod | grep ch34
ls -l /dev/ttyUSB*

Você espera ver algo como ttyUSB0 sendo criado.


7) Tornar persistente (opcional)

Alguns Makefiles têm alvo install. Se existir:

sudo make install
sudo depmod -a

Sem install, você pode copiar manualmente e carregar no boot:

sudo mkdir -p /lib/modules/$(uname -r)/extra
sudo cp ./ch34x.ko /lib/modules/$(uname -r)/extra/
sudo depmod -a
echo ch34x | sudo tee /etc/modules-load.d/ch34x.conf

Com DKMS (se suportado pelo repo), o módulo recompila após updates de kernel. Este projeto não traz dkms.conf oficial; dá para criar um, mas mantendo simples, o passo acima resolve.


Compatibilidade

  • Não é compatível com a placa Olimex ESP32-POE rev C.

Solução de Problemas

A) dmesg não mostra ttyUSB*, apenas:

usbserial: USB Serial support registered for ch34x
ch34x 3-2:1.0: ch34x converter detected

Possíveis causas e correções:

  1. Dependências ausentes (compilação incompleta)
    • Refaça os passos 1 e 3, garantindo build-essential e linux-headers-$(uname -r) instalados.
  2. Conflito de hardware (protoboard)
    • Se o Arduino está ligado a uma protoboard com jumpers, desconecte os fios (curto/conexão indevida pode impedir a enumeração correta). Conecte apenas via USB, teste novamente.
  3. Cabeçalhos do kernel faltando
    • Instale linux-headers-$(uname -r) e recompile: sudo apt install -y linux-headers-$(uname -r) make clean && make
  4. Secure Boot bloqueando o módulo
    • Assine o módulo (Seção 4) e recarregue: sudo make unload sudo kmodsign sha512 /var/lib/shim-signed/mok/MOK.priv /var/lib/shim-signed/mok/MOK.der ./ch34x.ko sudo make load
  5. Kernel sem CONFIG_USB_SERIAL_CH341 (desativado/ausente)
    • Verifique a config do kernel: zcat /proc/config.gz | grep CH341 # ou grep CH341 /boot/config-$(uname -r)
    • Se estiver desabilitado, o módulo externo ch34x.ko deve suprir. Se ainda assim não carregar, revise mensagens do dmesg e confirme a versão do kernel/headers.
  6. Permissões/Regra udev
    • Adicione seu usuário ao grupo dialout e reconecte: sudo usermod -aG dialout $USER sudo reboot
    • Depois do reboot, teste novamente ls -l /dev/ttyUSB*.

B) Comando úteis de diagnóstico

modinfo ./ch34x.ko
sudo modprobe ch34x
dmesg | tail -n 100
journalctl -k -b | grep -i ch34

Dicas finais

  • Sempre teste com outro cabo USB e outra porta.
  • Evite hubs USB sem alimentação ao usar placas que consomem mais corrente.
  • Para Arduino: desconecte tudo da protoboard, conecte apenas USB, identifique ttyUSB*, e só então reconecte os periféricos.

Este tutorial foi baseado na seguinte referencia.

https://github.com/juliagoda/CH341SER?tab=readme-ov-file#tutorial-on-ubuntu