terça-feira, 18 de dezembro de 2007

Placa ZTE MF620 em Linux

Depois de alguma pesquisa verifiquei que é difícil colocar a funcionar, em Linux, a placa ZTE MF620 para acesso à Internet Móvel de Banda Larga. Esta placa é comercializada em Portugal pela TMN. Com alguma pesquisa e persistência lá consegui arranjar forma desta placa funcionar.
Aqui fica o testemunho que penso ser útil para comunidade linux.

Fiz testes com a placa nas seguintes distribuições e em dois computadores distintos (Portátil ACER 5601AWLMI e num desktop com Pentium IV a 3GHz e 1GB de RAM):
Funcionou em todas estas distribuições com pequenos ajustes. As diferenças estão relacionadas com os caminhos e com a instalação de pacotes (RPM vs DEB). A explicação seguinte aplica-se ao Ubuntu 7.10, no entanto, e como referi, com pequenas alterações a explicação serve para outras distribuições.

Breve explicação sobre a placa ZTE MF620

Quando esta placa é ligada à porta USB, seja em Windows ou em Linux (penso que em Mac OS X também, mas não pude testar), o sistema operativo reconhece um dispositivo de armazenamento onde estão os drivers da placa para Windows. Assim, para instalar esta placa, não é necessário nenhum CD nem outro suporte onde estejam os drivers. Para que esta placa funcione como modem de acesso à Internet é necessário alterar o seu modo de funcionamento, isto é, desactivar a sua função de dispositivo de armazenamento e colocá-la a funcionar como um modem USB. Estamos portanto na presença de uma placa que, do ponto de vista do sistema operativo, pode ser vista como dois dispositivos distintos. Esta alteração, no nosso caso, em Linux, é feita pelo programa USB_ModeSwitch.

E agora, mãos à obra...

Em primeiro lugar é necessário abrir uma consola, acessível através de Aplicações -> Acessórios -> Consola.
De seguida é necessário abrir uma sessão de superutilizador, o que pode ser feito com o comando:

$ sudo su -

Instalar o wvdial
Caso esta aplicação não esteja instalada é necessário fazer o seguinte:

# apt-get install wvdial


Instalar o gcom

Caso esta aplicação não esteja instalada é necessário fazer o seguinte:

# apt-get install gcom


Instalar o USB_ModeSwitch
Pode ser necessário instalar a libusb. Para isso é necessário executar o comando:

# apt-get install libusb-dev

Fazer download e compilar o USB_ModeSwitch

# wget http://www.draisberghof.de/usb_modeswitch/usb_modeswitch-0.9.2.tar.bz2
# tar -jxvf usb_modeswitch-0.9.2.tar.bz2
# cd usb_modeswitch-0.9.2
# ./compile.sh

Copiar ficheiros para a localização destino

# cp
usb_modeswitch /usr/sbin/

Configurações

É necessário editar o ficheiro /etc/wvdial.conf e colocar neste ficheiro o seguinte conteúdo

Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Modem Type = Analog Modem
; Phone =
ISDN = 0
; Username =
Init1 = ATZ
; Password =
Modem = /dev/ttyUSB0
Baud = 460800
[Dialer tmn]
Init2 = ATZ
Init3 = AT+CGDCONT=1,"ip","internet"
Stupid Mode = 1
ISDN = 0
Phone = *99***1#
Ask Password = 0
Modem = /dev/ttyUSB0
Username = tmn
Dial Command = ATD
Password = tmn
Baud = 460800

É necessário editar o ficheiro /etc/usb_modeswitch.conf e retirar os comentários na zona relativa à placa ZTE. O ficheiro fica com o seguinte conteúdo.

########################################################
# ZTE MF620 (Experimental)
#
# Message string taken from a sniffer log. Untested!
#
# Contributor: Flávio Moringa

DefaultVendor=0x19d2
DefaultProduct=0x2000

TargetVendor=0x19d2
TargetProduct=0x0001

MessageEndpoint=0x04
MessageContent="5553424308a0b7870000000000000600000000000000000000000000000000"

É ainda necessário criar o ficheiro /etc/udev/rules.d/15-zte-mf620.rules e colocar este conteúdo:

ACTION!="add", GOTO="ZTE_End"

# Is this the ZeroCD device?
SUBSYSTEM=="usb", SYSFS{idProduct}=="2000",
SYSFS{idVendor}=="19d2", GOTO="ZTE_ZeroCD"

# Is this the actual modem?
SUBSYSTEM=="usb", SYSFS{idProduct}=="0001",
SYSFS{idVendor}=="19d2", GOTO="ZTE_Modem"

LABEL="ZTE_ZeroCD"
# This is the ZeroCD part of the card, remove
# the usb_storage kernel module so
# it does not get treated like a storage device
#RUN+="/sbin/rmmod usb_storage"
RUN+="/usr/sbin/usb_modeswitch -d 1 -v 0x19d2 -p 0x2000 -V 0x19d2 -P 0x0001"

LABEL="ZTE_Modem"
# This is the Modem part of the card, let's
# load usbserial with the correct vendor
# and product ID's so we get our usb serial devices
RUN+="/sbin/modprobe usbserial vendor=0x19d2 product=0x0001",
# Make users belonging to the dialout group
# able to use the usb serial devices.
#MODE="660", GROUP="dialout"
MODE="660", GROUP="tty"

LABEL="ZTE_End"

Este ficheiro é necessário para que a detecção e activação da placa seja feita quando esta é ligada à porta USB

Estabelecer a ligação

Para estabelecer a ligação usam-se os seguintes comandos:

# /usr/sbin/usb_modeswitch -d 1 -v 0x19d2 -p 0x2000 -V 0x19d2 -P 0x0001
# /usr/bin/gcom -d /dev/ttyUSB0
# /usr/bin/wvdial tmn

O primeiro comando (dos três anteriores) é desnecessário, uma vez que a detecção é feita pelo udev. De qualquer modo, o próprio comando detecta se a placa já se encontra no modo desejado.

Dicas
É importante verificar se foram criados os devices necessários. Depois de ligar a placa à porta USB, esta operação demora cerca de 30 segundos. É necessário aguardar.

# ls /dev/ttyUSB*

Enquanto se aguarda a activação da placa pode ser útil monitorizar o ficheiro de logs.

# tail -f /var/log/messages

Inexplicavelmente, quando ligo a placa, algumas vezes ela não é correctamente reconhecida. Isto acontece quer em Linux quer em Windows. A forma que encontrei de resolver o problema consiste em desligar a placa do computador, retirar a bateria, voltar a colocar a bateria, e finalmente, voltar a ligar ao computador.

Referências:
USB_ModeSwitch
Post com informação importante
Página da TMN sobre a placa
Tutorial para instalação da placa