Problemas com adaptador USB wi-fi Ralink 2870 / 3070 em Raspberry Pi e Linux

ATENÇÃO: A informação abaixo só é válida se você utilizar o raspberry pi 3.6.
A partir da versão 3.10 o driver rt2800usb nativo já reconhece esses adaptadores.
Caso você tenha um raspberry pi versão 3.10 e mesmo assim o adaptador não seja
reconhecido (provavelmente através de um upgrade da versão 3.6 para a 3.10) você
precisa atualizar os firmwares utilizados pelo kernel com os comandos abaixo.
Após o término do reboot o adaptador deve funcionar.
sudo apt-get install rpi-update
sudo rpi-update
sudo shutdown -r now

Comprei um mini adaptador Ralink para usar em um Raspberry Pi e percebi que ia ter algum trabalho quando precisei baixar o driver mais recente do fabricante para poder funcionar no Windows 7.

mini wifi

No Linux (Ubuntu 13.04) aparentemente funcionava normal, pois era reconhecido pelo comando lsusb ao ser plugado na porta USB:

Bus 001 Device 004: ID 148f:3070 Ralink Technology, Corp. RT2870/RT3070 Wireless Adapter

Porém não conseguia conectar ou mesmo reconhecer nenhuma rede. Uma olhada com o comando dmesg mostrava algo errado:

[  765.293113] ra0 -> rt2800_init_eeprom: Error - Invalid RF chipset 0x3070 detected.
[  765.293143] ra0 -> rt2x00lib_probe_dev: Error - Failed to allocate device.


Procurando nos forums achei  uma dica, onde um usuário havia desmontado o adaptador e verificou que o chip usado era um Ralink RT5370:

http://www.raspberrypi.org/phpBB3/viewtopic.php?f=28&t=31305

E outro usuário (geekamole) postou a solução em seu blog para compilar um driver novo no Linux:

http://www.raspberrypi.org/phpBB3/viewtopic.php?f=28&t=31305

Basicamente ele baixou o driver no site da Mediatek (empresa que comprou a Ralink) os drivers originais para Linux e editou dois arquivos (rt2800.h e rt2800lib.c) e adicionou para cada linha do RT5370 um linha idêntica, porém com a identificação USB do RT3070.

Os fontes para compilar o módulo para Linux estão nesse link:

http://www.mediatek.com/_en/07_downloads/01_windows.php?sn=501

Copiei o código exatamente como o geekamole postou, para dar uma idéia. O código dele está em formato diff, um utilitário unix muito usado para fazer alterações parciais em arquivos. As linhas importantes são as que tem um sinal de + na frente, são as linhas adicionadas.

--- /usr/src/linux/drivers/net/wireless/rt2x00/rt2800.h
+++ rt2800.h
@@ -68,6 +68,7 @@
 #define RF3320            0x000b
 #define RF3322            0x000c
 #define RF3053            0x000d
 #define RF3290            0x3290
 #define RF5360            0x5360
 #define RF5370            0x5370
+#define RF3070            0x3070

