Você está na página 1de 28

Universidade Federal do ABC Bacharelado em Cincia e Tecnologia

Mario E. Matiusso Jr. (1102847)


mario3001[a]ig.com.br

Desenvolvimento de dispositivo de jogo voltado para massificao de jogos eletrnicos na educao

Projeto Dirigido

Santo Andr SP junho / 2013

Mario E. Matiusso Jr. (11028407)

Desenvolvimento de Dispositivo de Jogo Voltado para Massificao de Jogos Eletrnicos na Educao

Trabalho apresentado Coordenao do Curso Superior de Cincia e Tecnologia da Universidade Federal do ABC para a obteno do diploma de Bacharel em Cincia e Tecnologia.

Orientador: Dr. Francisco Isidro Masseto

Co-orientadora: Dra. Adelaide Faljoni Alario

BACHARELADO EM CINCIA E TECNOLOGIA UNIVERSIDADE FEDERAL DO ABC

Santo Andr SP junho / 2013

Mario E. Matiusso Jr. (1102847)

Desenvolvimento de dispositivo de jogo voltado para massificao de jogos eletrnicos na educao

Este trabalho foi julgado e aprovado para a obteno do grau de Bacharel em Cincia e Tecnologia no curso de graduao em Cincia e Tecnologia da Universidade Federal do ABC.

Santo Andr SP, 25 de junho de 2013

___________________________________________________ Dra. Adelaide Faljoni Alario Co-Orientadora e Coordenadora do Curso

___________________________________________________ Dr. Francisco Isidro Masseto Orientador

___________________________________________________ Examinador Convidado

Agradecimentos
Dedico meus sinceros agradecimentos a Evelise Mondoni, que me emprestou seu velho computador com uma obsoleta porta serial RS232 para executar a gravao do microcontrolador.

Resumo

Neste artigo ser apresentado o estudo e desenvolvimento de um dispositivo de jogo com o objetivo de facilitar a promoo de desenvolvimento de jogos eletrnicos educativos. Foi desenvolvido um sistema microcontrolado que, aliado a um joystick, simula as entradas de um teclado padro. A partir disso foi criado um protocolo de fcil entendimento e de simples programao, reduzindo a complexidade de comunicao com dispositivos externos. Ao final deste artigo foi construdo um prottipo e testes foram realizados com sucesso.

Abstract

This paper will show a study and development of a gaming device with the purpose of to facilitate promotion of the development of educational electronic games. Was developed a electronic system coupled with a joystick simulating the inputs of a standard keyboard. From this was setup a protocol, easy to understand and simple programming reducing the complexity of communication between devices. At the end of this article was built a prototype and tests were successfully performed.

Sumrio

1 2 3 4 5 6 7 8 9

Introduo .................................................................................................................. 8 Arquitetura Geral do Sistema ................................................................................. 10 Descrio de Hardware e Software ......................................................................... 11 Protocolo de Comunicao ...................................................................................... 15 Caso de Uso .............................................................................................................. 17 Concluses ................................................................................................................ 21 Referncias Bibliogrficas ....................................................................................... 22 Anexo 1 Cdigo Fonte Firmware.......................................................................... 23 Anexo 2 Cdigo Fonte Descritor USB .................................................................. 26

Introduo

J no novidade de que jogos eletrnicos tem enorme poder educacional e so fortes aliados na construo do conhecimento. Pesquisas como a de Eric C. Hastings (1) tem comprovado que jogos violentos tem um impacto negativo na competncia escolar de uma criana. Por outro lado, os jogos educacionais esto sendo cada vez mais relacionados com resultados positivos no desempenho acadmico. Com sua crescente popularidade, podemos considerar os jogos eletrnicos como uma realidade para muitos, porm vemos que so extremamente subutilizados para educao. Normalmente o consumidor de jogos eletrnicos tem por objetivo puramente o entretenimento. De acordo com o Prof. Roger Tavares (2) os jogos educativos mais comuns so chatos e tendem a se tornar uma obrigao para crianas e adolescentes [...] ao sair da aula, eles voltam rotina, com games considerados agressivos - relacionados com impacto negativo no desempenho acadmico. O argumento do professor no assusta, pois desenvolver jogos com maior grau de sofisticao (consequentemente mais atrativos) muito custoso e demanda de grandes equipes. Desta forma o desenvolvimento dos jogos voltados para educao no atrai o pblico consumidor e seu desenvolvimento fica a cargo de pequenos grupos isolados que, muitas vezes, no tem condies de abordar os dois pontos fundamentais de um bom jogo eletrnico educacional: A didtica e a interface. No contexto descrito acima que surge a idia de um console baseado em tecnologias de mercado, que seja atrativo aos gamers, e com ferramentas que possibilitem que praticamente qualquer pessoa da comunidade acadmica tenha condies de desenvolver e distribuir um jogo eletrnico de qualidade. Este projeto ir focar no desenvolvimento de um joystick no somente com objetivo de tornar a comunicao homem-mquina mais atrativa, mas que ir lanar mo de um protocolo de comunicao USB padro teclado. Desta forma o console no necessita de um driver de comunicao especfico, proporcionando a facilidade de programao da interface do jogo. Por fim, a proposta deste projeto o desenvolvimento de um joystick em que seu

