Integración y Compilación del Controlador USB-Serial CH340 en Linux

Contexto del Controlador CH340

El chip CH340 es un convertidor de USB a puerto serie ampliamente utilizado en placas de desarrollo y clones de Arduino. Aunque el fabricante proporciona un controlador base, las actualizaciones del kernel de Linux frecuentemente introducen cambios en las API internas que rompen la compatibilidad con el código fuente orignial, requiriendo parches manuales para su correcta compilación y funcionameinto.

Adaptación del Código Fuente para Kernels Recientes

Las versiones modernas del kernel de Linux han deprecado ciertas estructuras y han reorganizado las cabeceras. Para solucionar los errores de compilación relacionados con declaraciones implícitas y tipos desconocidos, se deben aplicar las siguientes modificaciones en el código fuente del controlador:

/* Inclusión de cabeceras para manejo de señales en kernels recientes */
#include <linux/sched/signal.h>

/* 
 * Actualización de la estructura de cola de espera.
 * El tipo wait_queue_t fue reemplazado por wait_queue_entry_t 
 * para evitar errores de tipo desconocido.
 */
wait_queue_entry_t wait;

Estos ajustes resuelven los errores de compilación implicit declaration of function ‘signal_pending’ y unknown type name ‘wait_queue_t’, garantizando que el módulo se construya sin advertencias tratadas como errores (-Werror).

Preparación del Entorno en Arch Linux

Para trabajar con placas compatibles con Arduino, es necesario instalar las toolchains de AVR y el IDE. Además, se debe gestionar adecuadamente el paquete de núcleos AVR para evitar conflictos con placas clonadas.

# Instalación de dependencias y herramientas de compilación AVR
sudo pacman -Syu --needed arduino avr-binutils avr-gcc avr-libc avrdude

# Eliminación del paquete oficial de núcleos si está presente (causa problemas con clones)
sudo pacman -Rns arduino-avr-core || true

# Asignación de permisos de puerto serie al usuario actual
sudo usermod -aG uucp,lock "$USER"
newgrp uucp

# Carga del módulo genérico CDC ACM como respaldo
sudo modprobe cdc_acm

Compilación, Carga y Persistencia del Módulo

Una vez obtenido el código fuente parcheado, se procede a compilar el módulo del kernel (.ko) y a configurarlo para que persista entre reinicios del sistema.

# Compilación limpia e inserción del módulo en el kernel
make clean && make
sudo insmod ch34x.ko

# Variables de entorno para la instalación persistente
KERNEL_VER=$(uname -r)
MODULE_DIR="/usr/lib/modules/${KERNEL_VER}/kernel/drivers/usb/serial"

# Compresión e instalación del módulo en el árbol de directorios del kernel
gzip -c ch34x.ko > ch34x.ko.gz
sudo install -Dm644 ch34x.ko.gz "${MODULE_DIR}/"

# Limpieza de módulos antiguos conflictivos y actualización de dependencias
if lsmod | grep -q ch341; then
    sudo rmmod ch341
    sudo mv "${MODULE_DIR}/ch341.ko.gz" "${MODULE_DIR}/ch341.ko.gz.bak" 2>/dev/null || true
    sudo depmod -a
fi

Verificación y Configuración del IDE

Tras conectar la placa al puerto USB, se debe verifiacr que el kernel ha reconocido el dispositivo y le ha asignado un nodo de dispositivo serie.

sudo dmesg | tail -n 20 | grep -i 'ch34\|ttyUSB'

Una salida esperada mostrará la detección del convertidor y su asignación a un puerto, por ejemplo: ch34x converter now attached to ttyUSB0.

En el IDE de Arduino, es crucial seleccionar el puerto /dev/ttyUSB0 en el menú de herramientas. Al gestionar las placas desde el "Boards Manager" interno del IDE (instalando "Arduino AVR Boards"), se asegura la compatibilidad con hardware clonado.

Conflictos con Paquetes de Repositorios Oficiales

Si se instala el paquete arduino-avr-core desde los repositorios oficiales de la distribución, el IDE añadirá una nueva categoría de placas (por ejemplo, "Arch Linux Arduino AVR Boards"). Esta variante está optimizada para hardware original y suele generar errores de sincronización o carga al intentar programar clones. Por este motivo, se recomienda encarecidamente utilizar las definiciones de placas descargadas directamente desde el gestor interno del IDE.

Limitaciones de Hardware

Este controlador presenta incompatibilidades conocidas a nivel de hardware con la placa Olimex ESP32-POE en su revisión C, por lo que no se recomienda su uso en dicho dispositivo específico.

Etiquetas: linux-kernel ch340 usb-serial arch-linux arduino-ide

Publicado el 7-25 21:43