Detectar modem USB en Linux con reglas de udev

En la actualidad los dispositivos USB de banda ancha móvil (mobile broadband) se han hecho populares debido a su practicidad, la necesidad de movilidad y bajo costo. Estos dispositivos se distribuyen con el firmware integrado, en la mayor parte de las ocasiones, para MS Windws y Mac OS X. En Linux, aunque en versiones recientes de udev y network-manager se ha mejorado el soporte y algunas distribuciones ya incluyen reglas de identificación para los mismos, es necesario modificar el proceso de detección de los mismos.

Ingredientes

  • Linux con núcleo >=2.6.29
  • Udev con extras >=151
  • usbutils >=0.86

En Gentoo/Linux:

# echo 'sys-fs/udev extras' >> /etc/portage/package.use
# emerge \>=sys-kernel/gentoo-sources-2.6.29 \>=sys-apps/udev-151 \>=sys-apps/usbutils-0.86

Consideraciones Previas

Compruebe que el dispositivo no es detectado actualmente como modem serial ejecutando

$ dmesg | grep tty

Si en la salida puede ver algo como

usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0

o,

cdc_acm 3-1:1.10: ttyACM0: USB ACM device

entonces su dispositivo ya es detectado correctamente y no necesita modificar nada. Conectese usando network-manager o wvdial.

Si su dispositivo no está siendo detectado, será necesario crear una regla especial para udev.

Procedimiento

Determinar el identificador del vendedor y el del producto

Ejecutar

# lsusb
Bus 001 Device 113: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 002: ID 0c45:62c0 Bar Baz USB 2.0 Camera
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

La primera línea de la salida nos muestra el dispositivo que deseamos utilizar para conectarnos a internet. Tomamos nota de el ID del dispositivo, 12d1:1003. La primera parte, 12d1 es la identificación del vendedor, en este caso Huawei, y la segunda parte, 1003, es la identificación del producto. Estos dos atributos son suficientes para que udev reconozca el dispositivo.

Crear la regla de udev adecuada para el dispositivo

La regla de udev que crearemos está compuesta por dos atributos que deberán coincidir en el dispositivo, y una acción a ejecutar cuando ambos coincidan. Creamos un fichero en /etc/udev/rules.d/ con nombre 67-option-modeswitch.rules (no es obligatorio, solo afecta el orden de evaluación de la regla) y agregamos las siguientes líneas al mismo:

ATTRS{idVendor} == "12d1"
ATTRS{idProduct} == "1446"
RUN+="modem-modeswitch -v 0x%s{idVendor} -p 0x%s{idProduct} -t option-zerocd"

En RUN se cambia el modo del dispositivo para que funcione como modem con modem-modeswitch, parte de los extras de udev.

Reconectar el dispositivo

Desconecte y vuelva a conectar el dispositivo y compruebe con el procedimiento descrito en las Consideraciones Previas que su dispositivo es detectado como modem serial.

Nota: la detección del dispositivo puede tomar un tiempo mayor al que tomaría sin una regla udev.

Referencias