protocolo de comunicao seja simples e intuitivo para desenvolvedores independentes. A sequncia deste artigo consiste em descrever a arquitetura geral do sistema na seo 2 e a descrio detalhada do hardware e software do joystick na seo 3. Na seo 4 ser descrito o protocolo de comunicao utilizado bem como o fluxo lgico do firmware. Na seo 5 ser mostrado um caso de uso. Por fim as concluses do artigo encontram-se na seo 6.

10

Arquitetura Geral do Sistema

O Android Mini PC, considerado um dispositivo mvel, ser transformado em um console para games, seguindo a idia do ouya (www.ouya.tv), porm com a vantagem de possuir uma App Store dedicada, interface de desenvolvimento intuitiva e um hardware consolidado. As transformaes como a criao da App Store e desenvolvimento de interface de programao no fazem parte deste projeto e no sero mais discutidas ao longo deste artigo. Uma particularidade deste projeto que a placa controladora no atrelada ao joystick em si. H um conector na placa de controle que possibilita a troca da interface com o usurio (botes, direcionais, etc). Ou seja, a interface com o usurio pode ser modificada de acordo com as necessidades de cada desenvolvedor.

Figura 1: Arquitetura geral do sistema

O sistema possui comunicao unidirecional Joystick -> Console. Neste projeto no est previsto (embora seja possvel sua implementao) o feedback do console para o joystick. A alimentao dos circuitos se dar atravs dos 5Vcc oriundos do televisor existentes no pino 18 do conector HDMI que consequentemente alimentar os circuitos USB.

11

Descrio de Hardware e Software

Um microcontrolador um computador-num-chip, contendo um processador, memria e perifricos de entrada/sada. Os microcontroladores se diferenciam dos processadores, pois alm dos componentes lgicos e aritmticos usuais de um microprocessador de uso geral, o microcontrolador integra elementos adicionais em sua estrutura interna, como memria de leitura e escrita para armazenamento de dados, memria somente de leitura para armazenamento de programas, EEPROM para armazenamento permanente de dados, dispositivos perifricos como conversores analgico/digitais (ADC) e interfaces de entrada e sada de dados. (Wikipdia) Foi utilizado como elemento central do joystick um microcontrolador Microchip PIC18F4550. Possui 32KB de memria flash, 2KB de memria RAM e 256 bytes de EEPROM. Possui tambm uma controladora USB interna que ser utilizada como interface com o Android Mini PC. A velocidade de clock do processador de 8Mhz, obtida atravs de oscilador externo. A frequncia interna de 48Mhz obtida atravs de multiplicador PLL 96Mhz/2. O microcontrolador, atravs de suas portas de entrada, ir receber os sinais eltricos oriundos dos trs botes e dois potencimetros e 4 DIP-Switchs, processar e enviar a informao como um protocolo de teclado atravs da porta USB. Os potencimetros so conectados a entradas do tipo analgica. Os botes e DIP-Switchs so conectados a entradas do tipo digital. So botes t ipo contato-seco e molhados com 5Vcc.

12

Figura 2: Arquitetura simplificada do Joystick

A funo de cada potencimetro capturar a posio dos eixos x e y do joystick. Tem o valor de resistncia de 160Kohms e so ligados diretamente as entradas AN0 e AN1 do controlador. As entradas analgicas AN0 e AN1 tem resoluo de 10 bits. Ento:

Assim a transformao de tenso eltrica em valor lgico dentro do software feita com 1024 divises com preciso de 4,8mV por unidade. Na prtica o software trabalha linearmente da seguinte forma:

