# Objetivos

Este conteúdo foi produzido com o intuito de demonstrar as especificidades de um driver usb para Linux, mais especificamente o driver btusb. Baseando em comentários do código fonte procuramos mostrar as funcionalidades do driver, suas funções principais e de interação com o dispositivo. Para estes fins utilizamos o dispositivo "Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)" como base para os experimentos.

# Introdução

Neste trabalho iremos falar sobre o driver genérico Bluetooth em Linux (btusb.c), que é um driver para reconhecer dispositivos bluetooth no linux. Iremos neste e nos próximos capítulos descrever exemplos práticos da sua instalação e de como ele funciona além de mostrar trechos de código e as funcionalidades.
Abaixo segue algumas informações relacionadas ao driver em análise, que podem ser encontradas no site http://www.qbik.ch:
O conteúdo apresentado a seguir foi produzido com objetivo de demonstrar o conceito de drivers em Linux, e por meio de um estudo de caso, concretizamos o conhecimento de forma prática. Seguindo a metodologia de comentários linha-a-linha, citações e explicações das estruturas e funções, tornamos este conteúdo bem didático e prático para consultas, podendo assim ser utilizado como referência a futuros trabalhos na área de desenvolvimento de drivers para Linux

# Informações gerais

* Autores:
** Wanderson Paim de Jesus
** Everton Cerqueira de Souza
** Bruno Campos Rodrigues
** Chrystian Andersen
* Versão do kernel:
2.6.32
* Identificação do driver analisado:
** Nome: Generic Bluetooth USB driver - btusb
* Lista de arquivos de códigos-fontes analisados:
** Código Fonte: http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/drivers/bluetooth/btusb.c
* Outras informações relevantes:
O dispositivo que será utilisado para demonstrar as diversas fases envolvidas no processo de reconhecimento e comunicação software-driver-hardware é o Mini Adaptador Bluetooth Usb Dongle 2.0. Abaixo segue suas especificações:
* Compatível com USB 2.0 / 1.1 /1.0
* Compatível com especificação Bluetooth 2.0 / 1.2 / 1.1
* Suporta A2DP (Bluetooth Estéreo)
* Suporta Enhanced data rate (v2.0 + EDR) = 3.0 Mbit/s
* Vendor ID = 0a12
* Product ID = 0001

## Carga (load ou init)

* Módulos Carregados:
* Processo de carga do módulo
Ao conectar o dispositivo a uma porta usb, um driver deve ser associado a ele, e para isso são analisados os dispositivos suportados por cada driver. Então o driver escolhido é carregado utilizando sua função de carga, ou init. A função de carga do btusb é a seguinte:
* Parâmetros que podem ser passados na carga do módulo
* Como passar uma parâmetro para o módulo, etc;

## Reconhecimento ou detecção (probe)

Os drivers genéricos geralmente dão suporte a uma série de dispositivos. Abaixo segue uma lista de dispositivos reconhecidos pelo driver seguidos de uma lista dos dispositivos não reconhecidos.
* Dispositivos que podem ser reconhecidos segundo o fabricante:
* Dispositivos que não podem ser reconhecidos (lista negra):
* Como se processa a identificação do dispositivo
* O que ocorre quando o driver não é reconhecido (erro), etc;
Quando acontece um erro na hora da inicialização as seguintes funções são chamadas:
E depois chama o return

## Inicialização de estruturas

* Quais estruturas são inicializadas
As estruturas inicializadas ao chamar o btusb.c são:
* Tipo de estruturas inicializadas (buffer, por exemplo)
* Registro de URB;

## Registro do driver (register)

