SlideShare uma empresa Scribd logo
Luiz Francisco Bozo - 2008



KERNEL DRIVER

Existem duas formas de utilizar o display USB:

1 – Criar um device driver
2 – Usar um device driver padrão

TIPO DE INTERFACE COM O USER SPACE:

1 – Block device driver (armazena dados)     Não
2 – Character device driver (envia e recebe caracteres)   Sim

Obs.: Um Character device driver necessita reservar major e minor numbers. Por
exemplo, se eu quiser conectar 10 displays USB, devo reservar no mínimo 10 minor
numbers. Mas se eu for conectar apenas um display por máquina, não necessito
desperdiçar recursos.

CONTROLE DE TRANSFERÊNCIA (I/O):

Para a primeira etapa de desenvolvimento o PIC não necessita enviar caracteres para
o PC, apenas receber dados relativos ao funcionamento do mesmo e eventualmente
cadeias de caracteres referentes a mensagens.
O acionamento dos displays (20x2 e 20x4) pode ser controlado de duas formas:

1 - Dentro do PIC (como é feito nos programas de testes)
2 - A outra forma é aproveitar a estrutura dos comandos que são executados hoje no
MicroCPD (comandos para a porta paralela) e adaptá-los para enviar via USB.

De qualquer forma, deve existir uma estrutura (script, macro, programa) que capture
as informações necessárias do sistema e envie ao driver do display.

Obs.: Existem comandos ioctl no character driver que possibilitam o envio de dados
para o display, provavelmente será melhor criar meus próprios comandos ioctl no
Kernel.

Como todos os dispositivos USB figuram em seu próprio diretório na árvore sysfs, por
que não usar sysfs e criar arquivos no diretório de dispositivos USB? Isto possibilita
que qualquer programa do user-space feito em C ou através de script Shell envie
mensagens ao display. Isto também evita que tenhamos que escrever um character
driver e implorar por um pedaço de minor numbers para nosso dispositivo.

Para acionar o USB driver, nós precisamos prover 5 itens ao USB subsystem:

1 – Um ponteiro p/ o módulo proprietário desse driver: Isto habilita o USB core a
controlar o módulo reference count do driver apropriadamente;
2 – O nome do USB driver;
3 – Uma lista de USB IDs que este driver provê: Esta tabela é usada pelo USB core
para determinar qual driver foi escolhido para qual dispositivo; os scripts hot-plug
user-space usam esta tabela para carregar o driver automaticamente quando um
dispositivo é conectado no sistema.
Luiz Francisco Bozo - 2008



4 – Uma função sonda probe( ) chamada pelo USB core quando um dispositivo é
encontrado e figura na USB ID table;
5 – Uma função disconnect( ) chamada quando o dispositivo é removido do sistema.

O driver recupera esta informação com o seguinte código:

static struct usb_driver vader_driver =
{
        .owner =       THIS_MODULE,
        .name          =      “usbvader”,
        .probe         =      vader_probe,
        .disconnect =         vader_disconnect,
        .id_table      =      id_table,
};

A variável id_table é definida como:

static struct usb_device_id id_table [ ] =
{
        { USB_DEVICE(VENDOR_ID, PRODUCT_ID)},
        { },
};
MODULE_DEVICE_TABLE(usb,id_table);

A função vader_probe( ) e a função vader_disconnect( ) serão descritas mais
adiante.

Quando o módulo do driver é carregado, a estrutura vader_driver deve ser registrada
no USB core. Isto é realizado com uma única chamada à função usb_register( ):

retval = usb_register(&vader_driver);
if(retval)
        err(“usb_register falhou.”
               “Erro nro %d”,retval);

Do mesmo modo, quando o driver é descarregado do sistema, ele deve se de-
registrar do SUB core:

usb_deregister(&vader_driver);

A função vader_probe( ) é chamada quando o USB core encontrar nosso dispositivo
VADER. Tudo que é necessário fazer é inicializar o dispositivo e criar o arquivo no
sysfs no local apropriado. Isto é feito com o código a seguir:

/* Inicializa nossa estrutura local para o dispositivo */
dev = kmalloc(sizeof(struct usb_vader), GFP_KERNEL);
memset (dev, 0x00, sizeof (*dev));
Luiz Francisco Bozo - 2008




dev->udev = usb_get_dev(udev);
usb_set_intfdata (interface, dev);