Tenso (V) 0,0 2,5 5,0

Valor Lido 0 512 1024

Eixo Totalmente avanado No centro Totalmente retrado

Tabela 1: Converso de valores analgicos

13

Os botes so conectados as entradas RB0, RB1 e RB2 do controlador. So do tipo pull down (resistor ligado ao GND). Os DIP-Switchs tem a funo de possibilitar ao usurio selecionar um modo de operao do joystick. Esto conectados as entradas RB7...RB4 do controlador e tambm so do tipo pull down. Os modos de operao no foram implementados neste projeto, sendo que o sistema fica preparado para expanses futuras. Tambm foi previsto na placa um LED para sinalizao de status do Joystick, conectado na porta RD1 do controlador. Todo o circuito alimentado pelos 5Vcc (+Vcc) existentes no barramento USB.

Figura 3: Diagrama eltrico detalhado

Para processamento dos sinais dos botes e protocolo de comunicao, o microcontrolador embarca em sua memria um software, tecnicamente chamado de firmware. O firmware foi escrito em linguagem C e compilado com o compilador MicroC Pro verso 5.1 da Mikroeletronica. A linguagem C, apesar de consumir mais recursos que o Assembler,

14

foi escolhida por abstrair quase que completamente a arquitetura interna do controlador, tornando a escrita do software muito prxima a linguagem ANSI C. A funo do software basicamente ler os sinais dos botes e eixos, codificar e enviar para a porta USB. Abaixo um trecho do cdigo, no lao principal:

Figura 4: Trecho de cdigo de tratamento dos sinais

Em resumo, o fluxo lgico da informao se d nos seguintes passos:

1. Microcontrolador aguarda sinal de boto pressionado; 2. Usurio pressiona o boto do joystick / move o direcional; 3. Sinal eltrico enviado a porta do Microcontrolador; 4. Microcontrolador processa o sinal, codifica a mensagem e envia atravs da porta USB; 5. Volta para o passo 1.

15

Protocolo de Comunicao

O USB um barramento de comunicao serial plug and play hot swapping. A comunicao USB foi construda seguindo um modelo de fluxo de dados de trs camadas.

Figura 5: Modelo de fluxo de dados USB (www.usb.org)

O modelo de fluxo de dados USB segue o padro OSI. A transferncia de dados fsica se da na camada mais baixa, porm virtualmente os dados podem fluir na horizontal. Visando atingir o objetivo de proporcionar uma comunicao simples e intuitiva, vamos esconder todas as camadas de dados inferiores, p ara que o desenvolvedor Android possa preocupe-se apenas com a aplicao. Como o joystick ir implementar um protocolo de teclado padro, o sistema operacional dever reconhec-lo como um dispositivo padro, ou seja, todas as camadas de dados apresentadas na Figura 3 devero estar previamente implementadas por padro no sistema operacional restando ao desenvolvedor preocupar-se

16