--- /usr/src/linux/drivers/net/wireless/rt2x00/rt2800lib.c
+++ rt2800lib.c
@@ -2221,6 +2221,7 @@
break;
case RF5360:
case RF5370:
+ case RF3070:
case RF5372:
case RF5390:
case RF5392:
@@ -2234,6 +2235,7 @@
rt2x00_rf(rt2x00dev, RF3322) ||
rt2x00_rf(rt2x00dev, RF5360) ||
rt2x00_rf(rt2x00dev, RF5370) ||
+ rt2x00_rf(rt2x00dev, RF3070) ||
rt2x00_rf(rt2x00dev, RF5372) ||
rt2x00_rf(rt2x00dev, RF5390) ||
rt2x00_rf(rt2x00dev, RF5392)) {
@@ -2746,6 +2748,7 @@
case RF3290:
case RF5360:
case RF5370:
+ case RF3070:
case RF5372:
case RF5390:
case RF5392:
@@ -4775,6 +4778,7 @@
case RF3322:
case RF5360:
case RF5370:
+ case RF3070:
case RF5372:
case RF5390:
case RF5392:
@@ -5094,6 +5098,7 @@
rt2x00_rf(rt2x00dev, RF3322) ||
rt2x00_rf(rt2x00dev, RF5360) ||
rt2x00_rf(rt2x00dev, RF5370) ||
+ rt2x00_rf(rt2x00dev, RF3070) ||
rt2x00_rf(rt2x00dev, RF5372) ||
rt2x00_rf(rt2x00dev, RF5390) ||
rt2x00_rf(rt2x00dev, RF5392)) {
@@ -5182,6 +5187,7 @@
case RF3290:
case RF5360:
case RF5370:
+ case RF3070:
case RF5372:
case RF5390:
case RF5392:

Após isso ser feito também é necessário alterar um arquivo do fonte da Ralink, o os/linux/config.mk e dentro dele e habilitar as opções para utilizar o wpa_supplicant:

HAS_WPA_SUPPLICANT=y
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y

Sem isso o driver resultante não vai funcionar na maioria das configurações, já que todas as distribuições usam o wpa_supplicant.

Após essas alterações, basta compilar o driver :

$ make
$ sudo make install

O arquivo com o módulo resultante da compilação é o rt5370sta.ko

Para compilar o driver para o Raspberry Pi ou você faz uma compilação cruzada (não consegui fazer, se eu acertar outra hora, colo o método aqui) ou compila direto no Raspberry, que foi o que eu fiz.

O usuário wiinick postou no fórum de suporte do Raspberry Pi o método que ele usou, segui a receita e tive sucesso:

http://www.raspberrypi.org/phpBB3/viewtopic.php?t=47830&p=387966

Primeiro é preciso preparar o Raspberry com os fontes, os comando abaixo são para quem tem a versão 3.6y, mas vale para as outras, bastando acertar os links de download. Baixe o pacote de download no github, pois ele tem um Makefile necessário para a configuração do sistema:

cd /usr/src
sudo wget https://github.com/raspberrypi/linux/archive/rpi-3.6.y.tar.gz
sudo tar xvfz rpi-3.6.y.tar.gz
sudo su

ln -s /usr/src/linux-rpi-3.6.y/ /lib/modules/3.6.11+/build
cd /lib/modules/3.6.11+/build
sudo make mrproper
gzip -dc /proc/config.gz > .config
make modules_prepare
wget https://github.com/raspberrypi/firmware/raw/master/extra/Module.symvers

exit

Após isso, baixe os drivers da Mediatek, altere os arquivos mencionados anteriormente e compile o módulo.

É necessário colocar o driver rt2800usb no blacklist para evitar conflitos com o driver modificado, edite o blacklist:

sudo nano /etc/modprobe.d/raspi-blacklist.conf

e adicione a seguinte linha:

blacklist rt2800usb

Depois disso é só fazer o reboot e o adaptador wi-fi vai funcionar com seu Raspberry Pi.

Caso você tenha dificuldades para compilar o modulo, você pode baixar o arquivo binário compilado por mim por sua conta e risco.

Compilado nativamente em um Raspberry Pi versão 3.6.y:

https://dl.dropboxusercontent.com/u/29982302/rt5370sta.ko

Confira o checksum md5 para se certificar que o download não foi corrompido, copie para o diretório de módulos e acerte as permissões.

$ md5sum  rt5370sta.ko
3673ade6dee27b9689722ca710830a9a  
$ sudo cp rt5370sta.ko /lib/modules/3.6.11+/kernel/drivers/net/wireless
$ sudo chmod 644 /lib/modules/3.6.11+/kernel/drivers/net/wireless/rt5370sta.ko
$ sudo chown root.root /lib/modules/3.6.11+/kernel/drivers/net/wireless/rt5370sta.ko

Sobre androideia

Passando o tempo...

Publicado em 20/07/2013, em Compile drivers, Linux, Ralink, Raspberry Pi e marcado como , , , , , , , . Adicione o link aos favoritos. Deixe um comentário.

Deixe um comentário

Matt's Entropy

... seeding /dev/random, one blog post at a time.

Maravilhoso Mundo Novo

De volta ao Paraíso

androideia

Idéias e Android, necessariamente não nessa ordem.

Another Airgun Blog

Idéias e Android, necessariamente não nessa ordem.

Armas de Pressão - Modificações e afins

Metade da graça em atirar está em fazer ajustes na arma.