/* Cria o arquivo p/ sysfs no USB * device directory */
device_create_file(&interface->dev, &dev_attr_arquivo);

dev_info(&interface->dev,
   "USB VADER conectadon");
return 0;

A função vader_disconnect( ) é igualmente simples, é necessário liberar a memória
alocada e remover o arquivo sysfs:

dev = usb_get_infdata(interface);
usb_set_intfdata(interface, NULL);
device_remove_file(&interface->dev, &dev_attr_arquivo);

usb_put_dev(dev->udev);
kfree(dev);

dev_info(&interface->dev,”USB VADER desconectadon”);

Quando o arquivo sysfs é lido, mostra uma mensagem vinda do PIC; quando o
arquivo for escrito, irá enviar uma mensagem para o PIC. A macro a seguir cria duas
funções e declara um arquivo sysfs de atributo de dispositivo:

#define show_set(value)                               
static ssize_t                                        
show_##value(struct device *dev, char *buf)           
{                                                     
  struct usb_interface *intf =                        
    to_usb_interface(dev);                            
  struct usb_vader *vader = usb_get_intfdata(intf);   
                                                      
    return sprintf(buf, "%dn", vader->value);        
}                                                     
                                                      
static ssize_t                                        
set_##value(struct device *dev, const char *buf,      
        size_t count)                                 
{                                                     
  struct usb_interface *intf =                        
    to_usb_interface(dev);                            
  struct usb_vader *vader = usb_get_intfdata(intf);   
  int temp = simple_strtoul(buf, NULL, 10);           
                                                      
    vader->value = temp;                              
    change_color(led);                                
    return count;                                     
}
Luiz Francisco Bozo - 2008