apenas com uma interface para teclado no seu aplicativo. Do ponto de vista do joystick, a camada lgica e de barramento sero controladas totalmente pela biblioteca HID (Human Interface Device) USB Library. O envio de mensagem ser feito atravs de chamadas de funo USB_Write(). Ento, a troca de mensagens entre os dispositivos feito na camada de aplicao. O envio de mensagens feito atravs de interrupo. O processador, apesar do clock de apenas 8Mhz, muito rpido. Ento a cada mensagem enviada o software detecta que houve o envio e aguarda por volta de 100ms at que possa enviar a prxima mensagem. Caso contrrio uma quantidade excessiva de mensagens ser enviada com apenas um clique de boto. Para cada evento do joystick, foi definida uma mensagem que identificar o evento. Foram definidos 2 tipos de mensagens. So eles: Tipo 1 Mensagem no formato: [b@ Onde @ o cdigo dos botes pressionados de acordo com a tabela abaixo: B1 Solto Solto Solto Pressionado Pressionado Pressionado Pressionado B2 Solto Pressionado Pressionado Solto Solto Pressionado Pressionado B3 Cdigo Pressionado 1 Solto 2 Pressionado 3 Solto 4 Pressionado 5 Solto 6 Pressionado 7

Tabela 2: Codificao dos botes

O caractere [ dever ser utilizado para detectar o incio da mensagem de tipo 1. O caractere b indica que a mensagem relativa a um boto. Tipo 2 Mensagem no formato: ;x@@@@ ou ;y@@@@ Onde @ o valor do eixo x ou y, variando de 0 at 1024. O caractere ; dever ser utilizado para detectar o incio da mensagem de tipo 1. Os caracteres x e y indicam de qual eixo a informao contida na mensagem.

17

Caso de Uso

Nesta seo sero apresentadas as fases de montagem de um prottipo. A idia foi escrever inicialmente todo o firmware sobre uma plataforma de testes. Com o firmware em funcionamento transferir o processador para uma placa prottipo desenvo lvido em placa universal. A plataforma de testes escolhida foi a ACEPIC Pro V2.0. Sobre esta plataforma, seguindo a descrio de software da seo 2 e a especificao de protocolo da seo 3, foi escrito e testado todo o firmware.

Figura 6: Plataforma de testes

1. Microcontrolador PIC 18F4550 2. Porta USB conectada ao microcontrolador 3. Interface de gravao In-Circuit. 4. Botes que simularo os botes do joystick. 5. Potencimetros que simularo os eixos X e Y do joystick.

18

Aps os testes concludos, foi montada uma placa prottipo seguindo o diagrama eltrico detalhado da figura 3.

Figura 7: Placa Prottipo Conforme o diagrama eltrico, podemos ver o conector USB do lado esquerdo, para conexo com o Android Mini PC, e do lado direito o conector DB9, para conexo com o joystick. O micro controlador foi montado em soquete do tipo ZIF para facilitar sua remoo da placa caso necessrio. Para montagem do joystick foi reaproveitado um antigo controle de jogos de voo, retirada toda sua eletrnica, feita a ligao eltrica dos botes de acordo com a Figura 3 e montada de acordo com a figura abaixo.

Figura 8: Montagem do Joystick

19

1 e 2 so os potencimetros dos eixos x e y; 3, 4 e 5 so os botes. A montagem final ficou conforme a figura 9.

Figura 9: Montagem Final

Como o frmware j havia sido testado na plataforma de testes ACEPIC nh necessidade de efetuar novos testes de software. Ao conectar o dispositivo na porta USB de um computador com Sistema Operacional Windows 7 Professional, imediatamente o sistema reconhece o dispositivo como Dispositivo de teclado HID. Neste ponto o sistema entende que h um teclado padro conectado a ele.

Figura 10: Gerenciador de dispositivos do Windows

20

Reconhecido o dispositivo pelo sistema operacional, ao pressionar um boto ou movimentar o direcional do joystick, ocorre um input de dados idntico a de um teclado padro. Isso pode ser verificado atravs do notepad ou qualquer outro software que aguarde uma entrada de dados via teclado.

Figura 11: Input de dados do joystick visualizado pelo prompt de comando

Como vemos na figura 11, o joystick faz o input de dados emulando um teclado padro. Para exemplificar a facilidade de programao obtida com este sistema, foi desenvolvido um software de testes para o joystick.

Figura 12: Software de testes para o joystick

O software de testes possui uma text Box com funo de capturar os dados oriundos do joystick a cada 100ms. Os dados so convertidos para mover o quadro a esquerda ou acionar os botes a direita.

21

Concluses

Com relao ao domnio deste trabalho, o principal desafio enfrentado foi o entendimento da comunicao USB de forma a emular a um teclado atravs de um microcontrolador. De acordo com os testes realizados, podemos concluir que a interface padro via teclado se mostrou funcional. Conforme planejado no foram necessrio drivers adicionais no sistema operacional. No foi possvel realizar testes com o sistema operacional Android devido a indisponibilidade de um sistema com o mesmo instalado. O previsto que o sistema funcione conforme testado com o Windows. Como trabalhos pendentes, podemos incluir: Comunicao sem fio entre a placa controladora e o Android Mini PC, movimentao do mouse conforme deslocamento do direcional e modo de funcionamento hibrido (mouse + teclado).

22

Referncias Bibliogrficas

(1) Hastings EC, Karas TL, Winsler A, Way E, Madigan A, Tyler S. 2009. Young children's video/computer game use: relations with school performance and behavior. Disponvel em http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3041171/ (2) TAVARES, Roger. Games na educao: A batalha est comeando!. Senac. Entrevista concedida a pgina do Universo EAD. Disponvel em

http://www.ead.sp.senac.br/newsletter/setembro04/entrevista/entrevista.htm (3) Wikipdia (4) http://www.usb.org/developers

23

Anexo 1 Cdigo Fonte Firmware

#define #define #define #define #define #define #define #define #define #define #define #define

BOTAO1 BOTAO2 BOTAO3 SW1 SW2 SW3 SW4 SW5

!(PORTB !(PORTB !(PORTB PORTB & PORTB & PORTB & PORTB & PORTB &

& 0x01) //RB0 & 0x02) //RB1 & 0x04) //RB2 0x08 //RB3 0x10 //RB4 0x20 //RB5 0x40 //RB6 0x80 //RB6

TEMPO_DELAY_1 TEMPO_DELAY_2 TEMPO_DELAY_3 TEMPO_DELAY_4

10 50 100 500

unsigned char readbuff[64] absolute 0x500; unsigned char writebuff[64] absolute 0x540; static int eixoX = 0; static int eixoY = 0; static int valorAnteriorX = 0; static int valorAnteriorY = 0; static int processou = 0; int calculaCodigoBotoes(int B1, int B2,int B3); unsigned char num2cod(int numero); int diferenca(int n1, int n2); void interrupt(){ USB_Interrupt_Proc(); }

// USB servicing is done inside the interrupt

void enviaStringBotao(int codigoBotoes){ int i=0; //preenche o buffer writebuff[0] = 0x00; //comando especial (alt, shift, etc) writebuff[1] = 0x00; //reservado writebuff[2] = 0x30; //tecla "[" writebuff[3] = 0x05; //tecla "b" //calcula a codificao correta da tecla enviada if ((codigoBotoes >= 1) && (codigoBotoes <= 8)){ writebuff[4] = 0x1D + codigoBotoes; }else{ writebuff[4] = 0x08; } //continua preenchendo o buffer writebuff[5] = 0x00; //tecla nao usada writebuff[6] = 0x00; //tecla nao usada writebuff[7] = 0x00; //tecla nao usada //envia tudo while(!HID_Write(&writebuff,8)); //limpa o buffer for (i=0; i<=7; i++){ writebuff[i] = 0; } //envia o buffer vazio para avisar que a tecla nao est mais pressinada while(!HID_Write(&writebuff,8)); }

24

void enviaStringDirecional(int valorEixo, int eixoXY){ int i=0; int valorEixoBCD=0; int digito1, digito2, digito3, digito4; //quebra os quatro digitos do valor do eixo valorEixoBCD = Dec2Bcd16(valorEixo); digito1 = (valorEixoBCD & 0xF000) >> 12; digito2 = (valorEixoBCD & 0x0F00) >> 8; digito3 = (valorEixoBCD & 0x00F0) >> 4; digito4 = valorEixoBCD & 0x000F; //preenche o writebuff[0] writebuff[1] writebuff[2] buffer = 0x00; //comando especial (alt, shift, etc) = 0x00; //reservado = 0x38; //tecla ";"

if (eixoXY == 1){ writebuff[3] = 0x1B; //tecla "x" }else{ writebuff[3] = 0x1C; //tecla "y" } writebuff[4] writebuff[5] writebuff[6] writebuff[7] = = = = num2cod(digito1); num2cod(digito2); num2cod(digito3); num2cod(digito4); //1digito //2 digito //3 digito //4 digito

//envia tudo while(!HID_Write(&writebuff,8)); //limpa o buffer for (i=0; i<=7; i++){ writebuff[i] = 0; } //envia buffer vazio while(!HID_Write(&writebuff,8)); } void main(void){ TRISA TRISB TRISC TRISD = = = = 0xFF;//define porta como entrada 0xFF;//define portb como entrada 0xFF;//define portc como entrada 0x00; //define o port como sada

//inicializao de HW ADCON1 = 0b00001101; //Entradas AN0 e AN1 como analgicas, o resto tudo digital. CMCON |= 7; //desabilita comparadores // Enable HID communication HID_Enable(&readbuff,&writebuff); //lao principal while(1){ //verifica boto pressionado, codifica e envia if (BOTAO1 || BOTAO2 || BOTAO3){ enviaStringBotao(calculaCodigoBotoes(BOTAO1,BOTAO2,BOTAO3)); processou = 1; } //verifica se o valor da variavel analogica se alterou, //se positivo envia o valor valorAnteriorX = ADC_Read(0); if (diferenca(valorAnteriorX, eixoX) > 10){ eixoX = valorAnteriorX; enviaStringDirecional(eixoX,1); processou = 1; } valorAnteriorY = ADC_Read(1); if (diferenca(valorAnteriorY, eixoY) > 10){ eixoY = valorAnteriorY; enviaStringDirecional(eixoY,0); processou = 1;

25

} if (processou ==1){ processou = 0; Delay_ms(TEMPO_DELAY_3); } } }

26

Anexo 2 Cdigo Fonte Descritor USB

void USB_Init_Desc(); const unsigned int USB_VENDOR_ID = 0x0314; const unsigned int USB_PRODUCT_ID = 0x2201; const char USB_SELF_POWER = 0x80; const char USB_MAX_POWER = 50; const char HID_INPUT_REPORT_BYTES = 64; const char HID_OUTPUT_REPORT_BYTES = 64; const char USB_TRANSFER_TYPE = 0x03; const char EP_IN_INTERVAL = 1; const char EP_OUT_INTERVAL = 1; const char USB_INTERRUPT = 1; const char USB_HID_EP = 1; const char USB_HID_RPT_SIZE = 63; /* Device Descriptor */ const struct { char bLength; char bDescriptorType; unsigned int bcdUSB; char bDeviceClass; char bDeviceSubClass; char bDeviceProtocol; char bMaxPacketSize0; unsigned int idVendor; unsigned int idProduct; unsigned int bcdDevice; char iManufacturer; manufacturer char iProduct; product. char iSerialNumber; number. char bNumConfigurations; } device_dsc = { 0x12, 0x01, 0x0200, 0x00, 0x00, 0x00, 8, USB_VENDOR_ID, USB_PRODUCT_ID, 0x0001, 0x01, 0x02, 0x00, 0x01 };

// Self powered 0xC0, 0x80 bus powered // Bus power required in units of 2 mA //0x03 Interrupt

// // // // // // // // // // //

bLength bDescriptorType bcdUSB bDeviceClass bDeviceSubClass bDeviceProtocol bMaxPacketSize0 idVendor idProduct bcdDevice iManufacturer

Descriptor size in bytes (12h) The constant DEVICE (01h) USB specification release number (BCD) Class Code Subclass code Protocol code Maximum packet size for endpoint 0 Vendor ID Product ID Device release number (BCD) Index of string descriptor for the

// iProduct // iSerialNumber

- Index of string descriptor for the - Index of string descriptor for the serial

// bNumConfigurations - Number of possible configurations // // // // // // // // // // // // // // bLength bDescriptorType bcdUSB bDeviceClass bDeviceSubClass bDeviceProtocol bMaxPacketSize0 idVendor idProduct bcdDevice iManufacturer iProduct iSerialNumber bNumConfigurations

/* Configuration 1 Descriptor */ const char configDescriptor1[]= { // Configuration Descriptor 0x09, // bLength 0x02, // bDescriptorType 0x29,0x00, // wTotalLength descriptor and all of its subordinate descriptors 1, // bNumInterfaces 1, // bConfigurationValue Configuration requests

- Descriptor size in bytes - The constant CONFIGURATION (02h) - The number of bytes in the configuration - Number of interfaces in the configuration - Identifier for Set Configuration and Get

27

0, configuration USB_SELF_POWER, USB_MAX_POWER, // Interface Descriptor 0x09, 0x04, 0, 0, alternate settings for this 2, endpoint zero 0x03, 0, 0, 0,

// iConfiguration // bmAttributes // bMaxPower

- Index of string descriptor for the - Self/bus power and remote wakeup settings - Bus power required in units of 2 mA

// bLength - Descriptor size in bytes (09h) // bDescriptorType - The constant Interface (04h) // bInterfaceNumber - Number identifying this interface // bAlternateSetting - A number that identifies a descriptor with bInterfaceNumber. // bNumEndpoint - Number of endpoints supported not counting // // // // bInterfaceClass - Class code bInterfaceSubclass - Subclass code bInterfaceProtocol - Protocol code iInterface - Interface string index

// HID Class-Specific Descriptor 0x09, // bLength - Descriptor size in bytes. 0x21, // bDescriptorType - This descriptor's type: 21h to indicate the HID class. 0x01,0x01, // bcdHID - HID specification release number (BCD). 0x00, // bCountryCode - Numeric expression identifying the country for localized hardware (BCD) or 00h. 1, // bNumDescriptors - Number of subordinate report and physical descriptors. 0x22, // bDescriptorType - The type of a class-specific descriptor that follows USB_HID_RPT_SIZE,0x00, // wDescriptorLength - Total length of the descriptor identified above. // Endpoint Descriptor 0x07, 0x05, USB_HID_EP | 0x80, USB_TRANSFER_TYPE, 0x40,0x00, EP_IN_INTERVAL, // Endpoint Descriptor 0x07, 0x05, USB_HID_EP, USB_TRANSFER_TYPE, 0x40,0x00, EP_OUT_INTERVAL }; const struct { char report[USB_HID_RPT_SIZE]; }hid_rpt_desc = { {0x05, 0x01, 0x09, 0x06, 0xa1, 0x01, 0x05, 0x07, 0x19, 0xe0, 0x29, 0xe7, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x08, 0x81, 0x02, 0x95, 0x01, 0x75, 0x08, 0x81, 0x03, 0x95, 0x05, 0x75, 0x01, 0x05, 0x08, 0x19, 0x01, 0x29, 0x05, 0x91, 0x02, 0x95, 0x01, 0x75, 0x03, 0x91, 0x03, 0x95, 0x06, // // // // // // // // // // // // bLength - Descriptor size in bytes (07h) bDescriptorType - The constant Endpoint (05h) bEndpointAddress - Endpoint number and direction bmAttributes - Transfer type and supplementary information wMaxPacketSize - Maximum packet size supported bInterval - Service interval or NAK rate bLength - Descriptor size in bytes (07h) bDescriptorType - The constant Endpoint (05h) bEndpointAddress - Endpoint number and direction bmAttributes - Transfer type and supplementary information wMaxPacketSize - Maximum packet size supported bInterval - Service interval or NAK rate

// USAGE_PAGE (Generic Desktop) // USAGE (Keyboard) // COLLECTION (Application) // USAGE_PAGE (Keyboard) // USAGE_MINIMUM (Keyboard LeftControl) // USAGE_MAXIMUM (Keyboard Right GUI) // LOGICAL_MINIMUM (0) // LOGICAL_MAXIMUM (1) // REPORT_SIZE (1) // REPORT_COUNT (8) // INPUT (Data,Var,Abs) // REPORT_COUNT (1) // REPORT_SIZE (8) // INPUT (Cnst,Var,Abs) // REPORT_COUNT (5) // REPORT_SIZE (1) // USAGE_PAGE (LEDs) // USAGE_MINIMUM (Num Lock) // USAGE_MAXIMUM (Kana) // OUTPUT (Data,Var,Abs) // REPORT_COUNT (1) // REPORT_SIZE (3) // OUTPUT (Cnst,Var,Abs) // REPORT_COUNT (6)

28

0x75, 0x15, 0x25, 0x05, 0x19, 0x29, 0x81, 0xc0} };

0x08, 0x00, 0x65, 0x07, 0x00, 0x65, 0x00,

// REPORT_SIZE (8) // LOGICAL_MINIMUM (0) // LOGICAL_MAXIMUM (101) // USAGE_PAGE (Keyboard) // USAGE_MINIMUM (Reserved (no event indicated)) // USAGE_MAXIMUM (Keyboard Application) // INPUT (Data,Ary,Abs) // End Collection

//Language code string descriptor const struct { char bLength; char bDscType; unsigned int string[1]; } strd1 = { 4, 0x03, {0x0409} }; //Manufacturer string descriptor const struct{ char bLength; char bDscType; unsigned int string[16]; }strd2={ 34, //sizeof this descriptor string 0x03, {'M','a','r','i','o',' ','M','a','t','i','u','s','s','o',' ',' '} }; //Product string descriptor const struct{ char bLength; char bDscType; unsigned int string[23]; }strd3={ 32, //sizeof this descriptor string 0x03, {'I','s','i','d','r','o','s',' ','J','o','y','s','t','i','k'} }; //Array of configuration descriptors const char* USB_config_dsc_ptr[1]; //Array of string descriptors const char* USB_string_dsc_ptr[3]; void USB_Init_Desc(){ USB_config_dsc_ptr[0] USB_string_dsc_ptr[0] USB_string_dsc_ptr[1] USB_string_dsc_ptr[2] } = = = = &configDescriptor1; (const char*)&strd1; (const char*)&strd2; (const char*)&strd3;