Este artigo é baseado na tradução do artigo "Winmódens - Comienza la pesadilla", publicado na revista Users Linux #4. Note que a tradução não foi feita "ao pé da letra", mas com objetivo principal de resgatar as informações mais importantes do artigo, de forma que possam ser entendidas por usuários que vierem a ler este texto.
Por se tratar de um artigo um pouco antigo, alguns drivers e links indicados podem estar desatualizados. Os procedimentos sugeridos não foram testados por aqui, mas o artigo pode ser de alguma ajuda quanto aos passos a serem seguidos na instalação de drivers para winmodens.Fizemos esta subjetiva e dramática introdução porque, em primeiro lugar, trata-se de um tema complicado, e também porque existem numerosos dispositivos de diferentes marcas disponíveis e todos muito distintos.
ALGUMAS DEFINIÇÕESQuando falamos de winmodens e de linmodens, estamos falando de dispositivos que têm capacidades inferiores às de um modem comum.
Um winmodem depende de software para funcionar. Desta maneira, por haver pouco "hardware" presente nesse aparato e muito "software", esses bichos feios são muito mais baratos e populares em comparação com um modem externo, que não necessita de drivers para emular as funcionalidades do hardware.
Pesquisando na internet, os leitores poderão ler que os winmodens são "um pouco menos" do que os modens comuns. Do ponto de vista de quem escreve esta nota, um winmodem pouco tem a ver com um modem comum (um cumprimento especial ao meu modem externo de cor salmão, 56 K Cirrus Logic). Um ponto a favor desses dispositivos é que são muito mais baratos, e algumas vezes o software custa bem menos que o hardware, mas nem sempre é assim. Finalmente, um linmodem é como um Linux, assim como um winmodem é como um Windows.
VAMOS À LUTA!Para começar, voltemos à minha nota sobre modens DSL USB, onde encontrarão uma coincidência. Poderão ver que, em ambos os casos, o primeiro passo que devemos dar é averiguar que chipset nosso winmodem possui. Se não soubermos qual o chipset e nos empenhamos a provar diversos drivers ao acaso, estaremos começando com o pé esquerdo. Já é incômodo fazer com que um winmodem funcione bem; imagine então o quão incômodo será querer fazê-lo funcionar com um driver para um chipset que não seja adequado. Então, teremos de averiguar qual é o chipset, lendo a documentação do nosso winmodem ou recorrendo à alguma ferramenta de diagnóstico que nos permita sabê-lo.
A FERRAMENTA SCANMODEM (SCANMODEM TOOL)No caso da segunda opção, nos remetemos a
linmodems.org, um excelente site com informações sobre modens e GNU/Linux, através do qual poderá baixar a ferramenta scanModem (
linmodems.technion.ac.il), a qual lhe permitirá saber qual é o chipset de seu modem.
Os passos que devemos seguir são: descarregar o código fonte da ferramenta, descompactá-lo, fornecer permissões de execução e executá-lo:
root@surviving$ gzip -d scanModem.gz
root@surviving# chmod +x scanModem
root@surviving# ./scanModemM
Tendo em conta que, embora me pareça importante explicar o uso básico desta pequena ferramenta que nos pode ser útil, não me interessa em absoluto basear esse texto nela. Entendam que podemos ser afortunados e saber qual o chipset de nosso modem, mas pode ocorrer que o scanModem não funcione como esperamos. Então, teremos que recorrer a outros recursos. É recomendável que leiam o howto sobre winmodens que circula na web, que pode perfeitamente complementar a informação exposta nestas linhas.
OUTROS CAMINHOS...Como ocorre algumas vezes, existem outros caminhos disponíveis, de modo que se não encontrarmos a informação desejada, os seguintes comandos com seus respectivos atributos possam, talvez, nos brindar com alguma informação. Para winmodens PCI, vemos que nos mostra a entrada correspondente aos dispositivos desse tipo no diretório
/proc/; para vê-la, executamos:
root@surviving$ cat /proc/pci
PCI devices found:
Bus 0, device 0, function 0:
Host bridge: nVidia Corporation nForce2 AGP (different version?) (rev 162).
Prefetchable 32 bit memory at 0xe0000000 [0xe3ffffff].
Bus 0, device 0, function 1:
RAM memory: nVidia Corporation nForce2 Memory Controller 1 (rev 162).
Bus 0, device 0, function 2:
RAM memory: nVidia Corporation nForce2 Memory Controller 4 (rev 162).
Bus 0, device 2, function 0:
USB Controller: nVidia Corporation nForce2 USB Controller (rev 164).
Outro comando que nos permite ver informação sobre os dispositivos PCI que temos em nossa máquina é o chamado
'lspci', que nos oferece uma saída similar à seguinte:
root@surviving:~$ lspci
00:00.0 Host bridge: nVidia Corporation nForce2 AGP (different version?) (rev a2)
00:00.1 RAM memory: nVidia Corporation nForce2 Memory Controller 1 (rev a2)
00:00.2 RAM memory: nVidia Corporation nForce2 Memory Controller 4 (rev a2)
00:00.3 RAM memory: nVidia Corporation nForce2 Memory Controller 3 (rev a2)
00:00.4 RAM memory: nVidia Corporation nForce2 Memory Controller 2 (rev a2)
00:00.5 RAM memory: nVidia Corporation nForce2 Memory Controller 5 (rev a2)
00:01.0 ISA bridge: nVidia Corporation nForce2 ISA Bridge (rev a4)
00:01.1 SMBus: nVidia Corporation nForce2 SMBus (MCP) (rev a2)
00:02.0 USB Controller: nVidia Corporation nForce2 USB Controller (rev a4)
00:02.1 USB Controller: nVidia Corporation nForce2 USB Controller (rev a4)
00:02.2 USB Controller: nVidia Corporation nForce2 USB Controller (rev a4)
00:04.0 Ethernet controller: nVidia Corporation nForce2 Ethernet Controller (rev a1)
00:08.0 PCI bridge: nVidia Corporation nForce2 External PCI Bridge (rev a3)
00:09.0 IDE interface: nVidia Corporation nForce2 IDE (rev a2)
00:1e.0 PCI bridge: nVidia Corporation nForce2 AGP (rev a2)
01:06.0 Multimedia audio controller: Creative Labs SB Live! EMU10k1 (rev 07)
01:06.1 Input device controller: Creative Labs SB Live! MIDI/Game Port (rev 07)
02:00.0 VGA compatible controller: nVidia Corporation NV18 [GeForce4 MX - nForce GPU] (rev a3)
Para dispositivos do tipo ISA, isto é, pnpdump, como definem os próprios desenvolvedores,
"ISA Plug-And-Play devices resource information", podemos obter dados de grande valor. Também podemos usar
isapnp.
root@surviving:~$ pnpdump
# $Id: pnpdump_main.c,v 1.27 2001/04/30 21:54:53 fox Exp $
# Release isapnptools-1.26
#
# This is free software, see the sources for details.
# This software has NO WARRANTY, use at your OWN RISK
#
# For details of the output file format, see isapnp.conf(5)
#
# For latest information and FAQ on isapnp and pnpdump see:
# http://www.roestock.demon.co.uk/isapnptools/
#
# Compiler flags: -DREALTIME -DHAVE_PROC -DENABLE_PCI -DHAVE_ SCHED_SETSCHEDULER -DHAVE_NANOSLEEP -DWANT_TO_VALIDATE
#
# Trying port address 0273
# Trying port address 027b
# Trying port address 0283
# Trying port address 028b
# Trying port address 0293
# Trying port address 029b
# Trying port address 02a3
# Trying port address 02ab
Finalmente, se nosso dispositivo é do tipo PCMCIA, o seguinte comando se adaptará às nossas necessidades:
root@surviving:~$ cardctl ident
no pcmcia driver in /proc/devices
Como podem ver, neste caso não há nenhum driver PCMCIA em minha máquina. E citando o exposto no Howto, também podemos nos valer de "fórmulas" mais gerais, com as seguintes:
~$ cat /proc/interrupts
CPU0
0: 8475499 XT-PIC timer
1: 24644 XT-PIC i8042
2: 0 XT-PIC cascade
4: 600566 XT-PIC serial
5: 0 XT-PIC ohci_hcd:usb1, ohci_hcd:usb2, eth0
7: 1 XT-PIC parport0
8: 3 XT-PIC rtc
9: 1 XT-PIC acpi
10: 2490 XT-PIC Trident Audio
12: 798874 XT-PIC i8042
14: 33253 XT-PIC ide0
15: 148184 XT-PIC ide1
NMI: 0
LOC: 0
ERR: 0
MIS: 0
Acima visualizamos o conteúdo do arquivo /proc/interrupts.
Outra opção é nos fixarmos nos logs que geram o kernel em
/var/log/messages.2, por exemplo, buscando com o comando
greep a cadeia de caracteres
'pci':
root@surviving:~$ cat /var/log/messages.2 | grep pci
May 24 22:03:08 surviving kernel: ehci_hcd 00:02.2: irq 3, pci mem cebb7000
May 25 12:00:27 surviving kernel: ehci_hcd 00:02.2: irq 3, pci mem cebb7000
May 25 19:03:51 surviving kernel: ehci_hcd 00:02.2: irq 3, pci mem cebb7000
UMA BOA FORMA DE SABER A VERSÃO DE UM PROGRAMA - SE DESCONHECEMOS A MANEIRA "LIMPA" DE FAZÊ-LO - É IR ATÉ O DIRETÓRIO /USR/DOC/ E VERIFICAR O CORRESPONDENTE A CADA SOFTWARE.
Façamos uma pequena pausa depois de ver tantos comandos e suas saídas. Os comandos expostos até o momento, com seus respectivos parâmetros, nos servem para encontrar informação sobre nosso winmodem, no caso em que o scantTool tenha falhado. A saída de cada um deles apresenta-nos muitos dados.
Primeiro vimos o que se passava quando tínhamos um dispositivo PCI usando o comando
'lspci' e analisando a informação da entrada correspondende á mesma plataforma, em /proc/pci (que visualizamos mediante o comando
cat ou, por exemplo, o comando
more, para maior comodidade). Finalmente, não deixem de experimentar a seguinte combinação do comando
lspci: "lspci - vv" e
scanpci.
Por outro lado, quando falávamos de dispositivos ISA - PnP, nos valíamos de comandos tais como
pnpdump e
isapnp. Finalmente, utilizamos
cardctl para dispositivos PCMCIA e dos logs gerados pelo kernel para encontrar informações sobre dispositivos PCI, por exemplo. Este último comando, tranquilamente, poderia adaptar-se a qualquer um dos outros.
PREPARAR O KERNELSuponhamos que em alguns dos métodos acima citados verificamos qual o chipset de nosso winmodem (que pode variar, inclusive, entre os mesmos fabricantes), e vimos que existe um driver para esse winmodem disponível para GNU/Linux. Bom, primeiro, tivemos sorte; segundo, o passo que devemos dar antes de compilar qualquer código fonte de driver é preparar o kernel, que deverá contar com os seguintes módulos ativos:
root@surviving$ lsmod
ppp_deflate 3512 1 (autoclean)
zlib_inflate 18980 0 (autoclean) [ppp_deflate]
zlib_deflate 18648 0 (autoclean) [ppp_deflate]
bsd_comp 4440 0 (autoclean)
ppp_async 7744 1 (autoclean)
ppp_generic 16380 3 (autoclean) [ppp_deflate bsd_comp ppp_async
slhc 5264 1 (autoclean) [ppp_generic
CHEGA DE TEORIA: VAMOS À PRÁTICAComo dissemos anteriormente, o objetivo desta nota é fornecer os conceitos gerais que permitam averiguar que chipset temos em nosso winmodem, para em seguida consultar, por exemplo,
linmodems.org e ver se existem drivers disponíveis. De qualquer maneira, vamos brindá-lo com uma brevíssima explicação acerca de como fazer funcionar os drivers para Linux dos winmodens com chipset Lucent Apollo (ISA) e Mars (PCI). Os modens Lucent AMR não são suportados pelo driver.
Respondendo àqueles que perguntarem por que escolhemos esse driver e não outro: este driver oferece seu código fonte, é especialmente designado para várias distribuições, e não devemos nos esquecer de que ele suporta kernels das séries 2.4.x e 2.6.x. Por fim, um dos fatores mais importantes que nos levaram a falar sobre drivers de modens deste fabricante é que a Lucente é a fabricante que tem maior quantidade de modens suportados por GNU/Linux em seus modelos: L56xAF, L56xL, L56xMF, L56xM+S e DSP1648.
Em continuação, encontrarão instruções, primeiro para núcleos da série 2.4 e, em seguida, para núcleos da série 2.6, ambos suportados por um mesmo driver.
Antes de mais nada, ocupemo-nos de contar com os requerimentos necessários para o driver funcionar:
Gcc 2.91.66, make 3.77, binutils 2.9.1.0.25, patch 2.5, util-linux 2.10o, modutils 2.4.0, e2fsprogs 1.19, pcmcia-cs 3.1.21 y ppp 2.3.11.
O próximo passo consiste em conseguir o código fonte correspondente à série 2.4.x, disponível em
www.heby.de/ltmodem, onde encontraremos diferentes versões do driver, em pacotes destinados a diferentes distribuições; assim como também arquivos binários e outros com o código fonte puro.
Uma vez descarregado o arquivo, no nosso caso, ltmodem-8.26a.tar.gz, descompactamo-lo; vamos até o diretório criado e executamos a ferramenta de detecção de modem (similar àquela antes mencionada) para ver se nosso winmodem é encontrado e conectado.
root@surviving:~$ cd ltmodem8.26a
root@surviving:~/ltmodem-8.26a$ ./ scanmodem
Os passos que devemos seguir para construir o módulo, instalar o modem e deixá-lo funcional são:
root@surviving:~$./build_module
root@surviving:~$./ltinst2
root@surviving:~$./autoload
Assim o modem estará instalado; só restará terminar alguns detalhes que vamos ocultar por uma simples questão de espaço, mas se chegaram até aqui, não terão maiores incovenientes.
Agora, se tivermos a má sorte de encontrar problemas, podemos testar os seguinte comandos para ver como nosso sistema está identificando o winmodem, em questão. Os dados obtidos podem ser úteis para saber, por exemplo, se nosso modem Lucent se encontra entre aqueles suportados pelo driver. Digitamos:
# lspci -v
00:0a.0 Communication controller: Lucent Microelectronics 56k WinModem (rev 01)
Subsystem: Lucent Microelectronics LT WinModem 56k
Data+Fax+Voice+Dsvd
Flags: bus master, medium devsel, latency 0, IRQ 12
Memory at da800000 (32-bit, non-prefetchable) [size=256]
I/O ports at b800 [size=8] I/O ports at b400 [size=256]
Capabilities: [f8] Power Management version 2
Não deixem de ler a documentação do driver, muito completa e, por certo, fundamental para o entendimento dessa nota. Em continuação, notem o "00:00a.0" entre os dados obtidos para poder voltar a buscar informações com o comando
lspci, desta vez com os argumentos
-nv:
# lspci -nv
00:0a.0 Class 0780: 11c1:0440 (rev 01)
Subsystem: 11c1:0440
Flags: bus master, medium devsel, latency 0, IRQ 12
Memory at da800000 (32-bit, non-prefetchable) [size=256]
I/O ports at b800 [size=8]
I/O ports at b400 [size=256]
Capabilities: [f8] Power Management version 2
Os modens suportados por ltmodem.o têm os seguintes números de identificação:

Ignorando o 0x, podemos ver que a ID 11c1:0442 se encontra com o termo (el rango) 11c1:0440-045c, que deveria ser suportado por ltmodem.o. Se os datos obtidos não coincidem com os presentes na tabela, lamentamos dizer que seu winmodem não é suportado pelo driver.
Agora vejamos como manejar com o driver correspondente à série 2.6.x. Necessitaremos do código fonte e do arquivo correspondente; podemos obtê-los de
linmodems.technion.ac.il/packages/ltmodem/kernel-2.6/, onde até o momento em que este artigo é escrito, o arquivo correspondente ao código fonte mais atualizado era ltmodem-2.6-alk-4a.tar.gz. Os requerimentos para a instalação do driver são:
a) Kernel 2.6.x (versões superiores a 2.6.6 todavia estão sendo testadas, mas devem funcionar).
b) Habilitar a opção serial_core dentro da configuração do núcleo Linux.
A primeira coisa que precisamos fazer é criar o dispositivo /dev/ttyLT0, no caso de ainda não o termos utilizado, por exemplo, na versão do driver para a série 2.4.x, já que estaria criado. Então executamos:
root@surviving$ mknod --mode=0640 /dev/ttyLT0 c 62 64
Em seguida trocamos o grupo e o dono para que coincida com /dev/ttyS0. Vemos o usuário e grupo que teremos de colocar:
root@surviving$ ls -l /dev/ttyS0
Agora criamos um link para o diretório /dev/modem:
root@surviving$ ln -s /dev/ttyLT0 /dev/modem
Trocamos o usuário e o grupo do dispositivo
/dev/ttyLT0:
root@surviving$ chgrp dialout /dev/ttyLT0
O passo seguinte é descompactar o código fonte em
/usr/src/modules:
root@surviving$ cd /usr/src/modules
root@surviving$ gzip -d ltmodem-2.6-alk-4a.tar.gz
root@surviving$ tar -xvf ltmodem-2.6-alk-4a.tar
root@surviving$ cd ltmodem-2.6-alk-4a
Efetuamos:
root@surviving$ make clean
Editamos o arquivo Makefile e trocamos a variável KERNEL_DIR: coloquemos, por exemplo,
"KERNEL_DIR:=usr/src/linux-2.6/", mediante:
root@surviving$ joe Makefile
E colocamos o correspondente na variável
KERNEL_DIR.
Outra maneira de fazer, sem editar o arquivo Makefile, é a seguinte:
root@surviving$ make KERNEL_DIR=/usr/src/kernel-2.6.6/
make -C /usr/src/kernel-source-2.6.6 SUBDIRS=/usr/src/
modules/ltmodem-2.6-alk-4 modules
make[1]: Entering directory `/mnt/compile/src/kernel-source-2.6.6'
CC [M] /usr/src/modules/ltmodem-2.6-alk-4/lt_modem.o
CC [M] /usr/src/modules/ltmodem-2.6-alk-4/serial.o
LD [M] /usr/src/modules/ltmodem-2.6-alk-4/ltmodem.o
LD [M] /usr/src/modules/ltmodem-2.6-alk-4/ltserial.o
Building modules, stage 2.
MODPOST
CC /usr/src/modules/ltmodem-2.6-alk-4/ltmodem.mod.o
LD [M] /usr/src/modules/ltmodem-2.6-alk-4/ltmodem.ko
CC /usr/src/modules/ltmodem-2.6-alk-4/ltserial.mod.o
LD [M] /usr/src/modules/ltmodem-2.6-alk-4/ltserial.ko
make[1]: Leaving directory `/mnt/compile/src/kernel-source-2.6.6'
Vemos os drivers:
root@surviving$ ls -l *.ko
Criamos o diretório para os drivers em /lib/modules/2.6.6/:
root@surviving$ mkdir /lib/modules/2.6.6/ltmodem
Agora copiamos os drivers até localização:
root@surviving$ cp *.ko /lib/modules/2.6.6/ltmodem/
Checamos as permissões, o nome do usuário e do grupo:
root@surviving$ ls -l /dev/modem /dev/ttyLT0
lrwxr-xr-x 1 root root 11 2004-10-18 23:15 /dev/modem ->
crw-r----- 1 root root 62, 64 2004-10-18 23:15 /dev/ttyLT0
Inserimos
lt_serial.ko, serial_core.ko e ltmodem.ko
root@surviving$ modprobe ltserial
Verificamos que foi carregado:
root@surviving$ lsmod
Module Size Used by
ltserial 6596 0
serial_core 22368 1 ltserial
ltmodem 567088 1 ltserial
Editamos o arquivo
/etc/wvdialconf, completando os campos correspondentes com os seguintes dados:
Dialer Defaults
Modem = /dev/modem
Baud = 115200
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
ISDN = 0
Modem Type = Analog Modem
; Phone =
; Username =
; Password =
Agora editamos o arquivo localizado em /etc/ppp/options, com os seguintes valores:
usepeerdns
asyncmap 0
auth
crtscts
lock
hide-password
modem
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
noipx
Um dos últimos passos que devemos dar é completar o arquivo /etc/modprobe.conf com estas linhas:
alias /dev/modem ltserial
alias char-major-62 ltserial
alias /dev/tts/lT0 ltserial
Agora tentamos nos conectar:
root@surviving$ wvdial &
Se tudo sair bem, só teremos que acrescentar nosso nome de usuário e senha quando for solicitado.
Para terminar a sessão do wvdial, escrevemos:
# fg wvdial
E terminamos pressionando CTRL+C.
CONCLUSÃONo início deste artigo explicamos diferentes maneiras de obter recursos para conhecer informações relevantes acerca de nosso winmodem. Em seguida vimos como configurar uma mesmo driver sob versões das séries 2.4.x e 2.6.x do kernel.
Não se trata de um tema simples, mas dando os passos corretos e da devida maneira, não deveríamos encontrar nenhum problema.
Lembrem-se de pesquisar, acumular a maior quantidade de informação disponível sobre o hardware que há na sua máquina e testar diferentes versões de um mesmo driver.
Desejamo-lhes boa sorte com sua nova conexão, e não deixem de consultar as listas de discussão relacionadas com o tema, onde sempre encontrarão pessoas dispostas a ajudar e sem os quais teria sido impossível escrever este artigo. Saudações a todos.
Juan Marcelo Rodríguez
SITES ÚTEIS
Listagem de modens PCI e suas relações com GNU/Linux
65.70.147.202:8080/gromitkc/pci_list.html
Listagem de chipsets e suas respectivas relações com GNU/Linux
65.70.147.202:8080/gromitkc/dips/roster.html
Excelente fonte de recursos disponíveis sobre winmodens
65.70.147.202:8080/gromitkc/winmodem.html
Winmodens e GNU/Linux
www.heby.de/ltmodem
Conhecido site sobre winmodens eGNU/Linux
www.linmodems.org