Revista Do Linux
 
  
  
 

OUTRAS SEÇÕES
  Cartas
  Variedades
  Rádio Linux
  Mensagem ao Leitor
  CD do Mês
  Coluna do Augusto
  Dicas e Truques
  Opinião
 

SoftModems no Linux

Aprenda os passos necessários para instalar um SoftModem Motorola SM56 em versões recentes do Linux

Há mais ou menos um ano e meio, foi criado e amplamente divulgado na Internet um artigo sobre a instalação e configuração do modem Motorola sm56. Na época, o kernel 2.4.0 havia acabado de ser lançado, e a Motorola lançou o driver para esse modem, testado única e exclusivamente com o Red Hat Linux 7.1. Acontece que, como é costume no mundo do Software Livre, as coisas andam depressa e, a cada semana, surgem atualizações e correções. Infelizmente, a Motorola não conseguiu acompanhar o mesmo ritmo, por falta de interesse ou por outro motivo qualquer.

O que realmente importa é que vários usuários ficaram sem suporte, quando viram que o driver não funcionava nas versões de kernel mais recentes que a 2.4.5. Na época, recebi vários e-mails (e continuo a recebê-los) pedindo mais detalhes sobre como instalar e fazer funcionar tal modem. Agora, com a ajuda de alguns amigos, é finalmente possível configurar o modem para que ele funcione em um kernel diferente do 2.4.5.

O que é necessário?

Vá à página da Motorola (www.motorola.com) e faça download do driver Linux para seu modem (veja link no box Para saber mais). Agora você precisará determinar qual versão do Kernel Linux seu sistema está usando. Para isso use o comando uname -r.

Se a versão do seu kernel for 2.4.5 ou inferior (até 2.4.0), continue lendo. Se for superior à 2.4.5, pule para a seção Se seu Kernel é mais recente que o 2.4.5. e volte aqui após completar todos os passos lá descritos.

Kernel 2.4.5

Instale o driver, com o comando rpm -ivh sm56xxxx-i386.rpm. Em seguida, digite man sm56 e procure qual o código de seu país. A lista (aqui resumida) é um pouco extensa:

1 = USA
2 = Canada
...
54 = Argentina
55 = Brazil
57 = Columbia
58 = Venezuela
...

Digite sm56setup, seguido do código do seu país. Ou seja, para o Brasil, o comando é sm56setup 55. Se o código for omitido será atribuído ao driver o código padrão: 1 (USA).

O comando sm56setup compila o módulo do kernel que controla o modem, que será instalado em /lib/modules/[seu kernel]/kernel/drivers/char. O comando também modifica o arquivo /etc/modules.conf, que ficará assim:

...
alias char-major-24 sm56
options sm56 country=1
...

Ele também cria um dispositivo em /dev, chamado sm56, criando um link para o /dev/modem, que aponta para este dispositivo, além de ajustar as permissões adequadas.

Com o módulo compilado, digite modprobe sm56 e pronto, seu modem está instalado!

Se seu Kernel é mais recente que o 2.4.5

Primeiramente, quero agradecer ao meu amigo Massimiliano Mirra, que me enviou esta dica. Se você está usando uma distribuição moderna, como Conectiva Linux 8.0, Red Hat Linux 8.0, Mandrake Linux 9.0 ou Slackware Linux 8.1, saiba que o modem sm56 pode funcionar sob um kernel mais recente. Para isso serão necessárias algumas modificações no código-fonte do kernel, que também deve ser recompilado.

Você vai precisar de um ambiente de desenvolvimento GNU completo instalado em seu sistema. Verifique se o compilador (GCC) está instalado com o comando rpm -qa | grep gcc. Faça o mesmo para o cpp: rpm -qa | grep cpp.

Você também vai precisar do código fonte do kernel (geralmente o pacote se chama kernel-source ou algo parecido), das ferramentas make, autoconf, automake, tcl e da biblioteca ncurses. Por precaução, instale também os pacotes nasm e binutils, se já não estiverem presentes em seu sistema.

Vá até onde o código-fonte do kernel está instalado (geralmente /usr/src/linux-2.4.X) e entre no diretório mm. Neste diretório está o código para o tratamento da memória. Procure um arquivo chamado slab.c e abra-o com seu editor de textos favorito. Vá até a linha 1116 e comente-a. Ela está assim:

if (flags & ~(SLAB_DAM|SLAB_LEVEL_MASK|SLAB_NO_GROW))
        BUG();
e deve ficar assim:

/* if (flags & ~(SLAB_DAM|SLAB_LEVEL_MASK|SLAB_NO_GROW))
        BUG(); */

Salve o arquivo e vamos recompilar o kernel. Digite make menuconfig. Surgirá um menu para que você possa configurar seu kernel. Recomendo que você o deixe o mais enxuto possível. Compile otimizações para seu processador e retire recursos desnecessários, como suporte a hardware que você não tem. Quando em dúvida sobre algum item, compile-o como módulo.

Com tudo ajustado, saia do configurador do Kernel (opção EXIT), salve suas alterações e compile o kernel, com o comando:

$ make dep bzImage modules modules_install

Isso irá compilar, na seqüência, as dependências, a imagem do kernel e os módulos (que serão instalados pelo modules_install). Pode ir tomar um cafezinho, já que dependendo do porte de sua máquina, esse processo pode demorar.

Terminado o comando anterior, o seu kernel estará em /usr/src/linux-2.4.X/arch/i386/boot, com o nome de bzImage. Copie-o para o diretório /boot, dando-lhe um outro nome como, por exemplo, vmlinuz-custom. Copie também o System.map, que está em /usr/src/linux-2.4.X/System.map, para o diretório /boot, com um nome diferente, como System.map-custom. No mesmo diretório, há um arquivo oculto chamando .config (digite ls -a, para visualizá-lo). Copie-o também para o diretório /boot, com um nome diferente como config-custom.

