O primeiro passo para ativar qualquer dispositivo USB no Linux, é carregar o suporte à própria controladora USB da placa mãe. No Kernel 2.6, existem três módulos diferentes destinados a esta função. O módulo “ehci-hcd” é o mais recente, que dá suporte a controladores e dispositivos USB 2.0 em geral. Ele é o módulo usado na grande maioria dos casos.
No caso de micros antigos, que ainda utilizam controladoras USB 1.1, entram em ação os módulos “ohci-hcd” e “uhci-hcd“. A diferença entre os dois é que o ohci-hcd dá suporte aos controladores usados pela Via e outros fabricantes, enquanto o uhci-hcd dá suporte aos controladores USB usados pela Intel. Em distribuições antigas, baseadas no Kernel 2.4, os módulos mudam de nome, passam a ser “usb-ohci” e “usb-uhci“.
A diferença entre o USB 1.1 e o 2.0 é o brutal aumento na capacidade de transmissão. O padrão USB original foi desenvolvido como um substituto para as portas seriais, com o objetivo de conectar impressoras, teclados, mouses e similares. Com o tempo, o USB começou a ser usado para pendrives, HDs externos, placas de rede, câmeras e outros periféricos “rápidos”, capazes de transmitir dados a muito mais que 12 megabits por segundo.
O USB 2.0 surgiu como um padrão “definitivo”, que opera a 480 megabits (cerca de 50 MB/s reais, descontando o overhead do gerado protocolo de comunicação e pacotes de controle). Os periféricos USB 2.0 são compatíveis com placas antigas e vice-versa, mas sempre nivelando por baixo. Seu pendrive USB 1.1 vai continuar trabalhando a 12 megabits se conectado numa controladora USB 2.0.
Os três módulos são capazes de detectar os controladores a que dão suporte e por isso convivem muito bem entre sí. Você pode tentar simplesmente carregar os três em seqüência, começando pelo “ehci-hcd“. Ao encontrar uma controladora antiga, ou que não seja compatível, ele vai automaticamente passar o controle a um dois outros dois.
# modprobe ehci-hcd
# modprobe ohci-hcd
# modprobe uhci-hcd
Em seguida entra em ação o módulo “usbcore” que oferece funções genéricas, usadas por todos os dispositivos USB, incluindo chamadas de sistema para conectar ou desconectar um dispositivo, reservar banda de transmissão e outras funções.
O módulo usbcore se encarrega de detectar novos dispositivos USB conforme ele são conectados, criando uma lista dentro da pasta “/proc/bus/usb“, que é utilizada por programas de detecção, como o hotplug e o udev. Caso necessário, monte-a manualmente, usando o comando:
# mount -t usbfs /proc/bus/usb /proc/bus/usb
A partir daí, você pode carregar os drivers para os dispositivos conectados:
Os módulos “usbmouse” e “usbkbd“, ativam o suporte genérico a mouses e teclados USB. Existe também um módulo mais antigo, o “usbhid“, que além prover comunicação com no-breaks e alguns outros periféricos, oferece as funções básicas usadas por mouses e teclados. Completando, temos o módulo “joydev“, que dá suporte a joysticks.
Caso você tenha um conversor serial/USB, use o módulo “serial“. Os adaptadores USB para teclados e mouses PS/2 não precisam de drivers adicionais, mas alguns mouses PS/2 não funcionam em conjunto com eles, pois é necessário a inclusão de um circuito adicional.
Em caso de problemas com o teclado ou mouse, verifique também se a opção “USB LEGACY SUPPORT” está desativada no setup. Esta opção ativa uma camada de compatibilidade, destinada a fazer o teclado e mouse funcionarem no MS-DOS e Windows 9x, que em algumas placas faz com que o sistema deixe de detectar os dispositivos e ativar os drivers necessários durante o boot.
O módulo usbserial habilita suporte à comunicação com Palms, Pocket PCs (com o Windows CE) e outros dispositivos que transfiram dados através da porta USB usando-a como se fosse uma porta serial. A comunicação com estes dispositivos (do ponto de vista do sistema) é feita de uma forma diferente que seria com um dispositivo de armazenamento, como um pendrive, por exemplo. O cartão de memória é visto como se fosse um HD externo, enquanto no caso do Palm a porta USB é usada como substituta para uma porta serial.
Complementando o usbserial, é geralmente necessário um segundo módulo, que habilita o dispositivo. Para fazer sincronismo com um Palm, ative o módulo “visor” e, para um Pocket PC, o módulo “ipaq“. Com o módulo carregado, você pode usar um programa de sincronismo, como o Kpilot, ou o SynCE. Os outros drivers disponíveis, vão na pasta “/lib/modules/2.6.x/kernel/drivers/usb/serial“.
O primeiro dispositivo serial conectado aparece como o dispositivo “/dev/ttyUSB0“, o segundo como “/dev/ttyUSB1” e, assim por diante. Configure o programa de sincronismo para utilizar uma destas portas e tente abrir a conexão.
Uma dica é que, no caso dos Palms você precisa primeiro pressionar o botão de hotsync no Palm (o que faz com que ele seja detectado), para só depois conseguir estabelescer a conexão dentro do programa de sincronismo.
Um módulo similar é o “usblp“, que ativa o suporte genérico a impressoras USB, que ficam acessíveis através dos devices “/dev/usb/lp0“, “/dev/usb/lp1“, etc. Para o suporte a scanners, existe o módulo “scanner“, que ativa o device “/dev/usbscanner“. Um problema comum é que os dispositivos ficam por padrão disponíveis apenas para o root. Para imprimir ou usar o scanner usando um login de usuário, é preciso abrir as permissões do dispositivo, como em “chmod 666 /dev/usbscanner“.
No caso das webcams, são usados os módulos “spca5xx“, “stv680“, “ultracam“, “quickcam“, “ibmcam“, “konicawc“, “sqcam” ou “vicam“, de acordo com o modelo. O módulo “spca5xx” é o que dá suporte a maior parte dos modelos, mas ele não vem instalado por padrão em muitas distribuições.
Existem no mercado algumas caixas de som e headsets USB que, ao contrário das caixas e microfones ligados na placa de som, são detectados como dispositivos de áudio independentes, como se fossem uma segunda placa de som. Estes dispositivos são, de uma forma geral, bem suportados no Linux, através do módulo “snd-usb-audio“, que faz parte do Alsa.
Alguns drivers mais incomuns são o “aiptek“, que dá suporte a vários tablets USB, o “rt2570“, que dá suporte as placas wireless USB com chipset RT2500 (Ralink) e o “rtl8150“, que dá suporte aos adaptadores de rede USB com o chipset de mesmo nome. Você pode encontrar uma lista com vários outros drivers incomuns no: http://www.qbik.ch/usb/devices/drivers.php.
Para acessar pendrives, HDs USB e também câmeras e outros dispositivos compatíveis com o protocolo storage, usamos o módulo “usb-storage“. Ele trabalha em conjunto com o módulo “sg” (SCSI Generic), que permite que os dispositivos sejam acessados usando o driver de acesso a dispositivos SCSI. Você pode pensar no módulo usb-storage como uma espécie de adaptador, que faz com que dispositivos de armazenamento USB sejam vistos pelo sistema como HDs SCSI.
O primeiro dispositivo fica acessível como “/dev/sda“, o segundo como “/dev/sdb” e assim por diante. No caso de adaptadores para cartões de diversos formatos, cada conector é visto pelo sistema como um dispositivo independente. O cartão SD pode ficar acessível através do “/dev/sdc” e o memory stick através do “/dev/sdd“, por exemplo, mesmo que nenhum dos outros encaixes esteja sendo usado. Para acessar, basta montar o dispositivo correto, como em:
# mount /dev/sda1 /mnt/sda1
Uma dica é que, no Kernel 2.6, sempre que um pendrive ou cartão é detectado, é criada automaticamente uma pasta dentro do diretório “/sys/block“, como em “/sys/block/sda“. Dentro da pasta você encontra o arquivo “size“, que contém a capacidade do dispositivo (em blocos de 512 bytes) e uma sub-pasta para cada partição, como “/sys/block/sda/sda1“. Logo adiante, veremos um exemplo de script que cria um ícone no desktop automaticamente, sempre que um pendrive é conectado, baseado justamente nestas informações.
Voltando à explicação inicial, o pendrive ou cartão pode ser particionado normalmente, através do cfdisk, gparted ou qualquer outro particionador, como se fosse realmente um HD externo.
O mais comum é que seja usada uma única partição, formatada em FAT32, o que permite que ele seja acessado tanto no Linux quanto no Windows. Mas, nada impede que você formate seu pendrive em ReiserFS ou qualquer outro sistema de arquivos. Lembre-se que você pode formatar partição usando os comandos “mkfs.ext3“, “mkfs.reiserfs” ou “mkfs.vfat” (para FAT32).
Uma desvantagem é que o ReiserFS, EXT3, XFS e JFS consomem uma quantidade de espaço relativamente grande para armazenar a estrutura do sistema de arquivos, deixando menos espaço útil disponível. Eles são mais apropriados para formatar HDs e unidades de maior capacidade.
Alguns MP3 Players baratos utilizam um padrão de formatação chamado “superfloppy“, onde o dispositivo é formatado diretamente em FAT32 (como se fosse um disquete gigante), ao invés de ser criada uma partição. Nestes casos, você acessa os arquivos diretamente pelo “/dev/sda“, ao invés do “/dev/sda1“.
Se você tiver a curiosidade de particionar o mp3player, criando uma partição e formatando, vai perceber que embora consiga montar e acessar os dados normalmente, o MP3 Player não vai mais conseguir achar os arquivos das músicas. Para voltar à formatação padrão, use o comando “mkfs.vfat -I /dev/sda” onde o “-I” (i maiúsculo) especifica o tipo de formatação.
Outra dica é que, a partir do Kernel 2.6.12 houve uma mudança importante no modo padrão de acesso a pendrives, MP3 Players e outros dispositivos de armazenamento USB. Para aumentar a segurança da gravação de dados, muitas distribuições montam os drives usando a opção “sync“, que sincroniza a gravação dos dados, diminuindo a probabilidade de perder arquivos ao remover o pendrive sem desmontar.
O problema é que na nova versão do driver usb-storage, a opção passou a ser seguida a risca, fazendo com que a cada setor gravado, seja feita uma atualização na tabela de alocação de arquivos da partição. Isto faz com que a velocidade de gravação fique assustadoramente baixa, algo em torno de 40 kb/s nos pendrives USB 1.1 e de 200 a 300 kb/s nos 2.0.
A solução é passar a montar os pendrives usando a opção “async“, se necessário via terminal, usando o comando:
# mount -o async /dev/sda1 /mnt/sda1
Além do problema da lentidão, montar os drives com a opção “sync” pode causar danos depois de algum tempo de uso, pois as freqüentes gravações aos primeiros setores (onde está a tabela de alocação) podem rapidamente exceder o limite de gravações das memórias flash mais baratas, inutilizando o pendrive, como reportado aqui: http://readlist.com/lists/vger.kernel.org/linux-kernel/22/111748.html
Note que este “problema” só afeta os Kernels recentes, a partir do 2.6.12. Você só precisa se preocupar com isso se está usando uma versão recente e está tendo o problema de lentidão ao gravar dados no pendrive que citei.
Deixe seu comentário