* Como o driver é reconhecido
O processo de reconhecimento do módulo é feito automaticamente quando algum dispositivo sem driver específico é conectado na porta usb. Para demonstrar este passo, utilizamos o dispositivo Mini Adaptador Bluetooth Usb Dongle 2.0. Iniciamos o processo de identificação do dispositivo executando o comando dmesg antes e depois de conecta-lo, redirecionando a saida para arquivos de texto distintos. Desta forma podemos compara-los utilizando a função diff.
Saida:
O resultado obtido acima não mostra o driver que foi utilizado, pois este já estava carregado quando a máquina foi iniciada. Mas analisando algumas linhas da saida do comando dmesg, encontramos alguns dados relevantes:
Esses dados mostram que o driver btusb foi associado ao dispositivo de Bluetooth conectado.
* Quais drivers que foram carregados para o dispositivo, etc;
Quando o dispositivo é plugado, alguns drivers são associados a ele e podem ser listados com o comando lsmod | more. Na saída do comando, executado para o caso de teste deste documento, encontramos os seguintes dados:
* Quais procedimentos (comandos) para verificar qual dispositivo específico que foi reconhecido
O dispositivo ainda pode ser checado com o comando lsusb, que mostra todos os dispositivos conectados as portas USB disponíveis no computador, separados por barramentos (Bus), que funcionam de forma semelhante a um HUB (equipamento de rede). De modo que todo dispositivo ligado a esse barramento forma um novo Device. Ao executarmos esse comando com o nosso dispositivo conectado obtemos a seguinte saida:
Analisando essa saída, podemos interpretar que o nosso dispositivo (o primeiro da lista) está ligado no barramento 004 e é o terceiro Device neste barramento. Ainda podemos reconhecer nesta saída o Vendor ID e Product ID, identificados no último parâmetro antes do nome do dispositivo, 0a12:0001 que representa VendorID:ProductID.

## Comunicação

* Arquivos especiais de dispositivo (/proc, /dev e /sys)
* Criação de endpoint
A comunicação via USB se dá através dos chamados endpoints. Um endpoint pode transportar dados em uma única direção, seja do computador para o dispositivo (chamado OUT endpoint) ou do dispositivo para o computador (chamado IN endpoint). Os endpoints são descritos no kernel por um ponteiro que aponta para uma estrutura chamada usb_endpoint_descriptor, que contém todos os dados específicos da USB nos mesmos formatos especificados pelo próprio driver. Podemos identificar estas estruturas no driver em análise (btusb) nas seguintes linhas:
Os atributos disponibilizados por estas estruturas estrutura são acessados por diversas vezes na estrutura do driver:
bEndpointAddress - endereço USB deste endpoint em específico.
wMaxPacketSize - expecifica o tamanho máximo, em bytes, que este endpoint pode transportar por vez. Vale ressaltar que o tamanho dos dados enviados pelo driver poder ser maior que este valor, mas os dados serão divididos em (dataSize/wMaxPacketSize) pacotes, que finalmente serão transmitidos ao dispositivo. Acompanhe no exemplo em estudo:
bInterval - Este atributo é usado para os endpoints do tipo interrupção, e este valor representa o intervalo entre as requisições de interrupção. Valor que é representado em milisegundos. Segue sua utilização no driver btusb.
* Criação de interface
Os endpoints, apresentados na seção anterior, são encapsulados por uma interface, que controlam apenas um tipo de conexão USB lógica, como um mouse, teclado ou stream de audio. Sendo assim, cada interface é controlada exclusivamente por um driver, desta forma, quando um dispositivo precisa de se comunicar com o computador por meio de mais de uma interface, serão necessários mais de um driver. Um para cada interface. As interfaces possuem alguns parâmetros de configuração que podem ser alterados de acordo com a necessidade e especificidade de cada endpoint. O estado inicial da interface pode ser alterado pelos parametros de configuração, que podem definir, por exemplo, a largura de banda USB exigida pelo dispositivo. A estrutura definida no kernel pelas interfaces é a usb_interface e está representada no btusb na definição das estruturas iniciais:
* Criação de configuração (configuration)
* Tipos de comunicação utilizados pelo driver (control, bulk, etc);
Os drivers USB comunicam com todos os dispositivos USB através de uma estrutura chamada urb (USB request block), ela é utilizada para enviar e receber dados de um endpoint USB em um dispositivo específico de maneira assincrona. Abaixo segue o trecho de código do btusb referente a comunicação utilizando este conceito de urb.

## Finalização

* Mensagens de remoção do dispositivo
* Desalocação/liberação de estruturas;

## Considerações finais

* Informações gerais do driver
* Conclusões
* Mapa conceitual sobre o driver estudado;

# Bibliografia/Referências

* http://www.klabs.be/~fpiat/linux/bluetooth/bluetooth_HOWTO.html
* http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/drivers/bluetooth/btusb.c
* http://hardware4linux.info/module/btusb/
* http://cateee.net/lkddb/web-lkddb/BT_HCIBTUSB.html