Entre no diretório /usr/src/linux-2.4.X/include/linux. Copie o arquivo kernel.h para o diretório /boot, com um nome diferente como kernel.h-custom. Agora, vá para o diretório /boot e faça as alterações necessárias.

Apague (com o comando rm) os seguintes links: config, System.map, vmlinuz e kernel.h.

Crie agora os links para os novos arquivos:

ln -s config-custom config
ln -s System.map-custom System.map
ln -s vmlinuz-custom vmlinuz
ln -s kernel.h-custom kernel.h

Se você usa o LILO como gerenciador de inicialização, edite o arquivo lilo.conf. Procure a seção que começa com image=/boot/vmlinuz e altere-a como abaixo:

image=/boot/vmlinuz
        label=linux
        root=/dev/hda1
#       initrd=/boot/initrd.img
        append="devfs=mount"
        vga=791

/boot/vmlinuz aponta para o kernel novo (é um link simbólico para vmlinuz-custom). Comente a linha relativa ao initrd, colocando um # em seu início. Antes de fazer qualquer alteração, duplique a seção acima e altere a segunda cópia como abaixo:

image=/boot/vmlinuz-seu-kernel-original
        label=linux-velho
        root=/dev/hda1
        initrd=/boot/initrd.img
        append="devfs=mount"
        read-only

Altere o parâmetro de image, para apontar para o arquivo com seu kernel antigo (mantenha uma cópia da imagem antiga). Dessa forma, se algo der errado, você ainda pode inicializar a máquina e corrigir o problema. Se você estiver usando o GRUB, o parâmetro a ser alterado (com o nome do novo kernel) é kernel, em vez de image, no arquivo /boot/grub/menu.lst. Digite lilo, para que as alterações tenham efeito e reinicie a sua máquina.

Se tudo deu certo, você já deverá estar trabalhando com o seu kernel recém compilado. Para ter certeza, digite: cat /proc/version. Você deverá ver algo como:

Linux version 2.4.19-16mdkcustom (root@scoob.doo.com) (gcc version 2.96 20000731 (Mandrake Linux 9.0 2.96-0.80mdk)) #1 Seg Dez 16 18:02:34 BRST 2002

Agora é só realizar os mesmos passos de instalação do módulo para o kernel 2.4.5. Pronto! Seu modem está funcionando.

Possíveis problemas

Ao inicializar, uma mensagem diz "kernel panic ...".

Esta mensagem aparece se o seu kernel tiver sido compilado sem suporte ao seu sistema de arquivos utilizado na partição raiz (/). Por exemplo, se a raiz é XFS, e no kernel o suporte ao XFS está habilitado via módulos. A solução mais fácil é compilar o suporte diretamente no kernel. (marque um * neste item nas opções de configuração do kernel, em vez de M). Por exemplo:

<*> SGI XFS filesystem support
[*]   Enable XFS Realtime support
[*]   Enable XFS Quota
<*>   Enable XFS DMAPI

O mesmo vale para outros sistemas de arquivos como o Ext3 ou o ReiserFS.

Minha máquina trava quanto executo o minicom ou outro aplicativo de dial-up.

Por motivos que desconheço, o modem Motorola não gosta de que haja outra porta serial habilitada na máquina. Entre no setup da BIOS e deixe somente uma porta serial habilitada, aquela correspondente ao seu mouse. Isso deverá resolver o problema.

Quando digito minicom ou uso o kppp, ele diz que o /dev/modem não existe.

Se o /dev/modem não existir, pode ter ocorrido alguma falha com o comando sm56setup. Para não ter que executá-lo de novo, vá até o diretório /dev e crie o link para o dispositivo /dev/sm56: ln-s sm56 modem. Caso tal dispositivo não exista, crie-o com o comando mknod /dev/sm56 c 24 0 e mude o dono/grupo e as permissões, com o comando chown uucp.root /dev/sm56 e chmod a+rw /dev/sm56, respectivamente.

É isso! Consegui fazer este modem funcionar em um Mandrake Linux 9.0, recompilando o kernel 2.4.19. Acredito que você também pode fazê-lo. Até mais!

NOTA

Recebi informações de que no kernel 2.4.20 e superiores não é mais necessário editar o arquivo /usr/src/linux-2.4.20/mm/slab.c. Ainda não testei este kernel, mas o farei assim que puder. Ou, se alguém o fizer, me envie os resultados.

É necessária uma pequena alteração no código-fonte do Kernel para que o módulo funcione em versões recentes do Linux

Para saber mais:
SoftModems Motorola - www.motorola.com/softmodem
Drivers para o Motorola sm56 SoftModem - makeashorterlink.com/?H6CB63FC2
Fontes do Kernel - ftp.kernel.org/pub/linux/kernel/v2.4/
Kernel How-To - www.desktop-linux.net/kernel.htm

Este documento pode ser distribuído gratuitamente, seguindo a licença FDL, e pode ser alterado, desde que a fonte seja citada. Colaborações são bem vindas.


Gilberto Nunes Ferreira - gilbertonunes@yahoo.com.br

Colaboraram:
sandr8 - sandr8@virgilio.it
Massimiliano Mirra - mmirra@libero.it
Brenna, minha esposa e "revisora oficial".


A Revista do Linux é editada pela Conectiva S/A
Todos os Direitos Reservados.

Política de Privacidade
Anuncie na Revista do Linux