# Introdução aos Sistemas Operacionais/Exemplo de Drivers USB em Linux: Adaptador Wireless
## Objetivo geral

Realizar um estudo de caso, analisando o funcionamento do driver usb para Linux.

## Objetivos específicos

Produzir um artigo sobre o driver para Linux do adaptador wireless ENUWI-N3 para o curso de Ciência da Computação da UFG (Universidade Federal de Goiás) através de um trabalho da disciplina de Sistemas Operacionais 2, ministrado pelo Professor Marcelo Akira Inuzuka.

## Informações gerais

* Grupo
** Luíla Moraes de Oliveira
** Arthur Henrique Guimarães de Oliveira
** Paulo Júnior do Nascimento Lima
** Danilo Inácio Souza Resende
* Sistema Operacional Linux testado: Debian/Ubuntu
* Identificação do driver analisado:
** ModelName: RT2870 Wireless Lan Linux Driver
** Driver lName: rt2870.o/rt2870.ko
** Supporting Kernel: linux kernel 2.4 and 2.6 series.
** Tested in: Redhat 7.3 or later.
** Ralink Hardware: Ralink 802.11n Wireless LAN Card.
** Descrição: A linux device driver for Ralink RT2870 USB ABGN WLAN Card.
* filename: rt2870sta.ko
* version: 2.4.0.0
* license: GPL
* author: Paul Lin <paul_lin@ralinktech.com>
* Em distribuições como Ubuntu, esse módulo já vem nativo no sistema porém é uma versão anterior, versão 2.0.1.0

## Configuração do Driver

O driver RT2870 pode ser configurado via as seguintes interfaces, i.e. o comando (i)"iwconfig", o comando (ii)"iwpriv", e pelo arquivo de configuração (iii).
* i) iwconfig acompanha o Kernel Linux.
* ii) iwpriv possui uma descrição completa no arquivo "iwpriv_usage.txt" que acompanha o driver RT2870.
* iii) é possível modificar o arquivo de configuração "RT2870STA.dat" em /etc/Wireless/RT2870STA/RT2870STA.dat.

## Conteúdo
### Carga (load ou init)

* Processo de carga do módulo
Depois de compilado, o código gera um módulo: rt2870sta.ko
Para carregar digite no terminal como super-usuário:
A carga do módulo acontece nas seguintes funções: (usb_main_dev.c linha:394)
* Parâmetros que podem ser passados na carga do módulo:
** É possível passar como parâmetro para o modulo na sua carga o endereço MAC.
* Como passar uma parâmetro para o módulo:
** Para passar um parâmetro para o módulo basta seguir o exemplo: # insmod rt2870sta.ko mac=<XX:XX:XX:XX:XX:XX>

### Reconhecimento ou detecção (probe)