static DEVICE_ATTR(value, S_IWUGO | S_IRUGO,
show_##value, set_##value);
show_set(blue);
show_set(red);
show_set(green);
Luiz Francisco Bozo - 2008

Mais conteúdo relacionado

Mais procurados

pgBouncer: um aglomerador de conexões para PostgreSQL
pgBouncer: um aglomerador de conexões para PostgreSQLpgBouncer: um aglomerador de conexões para PostgreSQL
pgBouncer: um aglomerador de conexões para PostgreSQLelliando dias
 
Oficina postgresql basico_consegi2010
Oficina postgresql basico_consegi2010Oficina postgresql basico_consegi2010
Oficina postgresql basico_consegi2010Fabrízio Mello
 
Implementação de Aplicações Móveis e Jogos com Python - Aula 3
Implementação de Aplicações Móveis e Jogos com Python - Aula 3Implementação de Aplicações Móveis e Jogos com Python - Aula 3
Implementação de Aplicações Móveis e Jogos com Python - Aula 3
Flávio Ribeiro
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
Elton Minetto
 
PHP fora da Web
PHP fora da WebPHP fora da Web
PHP fora da Web
Vinícius Campitelli
 
Implementação de Aplicações Móveis e Jogos com Python - Aula 6
Implementação de Aplicações Móveis e Jogos com Python - Aula 6Implementação de Aplicações Móveis e Jogos com Python - Aula 6
Implementação de Aplicações Móveis e Jogos com Python - Aula 6
Flávio Ribeiro
 
Javascript
JavascriptJavascript
Javascript
Fernando Simeone
 
SQLAlchemy e Plone: no more zsql methods
SQLAlchemy e Plone: no more zsql methodsSQLAlchemy e Plone: no more zsql methods
SQLAlchemy e Plone: no more zsql methods
Simples Consultoria
 

Mais procurados (8)

pgBouncer: um aglomerador de conexões para PostgreSQL
pgBouncer: um aglomerador de conexões para PostgreSQLpgBouncer: um aglomerador de conexões para PostgreSQL
pgBouncer: um aglomerador de conexões para PostgreSQL
 
Oficina postgresql basico_consegi2010
Oficina postgresql basico_consegi2010Oficina postgresql basico_consegi2010
Oficina postgresql basico_consegi2010
 
Implementação de Aplicações Móveis e Jogos com Python - Aula 3
Implementação de Aplicações Móveis e Jogos com Python - Aula 3Implementação de Aplicações Móveis e Jogos com Python - Aula 3
Implementação de Aplicações Móveis e Jogos com Python - Aula 3
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
PHP fora da Web
PHP fora da WebPHP fora da Web
PHP fora da Web
 
Implementação de Aplicações Móveis e Jogos com Python - Aula 6
Implementação de Aplicações Móveis e Jogos com Python - Aula 6Implementação de Aplicações Móveis e Jogos com Python - Aula 6
Implementação de Aplicações Móveis e Jogos com Python - Aula 6
 
Javascript
JavascriptJavascript
Javascript
 
SQLAlchemy e Plone: no more zsql methods
SQLAlchemy e Plone: no more zsql methodsSQLAlchemy e Plone: no more zsql methods
SQLAlchemy e Plone: no more zsql methods
 

Destaque

Intel Core 2 Duo
Intel Core 2 DuoIntel Core 2 Duo
Intel Core 2 DuoShaneth
 
Tipos de redes.
Tipos de redes.Tipos de redes.
Tipos de redes.
juan_lopez
 
Procesadores Core 2 Duo
Procesadores Core 2 DuoProcesadores Core 2 Duo
Procesadores Core 2 Duo
Edison Narvaez
 
Chipset y bios
Chipset y biosChipset y bios
Chipset y bioslaru970104
 
Turorial flash1
Turorial flash1Turorial flash1
Turorial flash1luzeiitha
 
placa madre
placa madreplaca madre
placa madre
juan_lopez
 
Chipset y bios
Chipset y biosChipset y bios
Chipset y bioslaru1604
 
CORE 2 DUO
CORE 2 DUOCORE 2 DUO
CORE 2 DUO
77danielmora
 
Chipset de computadoras
Chipset de computadorasChipset de computadoras
Chipset de computadoras
Gustavo Alfaro
 
Software de sistema
Software de sistemaSoftware de sistema
Software de sistemaAndyHP
 
Chipset
Chipset Chipset
Chipset
Eduardo Suarez
 

Destaque (14)

Configuracion del bios
Configuracion del biosConfiguracion del bios
Configuracion del bios
 
Intel Core 2 Duo
Intel Core 2 DuoIntel Core 2 Duo
Intel Core 2 Duo
 
Tipos de redes.
Tipos de redes.Tipos de redes.
Tipos de redes.
 
Procesadores Core 2 Duo
Procesadores Core 2 DuoProcesadores Core 2 Duo
Procesadores Core 2 Duo
 
Core 2 Duo
Core 2 DuoCore 2 Duo
Core 2 Duo
 
Chipset y bios
Chipset y biosChipset y bios
Chipset y bios
 
Turorial flash1
Turorial flash1Turorial flash1
Turorial flash1
 
placa madre
placa madreplaca madre
placa madre
 
Chipset y bios
Chipset y biosChipset y bios
Chipset y bios
 
CORE 2 DUO
CORE 2 DUOCORE 2 DUO
CORE 2 DUO
 
Puertos y conectores
Puertos y conectoresPuertos y conectores
Puertos y conectores
 
Chipset de computadoras
Chipset de computadorasChipset de computadoras
Chipset de computadoras
 
Software de sistema
Software de sistemaSoftware de sistema
Software de sistema
 
Chipset
Chipset Chipset
Chipset
 

Semelhante a Kernel driver

Dev Ext PHP
Dev Ext PHPDev Ext PHP
Dev Ext PHP
Andre Golvea
 
Tutorial: Instalação de Ubuntu em uma Gumstix Overo
Tutorial: Instalação de Ubuntu em uma Gumstix OveroTutorial: Instalação de Ubuntu em uma Gumstix Overo
Tutorial: Instalação de Ubuntu em uma Gumstix Overo
Lab. de Sistemas Embarcados Críticos - ICMC/USP
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014
Michael Castillo Granados
 
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
tdc-globalcode
 
Gentoo por marcelo rocha
Gentoo por marcelo rochaGentoo por marcelo rocha
Gentoo por marcelo rocha
SENAC RIO
 
Tutorial beagleboard
Tutorial beagleboardTutorial beagleboard
Tutorial beagleboard
Alexandre Augusto Giron
 
Desenvolvimento de Extensões PECL
Desenvolvimento de Extensões PECLDesenvolvimento de Extensões PECL
Desenvolvimento de Extensões PECL
Erick Belluci Tedeschi
 
Php FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHPPhp FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHP
Marcio Albuquerque
 
Desenvolvimento iOS
Desenvolvimento iOSDesenvolvimento iOS
Desenvolvimento iOS
André Espeiorin
 
Resumo LPIC-1 101
Resumo LPIC-1 101Resumo LPIC-1 101
Resumo LPIC-1 101
foschi
 
Treinamento arduino (1).pptx
Treinamento arduino (1).pptxTreinamento arduino (1).pptx
Treinamento arduino (1).pptx
David Monteiro Mello
 
Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programação
ronaldoferraz
 
Asterisk
AsteriskAsterisk
Python Para Maemo
Python Para MaemoPython Para Maemo
Python Para Maemo
Osvaldo Santana Neto
 
Desenvolvendo Sistemas de Arquivos no FUSE - Luis Otávio de Colla Furquim
Desenvolvendo Sistemas de Arquivos no FUSE - Luis Otávio de Colla FurquimDesenvolvendo Sistemas de Arquivos no FUSE - Luis Otávio de Colla Furquim
Desenvolvendo Sistemas de Arquivos no FUSE - Luis Otávio de Colla FurquimTchelinux
 
Hackeando um SmartBOX (com android) e instalando Linux & JAVA & OpenDevice
Hackeando um SmartBOX (com android) e instalando Linux & JAVA & OpenDeviceHackeando um SmartBOX (com android) e instalando Linux & JAVA & OpenDevice
Hackeando um SmartBOX (com android) e instalando Linux & JAVA & OpenDevice
Ricardo Rufino
 
Apresentação tcd
Apresentação tcdApresentação tcd
Apresentação tcdThata2012
 
Simpósio Unicruz: OpenCV + Python (parte 1)
Simpósio Unicruz: OpenCV + Python (parte 1)Simpósio Unicruz: OpenCV + Python (parte 1)
Simpósio Unicruz: OpenCV + Python (parte 1)
Cristiano Rafael Steffens
 
Linux4all#2
Linux4all#2Linux4all#2
Linux4all#2
Daniel
 

Semelhante a Kernel driver (20)

kerneldriver01
kerneldriver01kerneldriver01
kerneldriver01
 
Dev Ext PHP
Dev Ext PHPDev Ext PHP
Dev Ext PHP
 
Tutorial: Instalação de Ubuntu em uma Gumstix Overo
Tutorial: Instalação de Ubuntu em uma Gumstix OveroTutorial: Instalação de Ubuntu em uma Gumstix Overo
Tutorial: Instalação de Ubuntu em uma Gumstix Overo
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014
 
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
 
Gentoo por marcelo rocha
Gentoo por marcelo rochaGentoo por marcelo rocha
Gentoo por marcelo rocha
 
Tutorial beagleboard
Tutorial beagleboardTutorial beagleboard
Tutorial beagleboard
 
Desenvolvimento de Extensões PECL
Desenvolvimento de Extensões PECLDesenvolvimento de Extensões PECL
Desenvolvimento de Extensões PECL
 
Php FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHPPhp FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHP
 
Desenvolvimento iOS
Desenvolvimento iOSDesenvolvimento iOS
Desenvolvimento iOS
 
Resumo LPIC-1 101
Resumo LPIC-1 101Resumo LPIC-1 101
Resumo LPIC-1 101
 
Treinamento arduino (1).pptx
Treinamento arduino (1).pptxTreinamento arduino (1).pptx
Treinamento arduino (1).pptx
 
Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programação
 
Asterisk
AsteriskAsterisk
Asterisk
 
Python Para Maemo
Python Para MaemoPython Para Maemo
Python Para Maemo
 
Desenvolvendo Sistemas de Arquivos no FUSE - Luis Otávio de Colla Furquim
Desenvolvendo Sistemas de Arquivos no FUSE - Luis Otávio de Colla FurquimDesenvolvendo Sistemas de Arquivos no FUSE - Luis Otávio de Colla Furquim
Desenvolvendo Sistemas de Arquivos no FUSE - Luis Otávio de Colla Furquim
 
Hackeando um SmartBOX (com android) e instalando Linux & JAVA & OpenDevice
Hackeando um SmartBOX (com android) e instalando Linux & JAVA & OpenDeviceHackeando um SmartBOX (com android) e instalando Linux & JAVA & OpenDevice
Hackeando um SmartBOX (com android) e instalando Linux & JAVA & OpenDevice
 
Apresentação tcd
Apresentação tcdApresentação tcd
Apresentação tcd
 
Simpósio Unicruz: OpenCV + Python (parte 1)
Simpósio Unicruz: OpenCV + Python (parte 1)Simpósio Unicruz: OpenCV + Python (parte 1)
Simpósio Unicruz: OpenCV + Python (parte 1)
 
Linux4all#2
Linux4all#2Linux4all#2
Linux4all#2
 

Mais de Luiz Francisco Bozo

Modelo totem
Modelo totemModelo totem
Modelo totem
Luiz Francisco Bozo
 
Esboços de chassis e componentes internos de Servidor
Esboços de chassis e componentes internos de ServidorEsboços de chassis e componentes internos de Servidor
Esboços de chassis e componentes internos de Servidor
Luiz Francisco Bozo
 
Tutorial do shell script para Clonar HDs WIN7 usando Linux
Tutorial do shell script para Clonar HDs WIN7 usando LinuxTutorial do shell script para Clonar HDs WIN7 usando Linux
Tutorial do shell script para Clonar HDs WIN7 usando Linux
Luiz Francisco Bozo
 
Tutorial do shell script para criar imagens de HDs Win7 usando Linux
Tutorial do shell script para criar imagens de HDs Win7 usando LinuxTutorial do shell script para criar imagens de HDs Win7 usando Linux
Tutorial do shell script para criar imagens de HDs Win7 usando Linux
Luiz Francisco Bozo
 
Pilha em C
Pilha em CPilha em C
Fila em C
Fila em CFila em C
Árvore Binária em C
Árvore Binária em CÁrvore Binária em C
Árvore Binária em C
Luiz Francisco Bozo
 
Alocação Dinâmica em C
Alocação Dinâmica em CAlocação Dinâmica em C
Alocação Dinâmica em C
Luiz Francisco Bozo
 
Configurar Kernel Linux para usar os Sensores de uma Placa-mãe
Configurar Kernel Linux para usar os Sensores de uma Placa-mãeConfigurar Kernel Linux para usar os Sensores de uma Placa-mãe
Configurar Kernel Linux para usar os Sensores de uma Placa-mãe
Luiz Francisco Bozo
 
Display HD44780 usando PIC 18F4550 e USB
Display HD44780 usando PIC 18F4550 e USBDisplay HD44780 usando PIC 18F4550 e USB
Display HD44780 usando PIC 18F4550 e USB
Luiz Francisco Bozo
 
Configuração do Router/Bridge Wireless Tsunami
Configuração do Router/Bridge Wireless TsunamiConfiguração do Router/Bridge Wireless Tsunami
Configuração do Router/Bridge Wireless Tsunami
Luiz Francisco Bozo
 
Pequeno exemplo sobre strings nmea
Pequeno exemplo sobre strings nmeaPequeno exemplo sobre strings nmea
Pequeno exemplo sobre strings nmea
Luiz Francisco Bozo
 
Resumo gps
Resumo gpsResumo gps
Função Retorna MAC ADDRESS do Adaptador de rede
Função Retorna MAC ADDRESS do Adaptador de redeFunção Retorna MAC ADDRESS do Adaptador de rede
Função Retorna MAC ADDRESS do Adaptador de rede
Luiz Francisco Bozo
 
Status Configuração inicia router/bridge wireless Tsunamil
Status Configuração inicia router/bridge wireless TsunamilStatus Configuração inicia router/bridge wireless Tsunamil
Status Configuração inicia router/bridge wireless Tsunamil
Luiz Francisco Bozo
 
Chipset
ChipsetChipset
Pmbok e Agil (folha 01)
Pmbok e Agil (folha 01)Pmbok e Agil (folha 01)
Pmbok e Agil (folha 01)
Luiz Francisco Bozo
 
Roteiro IOC 05
Roteiro IOC 05Roteiro IOC 05
Roteiro IOC 05
Luiz Francisco Bozo
 
Roteiro IOC 03_2
Roteiro IOC 03_2Roteiro IOC 03_2
Roteiro IOC 03_2
Luiz Francisco Bozo
 
Roteiro IOC 03_1
Roteiro IOC 03_1Roteiro IOC 03_1
Roteiro IOC 03_1
Luiz Francisco Bozo
 

Mais de Luiz Francisco Bozo (20)

Modelo totem
Modelo totemModelo totem
Modelo totem
 
Esboços de chassis e componentes internos de Servidor
Esboços de chassis e componentes internos de ServidorEsboços de chassis e componentes internos de Servidor
Esboços de chassis e componentes internos de Servidor
 
Tutorial do shell script para Clonar HDs WIN7 usando Linux
Tutorial do shell script para Clonar HDs WIN7 usando LinuxTutorial do shell script para Clonar HDs WIN7 usando Linux
Tutorial do shell script para Clonar HDs WIN7 usando Linux
 
Tutorial do shell script para criar imagens de HDs Win7 usando Linux
Tutorial do shell script para criar imagens de HDs Win7 usando LinuxTutorial do shell script para criar imagens de HDs Win7 usando Linux
Tutorial do shell script para criar imagens de HDs Win7 usando Linux
 
Pilha em C
Pilha em CPilha em C
Pilha em C
 
Fila em C
Fila em CFila em C
Fila em C
 
Árvore Binária em C
Árvore Binária em CÁrvore Binária em C
Árvore Binária em C
 
Alocação Dinâmica em C
Alocação Dinâmica em CAlocação Dinâmica em C
Alocação Dinâmica em C
 
Configurar Kernel Linux para usar os Sensores de uma Placa-mãe
Configurar Kernel Linux para usar os Sensores de uma Placa-mãeConfigurar Kernel Linux para usar os Sensores de uma Placa-mãe
Configurar Kernel Linux para usar os Sensores de uma Placa-mãe
 
Display HD44780 usando PIC 18F4550 e USB
Display HD44780 usando PIC 18F4550 e USBDisplay HD44780 usando PIC 18F4550 e USB
Display HD44780 usando PIC 18F4550 e USB
 
Configuração do Router/Bridge Wireless Tsunami
Configuração do Router/Bridge Wireless TsunamiConfiguração do Router/Bridge Wireless Tsunami
Configuração do Router/Bridge Wireless Tsunami
 
Pequeno exemplo sobre strings nmea
Pequeno exemplo sobre strings nmeaPequeno exemplo sobre strings nmea
Pequeno exemplo sobre strings nmea
 
Resumo gps
Resumo gpsResumo gps
Resumo gps
 
Função Retorna MAC ADDRESS do Adaptador de rede
Função Retorna MAC ADDRESS do Adaptador de redeFunção Retorna MAC ADDRESS do Adaptador de rede
Função Retorna MAC ADDRESS do Adaptador de rede
 
Status Configuração inicia router/bridge wireless Tsunamil
Status Configuração inicia router/bridge wireless TsunamilStatus Configuração inicia router/bridge wireless Tsunamil
Status Configuração inicia router/bridge wireless Tsunamil
 
Chipset
ChipsetChipset
Chipset
 
Pmbok e Agil (folha 01)
Pmbok e Agil (folha 01)Pmbok e Agil (folha 01)
Pmbok e Agil (folha 01)
 
Roteiro IOC 05
Roteiro IOC 05Roteiro IOC 05
Roteiro IOC 05
 
Roteiro IOC 03_2
Roteiro IOC 03_2Roteiro IOC 03_2
Roteiro IOC 03_2
 
Roteiro IOC 03_1
Roteiro IOC 03_1Roteiro IOC 03_1
Roteiro IOC 03_1
 

Kernel driver

  • 1. Luiz Francisco Bozo - 2008 KERNEL DRIVER Existem duas formas de utilizar o display USB: 1 – Criar um device driver 2 – Usar um device driver padrão TIPO DE INTERFACE COM O USER SPACE: 1 – Block device driver (armazena dados) Não 2 – Character device driver (envia e recebe caracteres) Sim Obs.: Um Character device driver necessita reservar major e minor numbers. Por exemplo, se eu quiser conectar 10 displays USB, devo reservar no mínimo 10 minor numbers. Mas se eu for conectar apenas um display por máquina, não necessito desperdiçar recursos. CONTROLE DE TRANSFERÊNCIA (I/O): Para a primeira etapa de desenvolvimento o PIC não necessita enviar caracteres para o PC, apenas receber dados relativos ao funcionamento do mesmo e eventualmente cadeias de caracteres referentes a mensagens. O acionamento dos displays (20x2 e 20x4) pode ser controlado de duas formas: 1 - Dentro do PIC (como é feito nos programas de testes) 2 - A outra forma é aproveitar a estrutura dos comandos que são executados hoje no MicroCPD (comandos para a porta paralela) e adaptá-los para enviar via USB. De qualquer forma, deve existir uma estrutura (script, macro, programa) que capture as informações necessárias do sistema e envie ao driver do display. Obs.: Existem comandos ioctl no character driver que possibilitam o envio de dados para o display, provavelmente será melhor criar meus próprios comandos ioctl no Kernel. Como todos os dispositivos USB figuram em seu próprio diretório na árvore sysfs, por que não usar sysfs e criar arquivos no diretório de dispositivos USB? Isto possibilita que qualquer programa do user-space feito em C ou através de script Shell envie mensagens ao display. Isto também evita que tenhamos que escrever um character driver e implorar por um pedaço de minor numbers para nosso dispositivo. Para acionar o USB driver, nós precisamos prover 5 itens ao USB subsystem: 1 – Um ponteiro p/ o módulo proprietário desse driver: Isto habilita o USB core a controlar o módulo reference count do driver apropriadamente; 2 – O nome do USB driver; 3 – Uma lista de USB IDs que este driver provê: Esta tabela é usada pelo USB core para determinar qual driver foi escolhido para qual dispositivo; os scripts hot-plug user-space usam esta tabela para carregar o driver automaticamente quando um dispositivo é conectado no sistema.
  • 2. Luiz Francisco Bozo - 2008 4 – Uma função sonda probe( ) chamada pelo USB core quando um dispositivo é encontrado e figura na USB ID table; 5 – Uma função disconnect( ) chamada quando o dispositivo é removido do sistema. O driver recupera esta informação com o seguinte código: static struct usb_driver vader_driver = { .owner = THIS_MODULE, .name = “usbvader”, .probe = vader_probe, .disconnect = vader_disconnect, .id_table = id_table, }; A variável id_table é definida como: static struct usb_device_id id_table [ ] = { { USB_DEVICE(VENDOR_ID, PRODUCT_ID)}, { }, }; MODULE_DEVICE_TABLE(usb,id_table); A função vader_probe( ) e a função vader_disconnect( ) serão descritas mais adiante. Quando o módulo do driver é carregado, a estrutura vader_driver deve ser registrada no USB core. Isto é realizado com uma única chamada à função usb_register( ): retval = usb_register(&vader_driver); if(retval) err(“usb_register falhou.” “Erro nro %d”,retval); Do mesmo modo, quando o driver é descarregado do sistema, ele deve se de- registrar do SUB core: usb_deregister(&vader_driver); A função vader_probe( ) é chamada quando o USB core encontrar nosso dispositivo VADER. Tudo que é necessário fazer é inicializar o dispositivo e criar o arquivo no sysfs no local apropriado. Isto é feito com o código a seguir: /* Inicializa nossa estrutura local para o dispositivo */ dev = kmalloc(sizeof(struct usb_vader), GFP_KERNEL); memset (dev, 0x00, sizeof (*dev));
  • 3. Luiz Francisco Bozo - 2008 dev->udev = usb_get_dev(udev); usb_set_intfdata (interface, dev); /* Cria o arquivo p/ sysfs no USB * device directory */ device_create_file(&interface->dev, &dev_attr_arquivo); dev_info(&interface->dev, "USB VADER conectadon"); return 0; A função vader_disconnect( ) é igualmente simples, é necessário liberar a memória alocada e remover o arquivo sysfs: dev = usb_get_infdata(interface); usb_set_intfdata(interface, NULL); device_remove_file(&interface->dev, &dev_attr_arquivo); usb_put_dev(dev->udev); kfree(dev); dev_info(&interface->dev,”USB VADER desconectadon”); Quando o arquivo sysfs é lido, mostra uma mensagem vinda do PIC; quando o arquivo for escrito, irá enviar uma mensagem para o PIC. A macro a seguir cria duas funções e declara um arquivo sysfs de atributo de dispositivo: #define show_set(value) static ssize_t show_##value(struct device *dev, char *buf) { struct usb_interface *intf = to_usb_interface(dev); struct usb_vader *vader = usb_get_intfdata(intf); return sprintf(buf, "%dn", vader->value); } static ssize_t set_##value(struct device *dev, const char *buf, size_t count) { struct usb_interface *intf = to_usb_interface(dev); struct usb_vader *vader = usb_get_intfdata(intf); int temp = simple_strtoul(buf, NULL, 10); vader->value = temp; change_color(led); return count; }
  • 4. Luiz Francisco Bozo - 2008 static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value); show_set(blue); show_set(red); show_set(green);