* Quais dispositivos podem ser reconhecidos?
** USB: 0411:00E8 MelCo., Inc. Buffalo WLI-UC-G300N Wireless LAN Adapter
** USB: 0471:200F Philips (or NXP) 802.11n Wireless Adapter
** USB: 04BB:0945 I-O Data Device, Inc. WN-GDN/US3 Wireless LAN Adapter
** USB: 04BB:0947 I-O Data Device, Inc. WN-G150U Wireless LAN Adapter
** USB: 04BB:0948 I-O Data Device, Inc. WN-G300U Wireless LAN Adapter
** USB: 04E8:2018 Samsung Electronics Co., Ltd WIS09ABGN LinkStick Wireless LAN Adapter
** USB: 050D:8053 Belkin Components F5D8053 N Wireless USB Adapter v1000/v4000 [Ralink RT2870]
** USB: 050D:805C Belkin Components F5D8053 N Wireless Adapter v3000 [Ralink RT2870]
** USB: 050D:815C Belkin Components F5D8053 N Wireless USB Adapter v3000 [Ralink RT2870]
** ** USB: 050D:825B Belkin Components F5D8055 N+ Wireless Adapter v2000 [Ralink RT3070]
** USB: 050D:935B Belkin Components F6D4050 N150 Enhanced Wireless Network Adapter v2000 [Ralink RT3070]
** USB: 0586:3416 ZyXEL Communications Corp. NWD-210N 802.11b/g/n-draft wireless adapter
** USB: 0789:0162 Logitec Corp. LAN-WN22/U2 Wireless LAN Adapter
** USB: 0789:0163 Logitec Corp. LAN-WN12/U2 Wireless LAN Adapter
** USB: 0789:0164 Logitec Corp. LAN-W150/U2M Wireless LAN Adapter
** USB: 0789:0166 Logitec Corp. LAN-W300N/U2 Wireless LAN Adapter
** USB: 07AA:002F Corega K.K. CG-WLUSB2GNL
** USB: 07AA:003C Corega K.K. CG-WLUSB2GNL
** USB: 07AA:003F Corega K.K. CG-WLUSB300AGN
** USB: 07B8:2770 D-Link Corp. 802.11n/b/g Mini Wireless LAN USB2.0 Adapter
** USB: 07B8:2870 D-Link Corp. 802.11n/b/g Wireless LAN USB2.0 Adapter
** USB: 07B8:3070 D-Link Corp. 802.11n/b/g Mini Wireless LAN USB2.0 Adapter
** USB: 07B8:3071 D-Link Corp. 802.11n/b/g Mini Wireless LAN USB2.0 Adapter
** USB: 07B8:3072 D-Link Corp. 802.11n/b/g Mini Wireless LAN USB2.0 Adapter
** USB: 07D1:3C09 D-Link System DWA-140 RangeBooster N Adapter(rev.B1) [Ralink RT2870]
** USB: 07D1:3C0A D-Link System DWA-140 RangeBooster N Adapter(rev.B2) [Ralink RT2870]
** USB: 07D1:3C0D D-Link System DWA-125 Wireless N 150 Adapter(rev.A1) [Ralink RT2870]
** USB: 07D1:3C0E D-Link System WUA-2340 USB Adapter(rev.B)
** USB: 07D1:3C0F D-Link System AirPlus G DWL-G122 Wireless Adapter(rev.E) [Ralink RT2870]
** USB: 07D1:3C11 D-Link System DWA-160 Xtreme N Dual Band USB Adapter(rev.B) [Ralink RT2870]
** USB: 07D1:3C16 D-Link System DWA-125 Wireless N 150 Adapter(rev.A2) [Ralink RT2870]
** USB: 07D1:3C17 D-Link System (Device name unknown)
** USB: 07FA:7712 Draytek (Device name unknown)
** USB: 083A:6618 Accton Technology Corp. 802.11n Wireless Adapter
** USB: 083A:7511 Accton Technology Corp. Arcadyan 802.11N Wireless Adapter
** USB: 083A:7512 Accton Technology Corp. Arcadyan 802.11N Wireless Adapter
** USB: 083A:7522 Accton Technology Corp. Arcadyan 802.11N Wireless Adapter
** USB: 083A:8522 Accton Technology Corp. Arcadyan 802.11N Wireless Adapter
** USB: 083A:A618 Accton Technology Corp. SMCWUSBS-N EZ Connect N Draft 11n Wireless Adapter [Ralink RT2870]
** USB: 083A:A701 Accton Technology Corp. SMCWUSBS-N3 EZ Connect N Wireless Adapter [Ralink RT3070]
** USB: 083A:A702 Accton Technology Corp. (Device name unknown)
** USB: 083A:A703 Accton Technology Corp. (Device name unknown)
** USB: 083A:B522 Accton Technology Corp. SMCWUSBS-N2 EZ Connect N Wireless Adapter [Ralink RT2870]
** USB: 0B05:1731 ASUSTek Computer, Inc. 802.11n Network Adapter
** USB: 0B05:1732 ASUSTek Computer, Inc. 802.11n Network Adapter
** USB: 0B05:1742 ASUSTek Computer, Inc. 802.11n Network Adapter
** USB: 0B05:1784 ASUSTek Computer, Inc. USB-N13 802.11n Network Adapter [Ralink RT2870]
** USB: 0CDE:0022 Z-Com 802.11b/g/n Wireless Network Adapter
** USB: 0CDE:0025 Z-Com 802.11b/g/n USB Wireless Network Adapter
** USB: 0DB0:3820 Micro Star International (Device name unknown)
** USB: 0DB0:3821 Micro Star International (Device name unknown)
** USB: 0DB0:3822 Micro Star International (Device name unknown)
** USB: 0DB0:3870 Micro Star International (Device name unknown)
** USB: 0DB0:3871 Micro Star International (Device name unknown)
** USB: 0DB0:6899 Micro Star International 802.11bgn 1T1R Mini Card Wireless Adapter
** USB: 0DB0:821A Micro Star International (Device name unknown)
** USB: 0DB0:822A Micro Star International (Device name unknown)
** USB: 0DB0:822B Micro Star International (Device name unknown)
** USB: 0DB0:822C Micro Star International (Device name unknown)
** USB: 0DB0:870A Micro Star International (Device name unknown)
** USB: 0DB0:871A Micro Star International (Device name unknown)
** USB: 0DB0:871B Micro Star International (Device name unknown)
** USB: 0DB0:871C Micro Star International (Device name unknown)
** USB: 0DB0:899A Micro Star International (Device name unknown)
** USB: 0DF6:0017 Sitecom Europe B.V. WL-182 Wireless-N Network USB Card
** USB: 0DF6:002B Sitecom Europe B.V. WL-188 Wireless Network 300N USB Adapter
** USB: 0DF6:002C Sitecom Europe B.V. WL-301 Wireless Network 300N USB Adapter
** USB: 0DF6:002D Sitecom Europe B.V. WL-302 Wireless Network 300N USB dongle
** USB: 0DF6:0039 Sitecom Europe B.V. WL-315 Wireless-N USB Adapter
** USB: 0DF6:003E Sitecom Europe B.V. WL-343 Wireless USB Adapter 150N X1
** USB: 0DF6:003F Sitecom Europe B.V. WL-608 Wireless USB Adapter 54g
** USB: 0DF6:0042 Sitecom Europe B.V. WL-345 Wireless USB adapter 300N X3
** USB: 0DF6:0047 Sitecom Europe B.V. WL-352v1 Wireless USB Adapter 300N 002
** USB: 0DF6:0048 Sitecom Europe B.V. WL-349v1 Wireless USB Adapter 150N 002
** USB: 0E66:0001 Hawking Technologies HWUN1 Hi-Gain Wireless-300N Adapter w/ Upgradable Antenna [Ralink RT2870]
** USB: 0E66:0003 Hawking Technologies HWDN1 Hi-Gain Wireless-300N Dish Adapter [Ralink RT2870]
** USB: 100D:9031 Netopia, Inc. Motorola 802.11n Dualband USB Wireless Adapter
** USB: 1044:800B Chu Yuen Enterprise Co., Ltd GN-WB30N 802.11n WLAN Card
** USB: 1044:800D Chu Yuen Enterprise Co., Ltd GN-WB32L 802.11n USB WLAN Card
** USB: 129B:1828 CyberTAN Technology Gigaset USB Adapter 300
** USB: 13D3:3247 IMC Networks 802.11 n/g/b Wireless LAN Adapter
** USB: 13D3:3273 IMC Networks 802.11 n/g/b Wireless LAN USB Mini-Card
** USB: 13D3:3305 IMC Networks (Device name unknown)
** USB: 13D3:3307 IMC Networks (Device name unknown)
** USB: 13D3:3321 IMC Networks (Device name unknown)
** USB: 1482:3C09 (Vendor name unknown) (Device name unknown)
** USB: 148F:2070 Ralink Technology, Corp. RT2070 Wireless Adapter
** USB: 148F:2770 Ralink Technology, Corp. RT2770 Wireless Adapter
** USB: 148F:2870 Ralink Technology, Corp. RT2870 Wireless Adapter
** USB: 148F:3070 Ralink Technology, Corp. RT2870/RT3070 Wireless Adapter
** USB: 148F:3071 Ralink Technology, Corp. RT3071 Wireless Adapter
** USB: 148F:3072 Ralink Technology, Corp. RT3072 Wireless Adapter
** USB: 14B2:3C06 Ralink Technology, Corp. 802.11n adapter (V1)
** USB: 14B2:3C07 Ralink Technology, Corp. 802.11n adapter
** USB: 14B2:3C09 Ralink Technology, Corp. 802.11n adapter
** USB: 14B2:3C12 Ralink Technology, Corp. (Device name unknown)
** USB: 14B2:3C23 Ralink Technology, Corp. 802.11n adapter
** USB: 14B2:3C25 Ralink Technology, Corp. 802.11n adapter
** USB: 14B2:3C27 Ralink Technology, Corp. rt2870 802.11n WLAN
** USB: 14B2:3C28 Ralink Technology, Corp. 802.11n adapter (V2)
** USB: 157E:300E TRENDnet (Device name unknown)
** USB: 15A9:0006 Gemtek Wireless 11n USB Adapter
** USB: 15C5:0008 Advance Multimedia Internet Technology Inc. (AMIT) WL532U 802.11g Adapter
** USB: 1690:0740 Askey Computer Corp. [hex] 802.11n Wireless LAN Card
** USB: 1737:0070 Linksys WUSB100 RangePlus Wireless USB Adapter
** USB: 1737:0071 Linksys WUSB600N v1 Dual-Band Wireless-N Network Adapter [Ralink RT2870]
** USB: 1737:0077 Linksys WUSB54GC v3 802.11g Adapter [Ralink RT2870]
** USB: 1740:9701 Senao EnGenius 802.11n Wireless USB Adapter
** USB: 1740:9702 Senao EnGenius 802.11n Wireless USB Adapter
** USB: 1740:9703 Senao EnGenius 802.11n Wireless USB Adapter
** USB: 1740:9705 Senao EnGenius 802.11n Wireless USB Adapter
** USB: 1740:9706 Senao EnGenius 802.11n Wireless USB Adapter
** USB: 1740:9707 Senao (Device name unknown)
** USB: 1740:9708 Senao (Device name unknown)
** USB: 1740:9709 Senao (Device name unknown)
** USB: 177F:0302 Sweex (Device name unknown)
** USB: 18C5:0012 AMIT Technology, Inc. CG-WLUSB10 Corega Wireless USB Adapter
** USB: 1A32:0304 Quanta Microsystems, Inc. 802.11n Wireless LAN Card
** USB: 1D4D:000C PEGATRON CORPORATION Ralink RT3070 802.11b/g/n Wireless Lan USB Device
** USB: 1D4D:000E PEGATRON CORPORATION Ralink RT3070 802.11b/g/n Wireless Lan USB Device
** USB: 1EDA:2310 AirTies Wireless Networks 802.11n USB Wireless LAN Card
** USB: 2001:3C09 D-Link Corp. (Device name unknown)
** USB: 2001:3C0A D-Link Corp. (Device name unknown)
** USB: 2019:AB25 PLANEX 150N Wireless LAN USB Adapter
** USB: 2019:ED06 PLANEX 802.11n Wireless LAN Adapter
** USB: 2019:ED14 PLANEX GW-USMicroN
** USB: 203D:1480 (Vendor name unknown) (Device name unknown)
** USB: 203D:14A9 (Vendor name unknown) (Device name unknown)
** USB: 20B8:8888 (Vendor name unknown) (Device name unknown)
** USB: 5A57:0280 Zinwell 802.11a/b/g/n USB Wireless LAN Card
** USB: 5A57:0282 Zinwell 802.11b/g/n USB Wireless LAN Card
** USB: 5A57:0283 Zinwell 802.11b/g/n USB Wireless LAN Card
** USB: 5A57:5257 Zinwell Metronic 495257 wifi 802.11ng
** USB: 7392:7711 Edimax Technology Co., Ltd EW-7711UTn nLite Wireless Adapter [Ralink RT2870]
** USB: 7392:7717 Edimax Technology Co., Ltd EW-7717UN 802.11n Wireless Adapter [Ralink RT2870]
** USB: 7392:7718 Edimax Technology Co., Ltd EW-7718UN 802.11n Wireless Adapter [Ralink RT2870]
* Como se processa a identificação do dispositivo?
** A identificação do dispositivo é processada da seguinte forma: ...
* O que ocorre quando o driver não é reconhecido?
** Quando o driver não é reconhecido .....

### Inicialização de estruturas

* Struct usb_driver
Identifica o driver da interface USB para o usbcore (Ele habilita o suporte básico e cria a pasta /proc/bus/usb, onde os periféricos USB ficam acessíveis).
* Membros
** name: O campo name deve ser único entre drivers USB, e deve normalmente ser o mesmo nome do modulo.
** probe: Chamado para checar se o driver deseja manipular uma interface particular de um dispositivo. Caso esteja, probe retorna zero e usa usb_set_intfdata para associar dados específicos do driver com a interface. Do contrário retorna -ENODEV.
** disconnect: Chamado quando a interface não está mais acessível. Geralmente isso ocorre quando o dispositivo está sendo desconectado ou o modulo do drive é descarregado.
** id_table: Drivers USB usam o ID table para dar suporte ao hotplugging.

### Registro do driver (register)

O comand lsusb pode ser usado para verificar se o dispositivo foi reconhecido pelo sistema.
O comando dmesg, serve para ver as mensagens que o carregamento do módulo produziu de mensagem.
Assim como o lsmod para saber se o módulo foi carregado corretamente.

### Finalização
## Considerações finais
## Bibliografia/Referências

* http://wiki.debian.org/rt2870sta