diseno de un driver para dispositivos˜ de almacenamiento ...lsb/elo325/clases/memoria...

153
UNIVERSIDAD T ´ ECNICA FEDERICO SANTA MAR ´ IA DEPARTAMENTO DE ELECTR ´ ONICA ——————————————————————————————– DISE ˜ NO DE UN DRIVER PARA DISPOSITIVOS DE ALMACENAMIENTO MASIVO USB Alexander Illich Volantines Rivera Ingenier´ ıa Civil Electr´ onica Diciembre del 2006 ——————————————————————————————–

Upload: vuduong

Post on 15-Oct-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICA

——————————————————————————————–

DISENO DE UN DRIVER PARA DISPOSITIVOSDE ALMACENAMIENTO MASIVO USB

Alexander Illich Volantines RiveraIngenierıa Civil Electronica

Diciembre del 2006——————————————————————————————–

UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICA

——————————————————————————————–

DISENO DE UN DRIVER PARA DISPOSITIVOSDE ALMACENAMIENTO MASIVO USB

Memoria presentada por

Alexander Illich Volantines Rivera

Como requisito parcial para la obtencion del tıtulo de

Ingeniero Civil Electronico

Profesor Guıa:

Sr. Leopoldo Silva Bijit

ValparaısoDiciembre del 2006

——————————————————————————————–

tıtulo de la memoria

DISENO DE UN DRIVER PARA DISPOSITIVOS DE ALMACENAMIENTOMASIVO USB

AUTOR

Alexander Illich Volantines Rivera

TRABAJO DE MEMORIA, presentado en cumplimiento parcial de los requisitospara el Tıtulo de Ingeniero Civil Electronico de la Universidad Tecnica Federico SantaMarıa.

Sr. Leopoldo Silva B. . . . . . . . . . . . . . . . . . . . . . . . .

Sr. Wolfgang Freund G. . . . . . . . . . . . . . . . . . . . . . . . .

Valparaıso, Diciembre del 2006

Gracias a mis padres Arturo e Irma por educarmeA mi hermana Violeta por su companıa y consejos

A Don Leopoldo Silva por su apoyoA Daniela por su carino

A mi amiga ACB (Q.E.P.D)

Diseno de un driver para dispositivos de almacenamientomasivo USB

Alexander Illich Volantines Rivera

Requisito parcial para la obtencion del Tıtulo de Ingeniero Civil Electronico.

Profesor Guıa: Leopoldo Silva B.

Diciembre 2006

Resumen

Hoy en dıa el protocolo USB ha tenido un exito inesperado. Los factores clavesde la gran aceptacion entre los usuarios de computadores son sin duda: los costospara el fabricante y para el usuario; la sencillez de la conexion y la velocidad desus productos. Universal Serial Bus fue disenado para ser una interfaz capaz de co-municar diferentes tipos de dispositivos. Cada nuevo PC o Macintosh que sale almercado incluyen puertos USB que pueden conectar automaticamente a los dispo-sitivos estandar tales como: teclados, mouses, scanners, impresoras, etc., o tambiendispositivos con hardware personalizado con cualquier tipo de proposito.

En una etapa inicial de este trabajo, se realiza una vision general de los aspectosmas importantes del protocolo USB. De esta manera lleva al lector a comprender ya relacionarse tanto con los terminos mas comunes en el ambiente USB, como en elprotocolo propiamente tal. Un host controlador es el encargado de manejar, controlary dirigir todas las comunicaciones con los dispositivos USB. En el segundo capıtu-lo se describe el funcionamiento y las operaciones del host controlador SL811HS dela companıa Cypress Semiconductor Corporation. El tercer capıtulo se desarrolla laimplementacion de las herramientas que entrega el protocolo USB. Las herramientasllamadas Peticiones (Request) sirven para realizar la configuracion e interrogacion delos dispositivos USB. En el cuarto capıtulo se describe el funcionamiento de los dis-positivos que pertenecen a la clase de interfaz humana, que abarca a los dispositivoscomo teclados y mouses. Por ultimo, en el quinto capıtulo, se explica el funcionamien-to de los dispositivos de la clase de almacenamiento masivo, en donde se desarrollaun programa para la lectura y escritura de archivos para los Pendrives.

Palabras Claves– Universal Serial Bus (USB), Endpoint, Bulk-Only, Class, BusEnumeration, Standard Request (peticiones), SCSI, HID, MSD, Pendrives.

Indice general

1. Protocolo USB 141.1. Caracterısticas Generales . . . . . . . . . . . . . . . . . . . . . . . . . 141.2. USB-IF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.3. Versiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

1.3.1. USB 1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.3.2. USB 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.3.3. USB OTG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181.3.4. USB Wireless . . . . . . . . . . . . . . . . . . . . . . . . . . . 191.3.5. USB Vs. FireWire . . . . . . . . . . . . . . . . . . . . . . . . 21

1.4. Nivel Fısico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221.4.1. Transmision . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221.4.2. Identificacion de velocidades . . . . . . . . . . . . . . . . . . . 23

1.5. Topologıa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241.5.1. Controlador . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241.5.2. Hubs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251.5.3. Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

1.6. Transacciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261.6.1. Pipes y endpoint . . . . . . . . . . . . . . . . . . . . . . . . . 271.6.2. Paquetes y fases de las transacciones . . . . . . . . . . . . . . 281.6.3. Token Packet . . . . . . . . . . . . . . . . . . . . . . . . . . . 291.6.4. Data Packet . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291.6.5. Handshake Packet . . . . . . . . . . . . . . . . . . . . . . . . 30

1.7. Transferencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311.7.1. Interrupt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321.7.2. Bulk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331.7.3. Isochronous . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341.7.4. CONTROL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

2. Controlador SL811HS 362.1. Aspectos generales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

2.1.1. Modulo de trabajo . . . . . . . . . . . . . . . . . . . . . . . . 372.1.2. Modos host/slave . . . . . . . . . . . . . . . . . . . . . . . . . 38

2.2. Registro y memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382.2.1. Registros generales de configuracion . . . . . . . . . . . . . . . 39

6

2.2.2. Registros en modo host . . . . . . . . . . . . . . . . . . . . . . 402.3. Senales de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402.4. Funciones basicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

2.4.1. Escritura en registros . . . . . . . . . . . . . . . . . . . . . . . 432.4.2. Lectura de registros . . . . . . . . . . . . . . . . . . . . . . . . 442.4.3. Inicializacion del SL811HS . . . . . . . . . . . . . . . . . . . . 452.4.4. Deteccion low/full speed . . . . . . . . . . . . . . . . . . . . . 46

2.5. Visualizacion de los registros . . . . . . . . . . . . . . . . . . . . . . . 492.5.1. Visualizacion de los registros a traves del display . . . . . . . 492.5.2. Visualizacion de los registros a traves de la ventana Watch . . 49

3. Peticiones, descriptores y configuracion general 513.1. Peticiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

3.1.1. Tipos de peticiones . . . . . . . . . . . . . . . . . . . . . . . . 513.1.2. Principales peticiones . . . . . . . . . . . . . . . . . . . . . . . 523.1.3. set adress . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523.1.4. set configuration . . . . . . . . . . . . . . . . . . . . . . . . . 533.1.5. get configuration . . . . . . . . . . . . . . . . . . . . . . . . . 53

3.2. Descriptores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543.2.1. Descriptores Standard . . . . . . . . . . . . . . . . . . . . . . 543.2.2. Device Descriptor . . . . . . . . . . . . . . . . . . . . . . . . . 553.2.3. Configuration Descriptor . . . . . . . . . . . . . . . . . . . . . 583.2.4. Interface Descriptor . . . . . . . . . . . . . . . . . . . . . . . . 593.2.5. Endpoint Descriptor . . . . . . . . . . . . . . . . . . . . . . . 623.2.6. String Descriptor . . . . . . . . . . . . . . . . . . . . . . . . . 633.2.7. Construccion de las peticiones . . . . . . . . . . . . . . . . . . 64

3.3. Configuracion de un dispositivo cualquiera . . . . . . . . . . . . . . . 653.4. Programas para los descriptores . . . . . . . . . . . . . . . . . . . . . 68

3.4.1. USBview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683.4.2. USBCommandVerifer . . . . . . . . . . . . . . . . . . . . . . . 693.4.3. Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

4. Dispositivos de interfaz humana 714.1. HID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714.2. Tipos de dispositivos . . . . . . . . . . . . . . . . . . . . . . . . . . . 714.3. Pipes de la Clase HID . . . . . . . . . . . . . . . . . . . . . . . . . . 724.4. Identificacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

4.4.1. Clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734.4.2. Subclases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734.4.3. Protocolos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

4.5. Descriptores de clase . . . . . . . . . . . . . . . . . . . . . . . . . . . 744.5.1. HID Descriptor . . . . . . . . . . . . . . . . . . . . . . . . . . 754.5.2. Report Descriptor . . . . . . . . . . . . . . . . . . . . . . . . . 774.5.3. Physical Descriptor . . . . . . . . . . . . . . . . . . . . . . . . 78

4.6. Recibimientos de los datos en un dispositivo HID . . . . . . . . . . . 79

4.7. Configuracion de un Mouse . . . . . . . . . . . . . . . . . . . . . . . 80

5. Dispositivos de almacenamiento masivo 835.1. Mass Store Device . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835.2. Reconocimiento de un dispositivo MSD . . . . . . . . . . . . . . . . . 84

5.2.1. Clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 845.2.2. Subclase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 845.2.3. Protocolo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

5.3. Peticiones de clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865.3.1. Bulk-Only Mass Storage Reset . . . . . . . . . . . . . . . . . . 865.3.2. Get Max LUN . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

5.4. Protocolo de transporte Bulk-Only . . . . . . . . . . . . . . . . . . . 875.4.1. Transferencias . . . . . . . . . . . . . . . . . . . . . . . . . . . 875.4.2. Bloque CBW . . . . . . . . . . . . . . . . . . . . . . . . . . . 885.4.3. Bloque CSW . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

5.5. Bloques de comandos SCSI-2 . . . . . . . . . . . . . . . . . . . . . . . 905.5.1. Inquiry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915.5.2. Read(10) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 935.5.3. Write(10) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

5.6. Organizacion De La Memoria Fısica . . . . . . . . . . . . . . . . . . . 945.6.1. FAT16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955.6.2. Master Boot Record - MBR . . . . . . . . . . . . . . . . . . . 965.6.3. Particiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975.6.4. Funcion para encontrar particiones . . . . . . . . . . . . . . . 985.6.5. Distribucion de los archivos en memoria . . . . . . . . . . . . 100

5.7. Archivos y directorios . . . . . . . . . . . . . . . . . . . . . . . . . . . 1015.7.1. Desarrollo de una funcion base de busqueda . . . . . . . . . . 1025.7.2. Busqueda de archivos y directorios en la raız . . . . . . . . . . 1035.7.3. Busqueda de archivos y directorios en directorios . . . . . . . 104

5.8. Lectura de archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1065.8.1. Escritura en archivos . . . . . . . . . . . . . . . . . . . . . . . 107

6. Conclusiones 110

A. Detalles del protocolo USB 111A.1. Paquetes que se encuentran en las transacciones . . . . . . . . . . . . 111

A.1.1. SYNC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111A.1.2. PID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112A.1.3. Address . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112A.1.4. ENDP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112A.1.5. CRC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

A.2. Estados en la lınea de transmision . . . . . . . . . . . . . . . . . . . 113A.2.1. Diferencial0 y Diferencial1 . . . . . . . . . . . . . . . . . . . . 113A.2.2. Single-Ended Zero . . . . . . . . . . . . . . . . . . . . . . . . 113A.2.3. J y K . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

A.2.4. Bus Idle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114A.3. Special Packet para el protocolo USB 2.0 . . . . . . . . . . . . . . . . 114A.4. Resumen de los paquetes en las transacciones . . . . . . . . . . . . . 115A.5. Resumen de las transferencias USB . . . . . . . . . . . . . . . . . . . 116

B. Diagrama de conexiones 117

C. Registros del controlador SL811HS en modo Host 118

D. Construccion de las peticiones 125D.1. Setup Packet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125D.2. Funcion Request() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

D.2.1. Ejemplo de la construccion de la peticion Set Adress . . . . . 129

E. Construccion de los comandos SCSI 130E.0.2. INQUIRY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130E.0.3. READ(10) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133E.0.4. WRITE(10) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135E.0.5. Funcion de lectura de sectores, Leer Sector() . . . . . . . . . . 137E.0.6. Funcion de escritura de sectores, Escribir Sector() . . . . . . . 137E.0.7. Funcion INQUIRY . . . . . . . . . . . . . . . . . . . . . . . . 137

F. Estructura de informacion FAT16 139F.0.8. Master Boot Record . . . . . . . . . . . . . . . . . . . . . . . 139F.0.9. Partition Boot Record . . . . . . . . . . . . . . . . . . . . . . 141

F.1. Formatos DOS 8.3 y LFN (Long File Name) . . . . . . . . . . . . . . 142

G. Glosario. 144

Indice de figuras

1.1. Logo USB 1.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.2. Logo USB 2.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181.3. Logo USB On-The-Go 2.0. . . . . . . . . . . . . . . . . . . . . . . . . 191.4. Logo USB Wireless. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201.5. Modelo Hub and Spoke. . . . . . . . . . . . . . . . . . . . . . . . . . 201.6. Cable de cuatro hilos USB. . . . . . . . . . . . . . . . . . . . . . . . . 221.7. Transmision de los datos en el cable USB. . . . . . . . . . . . . . . . 231.8. Reconocimiento de full-speed. . . . . . . . . . . . . . . . . . . . . . . 231.9. Topologıa del bus USB. . . . . . . . . . . . . . . . . . . . . . . . . . . 241.10. Modelo hub de 7 puertos. . . . . . . . . . . . . . . . . . . . . . . . . 251.11. Distribucion de diferentes transacciones en un frame. . . . . . . . . . 271.12. Pipes y endpoint. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271.13. Fases de una transaccion. . . . . . . . . . . . . . . . . . . . . . . . . . 281.14. Fases de una transaccion Interrupt. . . . . . . . . . . . . . . . . . . . 321.15. Fases de una transaccion Bulk. . . . . . . . . . . . . . . . . . . . . . . 331.16. Fases de una transaccion Isochronous. . . . . . . . . . . . . . . . . . . 341.17. Fases de una transaccion de Control. . . . . . . . . . . . . . . . . . . 35

2.1. SL811HS pin layout. . . . . . . . . . . . . . . . . . . . . . . . . . . . 362.2. Modulo de trabajo para el SL811HS. . . . . . . . . . . . . . . . . . . 372.3. Conectores Serie-A y Serie-B. . . . . . . . . . . . . . . . . . . . . . . 382.4. Distribucion de la memoria y registros. . . . . . . . . . . . . . . . . . 392.5. Senales de acceso para el SL811HS. . . . . . . . . . . . . . . . . . . . 412.6. Formas de ondas cuando se escribe en un registro del SL811HS. . . . 422.7. Visualizacion de los registros a traves del display. . . . . . . . . . . . 492.8. Visualizacion de los registros con la herramienta watch. . . . . . . . . 50

3.1. Descriptores Standard. . . . . . . . . . . . . . . . . . . . . . . . . . . 543.2. Estructura de los descriptores para la herramienta watch. . . . . . . . 573.3. Device Descriptor al conectar un teclado USB. . . . . . . . . . . . . . 583.4. Configuration Descriptor de un mouse. . . . . . . . . . . . . . . . . . 593.5. Mensaje de Windows para un dispositivo USB. . . . . . . . . . . . . . 613.6. Interface Descriptor para un mouse. . . . . . . . . . . . . . . . . . . . 613.7. Endpoint Descriptor para una impresora. . . . . . . . . . . . . . . . . 633.8. Mensaje de Windows XP para el nombre del producto. . . . . . . . . 63

10

3.9. Nombre del producto de un dispositivo usando el SL811HS. . . . . . . 643.10. Visualizacion de la pantalla despues de usar Bus Enumeracion. . . . . 683.11. USBview mostrando los dispositivos conectados. . . . . . . . . . . . . 693.12. USBview mostrando los descriptores. . . . . . . . . . . . . . . . . . . 693.13. USBcommandVerifer. . . . . . . . . . . . . . . . . . . . . . . . . . . . 703.14. Conexion de un sniffer para la captura de datos. . . . . . . . . . . . . 70

4.1. Pipes de la clase HID. . . . . . . . . . . . . . . . . . . . . . . . . . . 724.2. Descriptores de la clase HID. . . . . . . . . . . . . . . . . . . . . . . . 754.3. HID Descriptor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764.4. Tabla de reportes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 774.5. Software HID Descriptor Tool. . . . . . . . . . . . . . . . . . . . . . . 78

5.1. Estructura interna de los pendrives. . . . . . . . . . . . . . . . . . . . 845.2. Flujo de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885.3. Command Block Wrapper. . . . . . . . . . . . . . . . . . . . . . . . . 895.4. Command Status Wrapper. . . . . . . . . . . . . . . . . . . . . . . . 905.5. Resultado del comando Inquiry. . . . . . . . . . . . . . . . . . . . . . 925.6. Organizacion de la memoria. . . . . . . . . . . . . . . . . . . . . . . . 955.7. Master Boot Record del pendrive Packerbell 256MB. . . . . . . . . . 965.8. Estructura de las particiones. . . . . . . . . . . . . . . . . . . . . . . 975.9. Ejemplo de la Partition Boot Record. . . . . . . . . . . . . . . . . . . 985.10. Valores obtenidos al ejecutar la funcion buscaparticion(). . . . . . . . 995.11. Ejemplo de la distribucion de un archivo en memoria. . . . . . . . . . 1005.12. Ejemplos de nombres y carpetas en la tabla de directorios. . . . . . . 1025.13. Estructura de la funcion save(). . . . . . . . . . . . . . . . . . . . . . 1065.14. Relleno de sectores y cluster en la escritura de datos. . . . . . . . . . 108

A.1. Resumen de la estructura de los paquetes del protocolo USB. . . . . . 115A.2. Resumen de las transferencias del protocolo USB. . . . . . . . . . . . 116

B.1. SL811HS USB Host/Slave Controlador, Pin Layout. . . . . . . . . . . 117

Indice de cuadros

1.1. Ejemplos de aplicaciones OTG. . . . . . . . . . . . . . . . . . . . . . 191.2. Tipos de protocolos y sus usos. . . . . . . . . . . . . . . . . . . . . . 211.3. Token Packet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291.4. Data Packet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301.5. Handshake Packet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301.6. Resumen de las transferencias y sus usos. . . . . . . . . . . . . . . . . 31

2.1. Registros de configuracion del SL811HS. . . . . . . . . . . . . . . . . 392.2. Registros y definiciones para modo host. . . . . . . . . . . . . . . . . 40

3.1. Peticiones Standard. . . . . . . . . . . . . . . . . . . . . . . . . . . . 523.2. Estructura del Device Descriptor. . . . . . . . . . . . . . . . . . . . . 563.3. Configuration Descriptor. . . . . . . . . . . . . . . . . . . . . . . . . . 583.4. Interface Descriptor. . . . . . . . . . . . . . . . . . . . . . . . . . . . 603.5. Clases USB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603.6. Endpoint Descriptor. . . . . . . . . . . . . . . . . . . . . . . . . . . . 623.7. Campos del Setup Packet. . . . . . . . . . . . . . . . . . . . . . . . . 65

4.1. Resumen de la comunicacion HID. . . . . . . . . . . . . . . . . . . . . 734.2. Codigos de Subclases. . . . . . . . . . . . . . . . . . . . . . . . . . . . 744.3. Codigos de protocolos. . . . . . . . . . . . . . . . . . . . . . . . . . . 744.4. Estructura del HID Descriptor. . . . . . . . . . . . . . . . . . . . . . 754.5. Descriptores especiales para la clase HID. . . . . . . . . . . . . . . . . 764.6. Valores para los botones del mouse. . . . . . . . . . . . . . . . . . . . 814.7. Valores para el movimiento del mouse. . . . . . . . . . . . . . . . . . 81

5.1. Codigo de subclase para Mass Store Device. . . . . . . . . . . . . . . 845.2. Codigo de protocolo para Mass Store Device. . . . . . . . . . . . . . . 855.3. Interface Descriptor para distintos pendrives. . . . . . . . . . . . . . . 865.4. Tıpicos comandos SCSI. . . . . . . . . . . . . . . . . . . . . . . . . . 915.5. Cluster por tamano. . . . . . . . . . . . . . . . . . . . . . . . . . . . 955.6. Master Boot Record. . . . . . . . . . . . . . . . . . . . . . . . . . . . 965.7. Codigos para el cluster. . . . . . . . . . . . . . . . . . . . . . . . . . . 101

A.1. Paquetes del protocolo USB. . . . . . . . . . . . . . . . . . . . . . . . 111A.2. Bits del paquete PID. . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

12

A.3. Bits del paquete Adress. . . . . . . . . . . . . . . . . . . . . . . . . . 112A.4. Bits del paquete ENDP. . . . . . . . . . . . . . . . . . . . . . . . . . 112A.5. Estados J y K. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

C.1. Registros en modo host. . . . . . . . . . . . . . . . . . . . . . . . . . 118C.2. Registro 0x00. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119C.3. Registro 0x03, resultados de la ultima transaccion. . . . . . . . . . . . 121C.4. Registro 0x03, valores para el paquete PID. . . . . . . . . . . . . . . 121C.5. Registro 0x05. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122C.6. Estados de operacion de las lıneas D+ y D-. . . . . . . . . . . . . . . 122C.7. Registro 0x06. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123C.8. Registro 0x0D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123C.9. Registro 0x0E, hardware revision. . . . . . . . . . . . . . . . . . . . . 123C.10.Registro 0x0F. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

D.1. Campos del Setup Packet. . . . . . . . . . . . . . . . . . . . . . . . . 125D.2. Peticiones Standard. . . . . . . . . . . . . . . . . . . . . . . . . . . . 126D.3. Tipos de descriptores. . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

E.1. Campo de envıo del comando INQUIRY. . . . . . . . . . . . . . . . . 130E.2. Campos de retorno del comando INQUIRY. . . . . . . . . . . . . . . 132E.3. Formato del comando READ(10). . . . . . . . . . . . . . . . . . . . . 133E.4. Campo de envıo del comando INQUIRY. . . . . . . . . . . . . . . . . 135

F.1. Master Boot Record. . . . . . . . . . . . . . . . . . . . . . . . . . . . 139F.2. Informacion de los 16 bytes para cada particion. . . . . . . . . . . . . 139F.3. Tipos de particiones. . . . . . . . . . . . . . . . . . . . . . . . . . . . 140F.4. Campos del sector Partition Boot Record. . . . . . . . . . . . . . . . 141F.5. Formato de nombres cortos para DOS 8.3. . . . . . . . . . . . . . . . 142F.6. Formato de nombres cortos para LFN. . . . . . . . . . . . . . . . . . 142F.7. Formato de nombres largos para LFN . . . . . . . . . . . . . . . . . . 143

Capıtulo 1

Protocolo USB

Este capıtulo describe el protocolo USB incluyendo sus ventajas y sus lımites, lahistoria acerca de la interfaz y sus ultimos avances. El conocimiento general del pro-tocolo USB y sus principales caracterısticas es una referencia en el cual debe estarinvolucrado cualquier disenador y programador de un dispositivo USB.

1.1. Caracterısticas Generales

El protocolo USB (Universal Serial Bus) ha sido una verdadera revolucion en elmundo de la computacion, caracterısticas como sencillez en la conexion y velocidadde transmision han hecho masivo el uso de esta tecnologıa, dejando atras antiguasformas de conectar perifericos por los puertos paralelos o el serial RS-232. USB tienela gran ventaja que es un estandar abierto, lo cual permite ir mejorando el protocolosegun las nuevas necesidades que vayan saliendo en el mercado, ademas ya ha sidoadoptado por cientos de fabricantes de perifericos y ha recibido una gran aceptacionentre los fabricantes de computadores personales. En un principio el estandar USBfue solo una especificacion de las empresas Compaq, Intel, Microsoft y NEC, pero conel paso del tiempo se incorporaron grandes empresas como Hewlett-Packard, Lucenty Philips y ahora ha sido formalmente adoptado por los sistemas operativos de Appley Linux, que en conjunto con Microsoft Windows representan a casi el total del sectorde la informatica personal.

USB fue disenado expresamente para proporcionar las caracterısticas mas requeri-das por los usuarios, las principales son:

Una interfaz para muchos dispositivos: USB es lo suficientemente versatilpara ser utilizable con una variedad de perifericos. En lugar de tener un tipo deconector diferente para cada dispositivo y tener un soporte para cada hardware,en USB una interfaz sirve para todos.

14

CAPITULO 1. PROTOCOLO USB

Configuracion automatica para clases conocidas: Cuando un usuarioconecta un dispositivo USB, el sistema operativo detecta el periferico y carga elsoftware apropiado. Si una clase desconocida se conecta, los sistemas operativoscomo Windows advierten al usuario para insertar un disco con los drivers, peroaparte de eso, la instalacion es automatica.

Facil de manejar: La implementacion del USB elimina el uso de IRQ’s ycanales de DMA. Ası como la necesidad de abrir los gabinetes para instalar oquitar dispositivos. El usuario no tienen la necesidad de preocuparse sobre lacorrecta seleccion del puerto serial, la instalacion de tarjetas de expansion oconfigurar los jumpers de la placa madre. Un PC tıpicamente tiene cuatro omas puertos USB los cuales son ampliables a traves de hubs.

Simple conexion: Los conectores del cable USB son como una llave, ası que noes posible poder conectar incorrectamente el dispositivo. El largo puede llegarhasta los 5 metros. Con hubs, un dispositivo puede llegar hasta los 30 metrosde distancia desde el host base. Los conectores USB son pequenos y compactosen contraste a los tıpicos RS-232 y conectores paralelos. En resumen USB usaunicamente un solo tipo de conector para cualquier tipo de dispositivo, masalla de la funcion que cumplan. Para asegurar la buena operacion, la especifi-cacion USB incluye requisitos electricos que todos los cables y los conectoresdeben incorporar.

Conexion en caliente: USB permite conectar y desconectar un dispositivocuando se requiera, no importando si los sistemas estan energizados.

No requiere alimentacion externa: La interfaz USB incluye suministro deenergıa a traves de la lınea de tierra y los +5V nominal entregado por el com-putador o el hub. Un dispositivo puede tomar hasta maximo 500 mA a travesdel bus. Por lo contrario, los dispositivos que usan interfaces en el cual requieranmas corriente, pueden incluir un suministro de energıa dentro del dispositivo ousar un suministro externo.

Conectividad: Hasta 127 dispositivos diferentes pueden estar conectados si-multaneamente y operando con el mismo computador.

Bajos costos de diseno: Para casi la mayorıa de las aplicaciones que sonestandar y no tienen una configuracion propia, los costos de diseno son compa-rativamente menores que otras tecnologıas.

15

CAPITULO 1. PROTOCOLO USB

1.2. USB-IF

Para los disenadores de dispositivos USB se dispone de una gran cantidad deayuda por: USB Implementers Forum S.A. (USB-IF) y su sitio Web www.usb.org.USB-IF es una corporacion sin fines de lucro fundada por las companıas que estandesarrollando continuamente especificaciones y productos USB. La mision de USB-IFes dar soporte al avance y la utilizacion de la tecnologıa USB. Para ese fin, USB-IFofrece informacion, herramientas y test de pruebas. La informacion incluye los docu-mentos de especificacion, artıculos, FAQs y foros en la Web, donde los desarrolladorespueden discutir temas relacionados a USB. Las herramientas previstas por el USB-IFincluyen software y hardware para ayudar a desarrollar y probar productos. El so-porte para experimentar incluye tests para verificar que las operaciones realizadaspor los dispositivos USB sean las correctas.

Cualquiera puede desarrollar drivers, programas y dispositivos USB sin pagar al-guna tarifa de licencias, sin embargo cualquiera que distribuye un dispositivo con unainterfaz USB debe obtener los derechos para usar un Vendor ID1. Al momento deescribir la presente memoria, el cargo administrativo para obtener un Vendor ID esde US$1500. Para ser partıcipe de USB-IF la cuota anual es de US$2500, con lo cualjunto con el Vendor ID se puede participar en talleres y foros para el mejoramiento dela tecnologıa USB. Estas cuotas no son problemas para desarrolladores de productoscon volumenes altos de dispositivos, sino mas bien puede ser un impedimento paralos desarrolladores que planean realizar cantidades pequenas de dispositivos y a bajoscostos.

1.3. Versiones

En la actualidad existen cuatro tipos de diferentes versiones USB. Estos hanaparecido principalmente por la necesidad de ir mejorando la velocidad de la trans-mision serial y ademas por las nuevas formas a la hora de interconectar dispositivos.

1.3.1. USB 1.1

Esta especificacion fue realizada por las empresas Compaq, Intel, Microsoft yNEC, en septiembre de 1998 y marcaba la primera version final de una serie de an-tiguas versiones. La version USB 1.1 define y caracteriza casi por completo lo que eshoy en dıa el protocolo USB, pues en ella se especifica un canal serial para soportara una gran gama de perifericos de media y baja velocidad, con soporte integral paratransferencias en tiempo real como voz, audio y vıdeo.

1El Vendor ID es asignado por USB-IF y se incorpora en cada dispositivo para su identificacion.

16

CAPITULO 1. PROTOCOLO USB

Las principales caracterısticas de USB 1.1 son:

Dos velocidades de transmision: 12 Mbps llamada full-speed, con proposito dediseno para dispositivos que requieren grandes velocidades de transmision. Ylow-speed de 1,5 Mbps para dispositivos mas lentos como son los mouse, tecladosy joysticks.

Manejar hasta 127 dispositivos simultaneamente que se pueden conectar y des-conectar en caliente, sin tener que reiniciar el sistema.

Una configuracion automatica de dispositivos que elimina la necesidad de rea-lizar configuraciones.

Un acceso al bus gestionado directamente por el controlador USB para permitirtransferencias isocronas y eliminar los tiempos de arbitracion.

La coexistencia de dispositivos isocronos y asıncronos. Los dispositivos isocronosse atienden en funcion del ancho de banda y tiempo requerido, y los asıncronos seatienden durante el tiempo restante no consumido por los dispositivos isocronos.

Una distribucion de alimentacion desde el controlador USB, que permite laconexion de los dispositivos sin alimentacion externa.

Una arquitectura facilmente escalable para permitir la existencia de varios con-troladores USB en un sistema.

Para el reconocimiento del protocolo USB 1.1 se dispone del logo mostrado en lafigura 1.1.

Figura 1.1: Logo USB 1.1.

1.3.2. USB 2.0

USB 1.1 gano gran popularidad entre los usuarios y disenadores de productos. Enabril del ano 2000, en conjunto con nuevas empresas para el mejoramiento del pro-tocolo como: Hewlett-Packard, Lucent y Philips se publica finalmente USB 2.0, cuyologo de reconocimiento se muestra en la figura 1.2. Esto demostraba el gran interespor desarrollar e integrar nuevos dispositivos mas rapidos y que demandaran gran

17

CAPITULO 1. PROTOCOLO USB

cantidad de datos de transferencias. La nueva velocidad que se incorpora se llamahigh-speed y es de 480 Mbps, lo que es cuarenta veces mas rapido que la antigua full-speed. La incorporacion de high-speed hizo que USB sea mucho mas atractivo para eldiseno de dispositivos como: impresoras, scanners, camaras fotograficas y pendrives.

Figura 1.2: Logo USB 2.0.

Las caracterısticas del protocolo USB 1.1 se suman a USB 2.0 y se agregan nuevostipos de paquetes. Los dispositivos high-speed tambien soportan una funcionalidaden modo full-speed, de forma que cuando se conectan a un puerto que esta trabajandoen modo full-speed pueden al menos:

Detectar y procesar el reset.

Aceptar, procesar y responder adecuadamente a las funciones estandar de asig-nacion de direccion y de configuracion, ası como la lectura de la informaciondescriptiva del dispositivo y de sus posibles configuraciones (peticiones y des-criptores).

Los dispositivos high-speed pueden o no soportar su total funcionalidad cuandotrabajan en modo full-speed, pero la mayorıa lo hacen para que sean compatibles.USB pone a disposicion herramientas como USB command Verifier Tool1 para com-probar si cumplen con los requisitos para su funcionamiento en ambas velocidades.

1.3.3. USB OTG

Los desarrolladores de perifericos comenzaron a solicitar una nueva forma parapoder conectar los dispositivos USB. Por ejemplo, un usuario podrıa querer usaruna impresora directamente con una camara fotografica. El protocolo On-The-Go,cuyo logo se muestra en la figura 1.3, fue el que pudo hacer posible la conexionpedida por los fabricantes. Se publico en diciembre del 2001 y corresponde a unavariacion de USB 2.0. Con este nuevo protocolo el host tiene una capacidad limitada,pero posibilita la comunicacion entre perifericos y elimina la indispensabilidad detener un PC para establecer la comunicacion. Igualmente USB OTG permite a undispositivo actuar como servidor o como cliente dependiendo como originalmente seconecto el cableado. Incluso despues de que las unidades se estan comunicando, los

1El programa se encuentra en www.org.usb o en el CD adjunto a la memoria “Programas/USB commandVerifier Tool/USBCV121.msi” y requiere de un ROOT USB 2.0.

18

CAPITULO 1. PROTOCOLO USB

dos dispositivos pueden cambiar el rol bajo el control de un programa. Esta facilidadesta especıficamente disenada para dispositivos como PDA, camaras e impresoras.

Las principales caracterısticas son:

Habilidad Dual-Rol, con la cual se puede intercambiar papeles entre host y slavebajo el protocolo de negociacion de host (HPN).

Nuevos conectores mas pequenos (mini-A y mini-B) con un cableado diferente.

Ahorro de consumo de energıa para facilitar durabilidad de la baterıa en losdispositivos.

Figura 1.3: Logo USB On-The-Go 2.0.

En el cuadro 1.1 muestra algunos ejemplos de conexion directa entre perifericoscon las respectivas aplicaciones.

Host Periferico AplicacionPDA -PDA -Intercambiar informacion

-Impresora -Imprimir documentos-Telefonos -Subir/bajar archivos-Scanner -Digitalizar fotos-Pendrive -Subir/bajar archivos-GPS -Obtener mapas, direcciones-Camaras -Subir/bajar fotos

Impresora -Camaras -Imprimir archivos-Telefonos-Pendrive- PDA

Cuadro 1.1: Ejemplos de aplicaciones OTG.

1.3.4. USB Wireless

USB inalambrico (WUSB) es la tecnologıa desarrollada mas reciente por USB-IF.La version 1.0 de WUSB fue publicada en mayo del 2005 y entrega mas facilidades ymovilidad a los dispositivos que se conectan a los PC. Esta especificacion mantieneel mismo uso y arquitectura que el USB con cables, con una conexion high-speed

19

CAPITULO 1. PROTOCOLO USB

desde el host al dispositivo. Aunque el despliegue masivo de dispositivos compati-bles con esta tecnologıa no se producira hasta 2006. La utilizacion de WUSB noha sido aprobado aun por una buena cantidad de organismos regulatorios europeosy asiaticos, debido a potenciales conflictos con otras tecnologıas inalambricas. Estopodrıa oscurecer las perspectivas de Wireless USB de alcanzar economıas de escalaque puedan reducir costos y competir de igual con Bluetooth, que ha alcanzado unimportante crecimiento en el campo de la tecnologıa inalambrica durante los ultimosanos.

Figura 1.4: Logo USB Wireless.

Figura 1.5: Modelo Hub and Spoke.

Wireless USB conecta a los dispositivos USB con un modelo llamado “Hub andSpoke”. El host WUSB es el hub que esta representado en la parte central de la figura1.5 y cada dispositivo que se conecta se llama spoke. Un spoke es una conexion point-to-point entre el host y el dispositivo. El host puede soportar 127 dispositivos y comono tiene puertos fısicos no hay necesidad de definir nuevos hubs para la expansion delos puertos. Las principales caracterısticas son:

Transferencia de 480 Mbps a 3 metros y 110 Mbps a 10 metros de distancia.

20

CAPITULO 1. PROTOCOLO USB

Tecnologıa CMOS, con ahorro de energıa (Sleep/Listen/Wake) y bajos costosde disenos.

Conexion maxima de 127 dispositivos WUSB.

Seguridad y asociacion de dispositivos con mecanismo de cifrado AES-128/CCMa nivel de las aplicaciones.

Usa el espectro UWB (Ultra-Wideband), 3.1-10.6 Ghz.

Dispositivos WUSB con protocolo OTG para funciones Dual-Rol.

Arquitectura y protocolo escalable a 1 Gbps.

Interface Formato Dispos. Max. Veloc. Max. Uso tıpico

USB asynchronousserial

127 1.5M, 12M, 480M. teclados, mouse,impresoras, scanner,pendrives, camarasfotograficas, etc.

Ethernet serial 1024 10G general network

IEEE-1394a(FireWire)

serial 64 400M video y audio

IEEE-1394b(FireWire)

serial 64 3.2G video y audio

IEEE-488(GPIB)

paralelo 15 8M instrumentacion

IrDA infrarrojoserial

2 16M manos libres, impre-soras

I2C asynchronousserial

40 3.4M microcontroladores

Microwire asynchronousserial

8 2M microcontroladores

Puerto Paralelo paralelo 2 8M impresoras, scanner

RS-232 asynchronousserial

2 20k modem, mouse, ins-trumentacion

RS-485 asynchronousserial

32 10M adquisicion de datosy sistemas de control

SPI asynchronousserial

8 2.1M microcontroladores

Cuadro 1.2: Tipos de protocolos y sus usos.

1.3.5. USB Vs. FireWire

Otra popular eleccion de interfaz para dispositivos perifericos es el protocoloIEEE-1394, tambien conocido como FireWire. La implementacion de la interfaz 1394fue desarrollado por Apple Computer. Ambas tecnologıas persiguen un mismo meto-do de conectar multiples perifericos a un computador con la capacidad de permitir

21

CAPITULO 1. PROTOCOLO USB

que los perifericos sean anadidos o desconectados sin la necesidad de reiniciar. Perola diferencia radica en que generalmente IEEE-1394 puede ser mas rapido y flexibleque USB, pero los costos de implementacion suelen ser mayores. Con USB un solohost es el que controla todas las comunicaciones de los dispositivos, el host manipulala mayorıa de la complejidad, ası es que la electronica de los dispositivos puede serrelativamente simple y menos costosa.

Como se muestra el cuadro comparativo 1.2, la velocidad y capacidad de transfe-rencia marca la principal distincion entre estas dos tecnologıas. Hoy USB high-speedlo hace competitivo con el IEEE-1394A con velocidad de 480 Megabits/sec, peroIEEE-1394B es superior con 3.2 Gigabits/sec.

1.4. Nivel Fısico

La interfaz USB se conecta con el equipo del usuario a traves de un cable de cua-tro hilos. Dos son dedicados a la alimentacion y los dos restantes a la senal de datos(D+ y D-), estos ultimos estan como par trenzado. Los conductores de alimentacion(figura 1.6) VBus y GND entregan una tension continua de 5V y 500mA maximo. Enfuncion de las necesidades de alimentacion electrica de los dispositivos, estos puedentomar la alimentacion de estas lıneas, o bien tener una fuente de alimentacion alter-nativa. Todos los aspectos tecnicos relativos al cable y conector USB se encuentranen la especificacion USB entregada por USB-IF.

Figura 1.6: Cable de cuatro hilos USB.

1.4.1. Transmision

El bus USB es sıncrono y los paquetes de datos estan codificados usando NRZI1

agregando la insercion de bits llamado Bit Stuffing. La insercion de bits es requeridopor el dispositivo receptor porque este funciona sincronicamente con las transiciones.Si los datos son todos “0”, entonces existen bastantes transiciones, pero si los datoscontienen demasiados “1”, entonces la falta de transiciones podrıa causar que elaparato receptor pueda salir del sincronismo (SYNC). Si los datos tienen seis “1”consecutivos el transmisor inserta un “0” (representado por una transicion). Esto

1Non Return to Zero Inverted, la lınea cambia de nivel si se transmite un “0” y no cambia si transmiteun “1”.

22

CAPITULO 1. PROTOCOLO USB

asegura al menos una transicion para cada siete bits transmitidos. El aparato recep-tor detecta y descarta cualquier bit que tenga seis 1s consecutivos. La insercion debits puede aumentar el numero de bits transmitidos que en teorıa puede llegar hastaun 17%, pero en la practica el promedio es mucho menos. El overhead por bit stuffingpara datos aleatorios es aproximadamente un 0.8%, lo cual significa 1 bit de rellenopor cada 125 bits de datos.

Despues, los datos codificados son conducidos en el cable USB por el conductordiferencial. El dispositivo receptor amplifica los datos diferenciales entrantes (verfigura 1.7) y entrega los datos para ser decodificados. La codificacion y la senalizaciondiferencial se usan para ayudar a asegurar la integridad de los datos y eliminarproblemas de ruido.

Figura 1.7: Transmision de los datos en el cable USB.

1.4.2. Identificacion de velocidades

Para que el host detecte la velocidad de un dispositivo (low-speed y full-speed)se coloca una resistencia Pull-Up de 15KΩ al final del cable para que la deteccion serealice en forma electrica a traves de un voltaje diferencial (2.7V a 3.3V para ambasvelocidades). Para los dispositivos full-speed la resistencia Pull-up es conectada enla lınea D+ (figura 1.8) y para los dispositivos low-speed la resistencia Pull-up esconectada en la lınea D-. La ausencia de un dispositivo se detecta con las senales D+y D- estando en 0.

Figura 1.8: Reconocimiento de full-speed.

En un principio USB fue pensado con un diseno de dos tipos de velocidades, espor eso que los dispositivos high-speed se tienen que identificar electricamente comodispositivos full-speed. Luego se ejecutan unas secuencias de senales electricas que

23

CAPITULO 1. PROTOCOLO USB

determinan finalmente si el dispositivo corresponde a full-speed o high-speed.

1.5. Topologıa

La conexion en el bus USB se denomina Estrella en Niveles de 7 capas. En elcentro de cada estrella hay un hub y en cada punta puede ser un dispositivo o otrohub (figura 1.9). Debido a los retardos producidos por la propagacion de la senal enel largo del cable, se fija un maximo de 7 niveles para el control de todo el traficode informacion en el bus. El numero de puertos de cada hub puede variar de dos,cuatro o siete, dependiendo del hub conectado. Un dispositivo compuesto ocupa dosfilas, por consiguiente, no puede ser colocado al final del nivel 7, solo los dispositivossimples pueden ser colocados en ese nivel. Considerando el hub raız y el ultimo nivel,la maxima cantidad de hub conectados en cascada es de 5.

Figura 1.9: Topologıa del bus USB.

En la figura 1.9 se puede observar que en la topologıa USB hay tres agentesparticipativos: el controlador host, los hubs y las funciones.

1.5.1. Controlador

Es el responsable de las comunicaciones entre los perifericos USB y el microcontro-lador. Para cada periferico anadido, el controlador determina su clase y le asigna una

24

CAPITULO 1. PROTOCOLO USB

direccion logica para utilizarla en las comunicaciones. El host controlador puede serimplementado usando una combinacion entre hardware, firmware o software, dondelas principales funciones que lleva a cabo son:

Detectar si un dispositivo se ha conectado o ha sido removido de alguno de lospuertos.

Manejar el flujo de control y flujo de datos entre el microcontrolador y losdispositivos.

Proveer la alimentacion a los dispositivos USB conectados.

Comunicar al microcontrolador o CPU los errores durante la comunicacion.

1.5.2. Hubs

El hub es un dispositivo mas de la gran lista de aparatos USB que se pueden conec-tar. Estos dispositivos simplifican de gran manera la sencillez de la interconexion,dando la posibilidad de extender la cantidad de dispositivos que se puedan conectar(127 dispositivos). El hub USB esta hecho para detectar si un periferico ha sido conec-tado o si un dispositivo ha sido removido de sus puertos a traves de un estado internodentro del hub: el controlador debe estar constantemente revisando1 los estados de loshub para procesar el equipo nuevo o para remover los programas de administracion(drivers) del dispositivo retirado. Otra de las funciones importantes de los hubs esaislar los puertos de baja velocidad, de las transferencias de alta velocidad, procesosin el cual, todos los dispositivos de baja velocidad conectados al bus entrarıan encolapso. La proteccion de los dispositivos low-speed de los full-speed ha sido siempreun serio problema dentro de las redes mixtas, disminuyendo el rendimiento como esel caso de los hub 1.1.

Figura 1.10: Modelo hub de 7 puertos.

Un hub 2.0 maneja lo mismo que el hub 1.1 pero este da soporte a velocidadeshigh-speed (480Mbs), con la gran diferencia que realiza todas las transacciones dedatos a la velocidad high-speed, convirtiendo la velocidad que necesita el dispositivoen la ultima parte de la conexion. De esta forma la entrega de datos es mucho mas

1Las revisiones de los estados se realizan a traves de las peticiones. Para mayor detalle ver Capıtulo 3.

25

CAPITULO 1. PROTOCOLO USB

eficiente comparado con los hubs 1.1 (full-speed). Internamente el hub 1.1 esta com-puesto por el controlador hub y el repetidor hub, sin embargo el hub 2.0 posee unnuevo elemento llamado Traductor de Transacciones (TT).

1.5.3. Funciones

Una funcion es un dispositivo USB no compuesto, que esta disenado para trans-mitir y recibir datos. Se puede decir que es un periferico, sin embargo un dispositivocomun y corriente fısicamente puede incorporar multiples funciones e incluso llevardentro un hub, en cuyo caso se conoce como un dispositivo compuesto, donde cadafuncion no puede ser desconectada o conectada de modo individual.

1.6. Transacciones

El host es el que maneja todo el flujo de datos en el BUS, para ello USB 1.1 divideel tiempo en segmentos equivalente a 1 milisegundo denominado Frame o Trama yaplicable a los buses low-speed y full-speed. En high-speed que pertenece al protocoloUSB 2.0, se trabaja con frame y microframes donde cada microframe equivalen a 125microsegundos. Los frames no es mas que un mecanismo del bus USB para controlarel acceso a este, en funcion del tipo de transferencia que se realice reservando ciertosporcentajes del tiempo de la trama. En cada transaccion incluye un numero deter-minado de paquetes y cada frame incluye un numero determinado de transacciones.

La figura 1.11 muestra como las diferentes transacciones que producen los dispo-sitivos se van agrupando en el frame. En cada frame puede suceder que no se hagauso completo del tiempo, ya que a veces no existen mas transacciones en el bus o sim-plemente porque el tiempo sobrante no es suficiente para asegurar que la transaccionse realice.

Las transacciones se agrupan formando transferencias. Cada transferencia obe-dece a un tipo predeterminado como lo son: Interrupt, Control, Bulk e Isochronous.Una transferencia puede estar distribuida entre distintos frames o incluida comple-tamente en una sola (dependiendo del tamano de la informacion). Las transferenciasque necesitan una tasa especıfica de velocidad, se garantizan reservando la cantidadde tiempo que necesitan en cada frame. Si el ancho de banda no esta disponible,entonces el host no establece la comunicacion dando al driver la posibilidad de poderpedir una porcion mas pequena del ancho de banda o esperar hasta que el ancho debanda demandado este disponible. La maxima cantidad de informacion util que sepuede transferir en un paquete de datos depende de la velocidad del dispositivo y deltipo de Endpoint.

26

CAPITULO 1. PROTOCOLO USB

Figura 1.11: Distribucion de diferentes transacciones en un frame.

1.6.1. Pipes y endpoint

El flujo de datos del bus USB desde un punto de vista virtual se realiza porcaminos denominados pipes (figura 1.12).

Figura 1.12: Pipes y endpoint.

Cada pipe tiene asociado un endpoint que son los respectivos terminales de cadapipe. Cada endpoint tiene una direccion que puede ser IN, OUT o bi-direccional.El controlador puede acceder a cada endpoint para establecer la comunicacion, puescada dispositivo USB define un grupo de endpoint que forman la interfaz final. A suvez, cada endpoint define el tamano maximo de transferencia. En USB 1.1 los valores

27

CAPITULO 1. PROTOCOLO USB

son de 8, 16, 32 o 64 bytes. Para USB 2.0 se suma un nuevo tamano de 512 bytes.En los dispositivos low-speed solo es posible tener endpoint de 8 bytes.

1.6.2. Paquetes y fases de las transacciones

El protocolo de comunicaciones del bus USB entre el host y el dispositivo fısicose realiza a traves de Tokens (testigos). De forma general toda funcion (dispositivo)en principio, esta esperando a que el host le envıe un paquete. Si un paquete tienela misma direccion (device adress) que el dispositivo, entonces este cambia de estadopara proceder aceptar la transaccion.

Figura 1.13: Fases de una transaccion.

Como se muestra en la figura 1.13 una transaccion tıpicamente puede estarcompuesta por una, dos o tres fases. Las tres posibles fases son Token, Data yHandshake, las cuales de existir lo haran de forma secuencial: una fase Token essiempre seguida de una fase Data y esta a su vez sera seguida de una fase Handshake.Las fases Data y Handshake son opcionales de acuerdo al tipo de transmision que sesolicite. A su vez, cada fase esta compuesta por una serie de paquetes1 como: SYNC,PID, ENDPOINT, DEVICE ADDRESS, DATA y CRC.

1El detalle de los paquetes del protocolo se pueden encontrar en el Apendice A.

28

CAPITULO 1. PROTOCOLO USB

1.6.3. Token Packet

Se compone de un paquete enviado por el controlador USB y siempre esta presenteen toda transaccion. En esta fase se envıa: el tipo del paquete, la direccion del dis-positivo y la direccion del endpoint. El paquete finaliza con un control de error CRC5.

Los paquetes que componen un Token Packet (cuadro 1.3) son:

0 8 15 19 23

PID ADDR ENDP CRC5

8 bits 7 bits 4 bits 5 bits

Cuadro 1.3: Token Packet.

PID: Identifica el tipo de paquete, los posibles tipos de paquetes soportablespara el PID tipo Token son: IN, OUT, SETUP y SOF. Todos los PIDs vanauto-protegidos con bits redundantes.

ADDR: Direccion del dispositivo a comunicar, con un total de 127 direccionesposibles.

ENDP: Numero del endpoint para establecer la transferencia. Son soportablessolo 16 endpoints como maximo.

CRC5: El ultimo campo en todos los paquetes Tokens consta de 5 bits y co-rresponde al codigo de redundancia cıclica. Este no abarca los campos SYNC yPID.

1.6.4. Data Packet

Data Packet (cuadro 1.4) consiste en un paquete PID, luego cero o mas bytesde los datos utiles asociado con la transferencia (DATA) y finaliza con un paquetede correccion de 16 bits. Hay dos tipos de Data Packet identificados por diferentesPIDs1: DATA0 y DATA1. Estos dos paquetes estan definidos para usarlos en formade toggle para la disminucion de errores y confusiones por parte del host.

En USB 1.1 un paquete de datos puede transmitir una carga maxima de 1023bytes de datos (en transacciones isocronas) durante una sola transaccion, mientrasen los otros tipos de transferencia tienen cargas maximas de 64 bytes (Bulk).

1El protocolo USB 2.0 agrega nuevos tipos de paquetes para la fase Data Packet: DATA2 y MDATA.

29

CAPITULO 1. PROTOCOLO USB

0

PID DATA CRC16

8 bits 0-1023 bytes 16 bits

Cuadro 1.4: Data Packet.

1.6.5. Handshake Packet

Todas las transferencias USB (excepto isocronas) son implementadas para garan-tizar la entrega de datos. Para ello se incluye la fase Handshake que permite verificarsi la transferencia ha sido exitosamente realizada. Si un error ocurre en la transaccion,el Data Packet no es entregado y el host puede intentar entregarlo nuevamente.

0 7

PID

Cuadro 1.5: Handshake Packet.

Los posibles PID que soporta el paquete Handshake son:

ACK

Significa Acknowledged o reconocimiento y es transmitido cuando el host o eldispositivo ha recibido satisfactoriamente los datos sin errores. El dispositivo retornaun ACK en el Handshake para transacciones OUT o SETUP y el host retorna unACK solo para transacciones tipo IN.

NAK

Not Acknowledged o Reconocimiento Negativo: este paquete es transmitido cadavez que el dispositivo no esta listo para una operacion, tanto de transmision como derecepcion de paquetes. Por definicion el host siempre puede transmitir o recibir unpaquete de datos, de lo contrario nunca habrıa transmitido el paquete Token (OUT oIN). Consecuentemente el paquete handshake NAK solo puede ser transmitido haciaarriba (Upstream) por el dispositivo y solo puede ser recibido por el host. Luego deque el controlador host transmita un paquete de datos asociado a un paquete Tokende salida (OUT Token), el dispositivo transmite un paquete handshake NAK si noesta listo para recibir los datos. Esto se da tambien en el caso de que el host trans-mita un paquete Token de entrada (IN Token) y que el dispositivo no este listo paratransmitir. Las transferencias del tipo isocronas no retornan NAK porque ese tipode transferencias no usan Handshake.

30

CAPITULO 1. PROTOCOLO USB

STALL

El Handshake STALL puede significar: que no soporta una peticion de control,la peticion de control ha fallado o el endpoint no existe. En el caso que el endpointfalle, el dispositivo es incapaz de recibir o trasmitir los datos. El comando STALL estransmitido solo por los dispositivos (upstream), y pueden ser recibidos unicamentepor el controlador, el cual debe intervenir para solucionar el problema antes de quela comunicacion puede ser reanudada.

1.7. Transferencias

USB fue disenado para manipular diferentes perifericos con diversos requisitoscomo: velocidad de transferencia, tiempo de respuesta, tamano de datos enviados ycorreccion de errores. Los cuatro tipos de transferencias que existen en USB cumplencon las necesidades que se nombraron. Las transferencias son: Control, Interrupt,Bulk y Isochronous y un dispositivo puede integrar a los tipos de transferenciasque mas les convengan y satisfagan, segun sean sus proposito, siendo el del tipo Con-trol el unico de uso obligatorio para los dispositivos USB.

Tipo Control Bulk Interrupt Isochronous

Uso tıpico Identificacion con-figuracion

Impresoras,scanner, pendrives

Mouse, teclados,joysticks

Streaming audio yvideo.

Requerido Si No No No

Permite low-speed

Si No Si No

¿Correccion deerrores?

Si Si Si No

Reserva anchode banda

10% para low yfull-speed, 20%para high-speed

No 90% para low yfull-speed, 80%para high-speed

90% para low yfull-speed, 80%para high-speed

Maxima tasafull-speed

832 bytes/frame 1216 bytes/frame 64 bytes/frame 1023 bytes/Frame

Maxima tasalow-speed

24 bytes/frame No permitido 0.8 bytes/frame No permitido

¿Tasa garanti-zada de entre-ga?

No No No Si

Cuadro 1.6: Resumen de las transferencias y sus usos.

El cuadro 1.6 muestra los tipos de transmision con un resumen de las cualidades ysus tıpicos usos. Para cada transferencia se considera el maximo tamano del paquetepermitido.

31

CAPITULO 1. PROTOCOLO USB

1.7.1. Interrupt

Este tipo de comunicacion incorpora deteccion de errores y retransmision de datos.Es utilizado por aquellos dispositivos que desean transferir muy poca informacion yademas poco frecuente, asegurando la lectura de los datos dentro de un perıodo maxi-mo de tiempo. Los dispositivos full-speed pueden solicitar entre 1 y 255 ms, mientrasque los dispositivos low-speed pueden solicitar un perıodo maximo de servicio entre10 y 255 ms.

Interrupt tiene la particularidad de ser unidireccional por cada endpoint que sedefina (desde el host al dispositivo o desde el dispositivo al host). Ademas juntocon las transferencias de Control, las transferencias del tipo Interrupt son las unicasformas en que los dispositivos low-speed pueden transferir datos. Los teclados y losmouse usan este tipo de transferencias para enviar informacion de teclas, botones ydatos de los movimientos. Las transferencias de interrupcion pueden usar cualquiervelocidad ya sea low, full o high speed, pero los dispositivos no estan obligados asoportar las transferencias de interrupcion. Una clase especıfica de dispositivo laspodrıa precisar si la requiere.

Figura 1.14: Fases de una transaccion Interrupt.

Durante cada frame la maxima carga util de datos permitidos por las transfe-rencias de interrupcion es de 8 bytes para low-speed y de 8, 16, 32 o 64 bytes paradispositivos full-speed. Para USB 2.0 en modo high-speed el tamano maximo del pa-quete para las transferencias de interrupcion es aumentado a 1024 bytes. La reservade tiempo para acomodar transferencias de interrupcion es como maximo el 90% deltiempo del frame y 80% para microframe, esto porque las transferencias de Controltienen reservado el otro 10% restante. El sistema USB puede ir estableciendo pipes

32

CAPITULO 1. PROTOCOLO USB

de interrupcion con distintos dispositivos hasta agotar dicha reserva, en caso queesten agotadas las reservas y se incorporen nuevos dispositivos con transferencias deltipo Interrupt, el dispositivo respondera como no configurado.

Las transacciones del tipo Interrupt pueden ser transferencias IN o OUT1. Latransaccion se compone de tres fases: Token, Data y Handshake, tal como se muestraen la figura 1.14.

1.7.2. Bulk

La transferencia Bulk es una comunicacion no periodica, tıpicamente empleadapor transferencias que requieren usar todo el ancho de banda disponible o esperar has-ta que el ancho de banda este disponible. Esto implica particularmente movimientosde imagenes, archivos o video, donde se requiere de gran potencial de transferencia enpoco tiempo. Para estas aplicaciones, las transferencias pueden ser muy rapidas perolos datos pueden esperar si es necesario. Si el bus USB esta muy ocupado, entonceslas transferencias Bulk son lentas, pero si el bus de lo contrario esta desocupado,entonces las transferencias Bulk son muy rapidas.

Figura 1.15: Fases de una transaccion Bulk.

Los dispositivos full-speed y high-speed pueden hacer transferencias Bulk. Losdispositivos low-speed no pueden soportar las transferencias Bulk. Para dispositivosfull-speed el maximo tamano del paquete puede ser 8, 16, 32 o 64 bytes y para dis-positivos high-speed es de 512 bytes. Los dispositivos no estan obligados a tener unapipe tipo Bulk, pero una clase especıfica del dispositivo las podrıa precisar. Otra delas caracterısticas de la transferencia Bulk es la habilidad de garantizar la entrega de

1USB 1.0 solo admite transferencias del tipo IN, USB 1.1 soporta ambas.

33

CAPITULO 1. PROTOCOLO USB

datos libres de errores entre el host y el dispositivo.

Bulk usa 3 fases: Token, Data y Handshake (figura 1.15). Bajo ciertas condi-ciones del endpoint en el cual su estado esta en modo suspendido, la fase Data esreemplazada por el Handshake resultando solo 2 fases de transmision. Los camposPING y NYET solo son usados por dispositivos high-speed.

1.7.3. Isochronous

La transmision isocrona ha sido desarrollada especialmente para satisfacer las de-mandas de la transmision en tiempo real para voz, video e imagenes, donde los errorespueden ser tolerados (los posibles errores no se recuperan, la informacion que no llegaa su tiempo se descarta). La transferencia isocrona provee comunicacion continua yperiodica entre el host y el dispositivo, con el fin de mover informacion relevante a uncierto momento, donde la informacion util por paquete puede oscilar entre 1 y 1,023bytes. Solo los dispositivos full y high-speed pueden hacer transferencias isocronas ypara el caso de full-speed se puede reservar un ancho de banda de hasta un 90%. Enel caso que el sistema no puede garantizar el tiempo suficiente como para manejaruna nueva conexion isocrona (transmitir un nuevo paquete dentro del perıodo maxi-mo requerido), simplemente no se establece la conexion.

Figura 1.16: Fases de una transaccion Isochronous.

La figura 1.16 resume las fases permitidas dentro de una transferencia isocrona.Existen dos fases: Token y Data, no existe ninguna fase Handshake en las transfe-rencias isocronas.

1.7.4. CONTROL

Las transferencias de control estan definida para un solo uso: transportar las peti-ciones (request) standard y especificas definidas por la especificacion USB. El objetivo

34

CAPITULO 1. PROTOCOLO USB

es facultar al host para que este interrogue y configure a los dispositivos conectadosen los puertos. Por esta razon, la intervencion de este tipo de comunicacion es obliga-toria y solo aparece al principio de la conexion de un dispositivo, para luego dar pasoa las otras tres transferencias posibles. La transferencia de Control se hace a travesdel endpoint-0 bidireccional. Un fabricante puede colocar otros endpoint de Controla disposicion, pero no trae ninguna ventaja comparativa.

En la figura 1.17 se resumen las fases de una transaccion de Control.

Figura 1.17: Fases de una transaccion de Control.

35

Capıtulo 2

Controlador SL811HS

Este capıtulo explica el funcionamiento general del host controlador SL811HS, de-tallando las principales senales que posee. A su vez, se nombran las funciones basicasque permiten acceder a la lectura y escritura de los registros de configuracion delSL811HS, para luego nombrar y explicar cuales son los registros principales para elfuncionamiento en modo host.

2.1. Aspectos generales

El controlador USB SL811HS cuyo diagrama se muestra en la figura 2.1, esun chip de la companıa Cypress Semiconductor Corporation, capaz de comunicarsecon dispositivos USB tanto como para la velocidad low-speed, como para la veloci-dad full-speed. El controlador SL811HS solo soporta la norma del protocolo USB 1.11

Figura 2.1: SL811HS pin layout.

1USB 1.1 no soporta high-speed.

36

CAPITULO 2. CONTROLADOR SL811HS

A diferencia de otros controladores USB, el SL811HS puede ser controlado pordiversos dispositivos tales como: microprocesadores, microcontroladores, DSPs, yvariedades de buses como: ISA, PCMCIA y otros. De esta manera, el controladorSL811HS sirve para una variedad de sistemas embebidos en donde requieren de unaconfiguracion independiente del dispositivo que lo controle, ya sea para un modo host(controlador) o un modo slave (dispositivo USB).

2.1.1. Modulo de trabajo

La companıa Cypress a lo largo del tiempo ha sacado diferentes modelos de estechip, como por ejemplo: SL811, SL811S y SL811HS. A su vez, se ha revisado elfirmware del SL811HS agregando en varias ocasiones modificaciones, como por ejem-plo la generacion automatica de CRC. En la presente memoria se trabajo con el chipSL811HS version 1.5, ensamblado en un modulo de trabajo que es mostrado en lafigura 2.2. Este modulo fue realizado por el Departamento de Electronica como partedel trabajo de tıtulo de Michael Kusch.

Figura 2.2: Modulo de trabajo para el SL811HS.

En la presente memoria el modulo fue controlado a traves del microcontroladorMSP430F1612. El detalle de la conexion entre el microcontrolador, el controladorSL811HS y el display de 4 lıneas, se puede consultar en el Apendice B.

37

CAPITULO 2. CONTROLADOR SL811HS

2.1.2. Modos host/slave

El SL811HS soporta dos modos de trabajo. El primer modo es USB Host quesirve para manejar y controlar diversos dispositivos USB. La segunda opcion es elegirel modo de trabajo USB Slave, que se utiliza para disenar dispositivos USB con lacapacidad de manejar diversos endpoints segun la necesidad del disenador. Estos dosmodos se pueden elegir a traves de un solo pin: se fija a tierra en caso que se trabajeen modo host o se conecta a Vcc para trabajar modo slave. Junto con la elecciondel pin master o slave, se debe construir un circuito propuesto por el fabricante paracada caso, pero que tienen una gran similitud de construccion. La similitud de loscircuitos fue aprovechado por Michael Kusch para ensamblar ambos modos en unasola placa, dando la opcion de elegir entre host y slave a traves de tres jumper talcomo lo muestra la figura1 2.2.

Figura 2.3: Conectores Serie-A y Serie-B.

La eleccion del modo de trabajo host o slave, lleva consigo a la utilizacion deconectores unicos para cada caso. Para trabajar en modo host los conectores y cablesse denominan Serie-A, en cambio los conectores en modo slave son llamados Serie-B(figura 2.3). Nunca se debe usar un modo de operacion y conectar ambas series,puesto que el SL811HS no trabaja en ambos modos al mismo tiempo.

2.2. Registro y memoria

El SL811HS usa un mapa de memoria de 256 bytes, los cuales se direccionan atraves de un bus de datos de 8 bits. Las primeras 16 direcciones (00h-0Fh) correspon-den a los 16 registros que se disponen para el control del chip tanto para el modo host

1En la figura 2.2, los tres jumper tienen el color azul.

38

CAPITULO 2. CONTROLADOR SL811HS

y slave. Las direcciones restantes (10h-FFh) estan disponible para la implementaciondel buffer que envıa y recibe los datos a los dispositivos USB. El mapa de la memoriadel SL811HS se muestra graficamente en la figura 2.4.

Figura 2.4: Distribucion de la memoria y registros.

2.2.1. Registros generales de configuracion

ADDR. Funcion Escritura Funcion Lectura0x00 USB-A Control USB-A Control0x01 USB-A Address USB-A Address0x02 USB-A Length USB-A Length0x03 USB-A PID/EP USB-A Status0x04 USB-A Address USB-A Count0x05 Ctrl1 Ctrl10x06 Int. Enable Int. Enable0x07 Reservado Reservado0x08 USB-B Control USB-B Control0x09 USB-B Address USB-B Address0x0A USB-B Length USB-B Length0x0B USB-B PID/EP USB-B Status0x0C USB-B Address USB-B Count0x0D Int. Status Int. Status0x0E SOF Low HW Revision0x0F SOF High/Ctrl2 SOF High/Ctrl2

Cuadro 2.1: Registros de configuracion del SL811HS.

Los 16 registros mostrado en el cuadro 2.1 se pueden separar en 3 bloques:registros para la utilizacion en modo host (USB-A), registros para la utilizacion enmodo slave (USB-B) y registros comunes de control para ambos modos.

39

CAPITULO 2. CONTROLADOR SL811HS

Los registros de configuracion tienen la caracterıstica que despues de escribir enellos se puedan leer para verificar los valores, sin embargo algunos registros funcio-nan de diferente manera para la lectura y escritura, adquiriendo una doble funcion:configurar los registros para el control e informar datos revelantes respecto a la co-municacion USB. La comprobacion de un registro solo tendra sentido para aquellosregistros que cumplan con la misma funcion (deben tener el mismo nombre para lec-tura y escritura en el cuadro 2.1).

2.2.2. Registros en modo host

Son 10 registros que se ocupan en modo host (12 funciones diferentes), los cualesse resumen en el cuadro 2.2. En el cuadro mencionado se muestra: el nombre de cadaregistro (columna 1), la definicion que ocupa en el codigo del programa (columna 2),la direccion del registro en el SL811HS (columna 3) y un resumen de las principalescaracterısticas (columna 4). La mayorıa de los registros son configuraciones bit a bit.Para mayor detalles de los registros y su configuracion se puede consultar el ApendiceC de este trabajo, donde ademas se incluyen ejemplos con los registros en modo host,o bien consultar el documento1 oficial.

Registro. Definicion Direcc. Caracterısticas

USB-A Control CTL 0x00 provee el control basico de las transacciones realizada porel host

USB-A Address BUFADR 0x01 fija en que parte de la memoria van a llegar o enviar losdatos

USB-A Length BUFLEN 0x02 fija el largo maximo de la transaccion

USB-A PID/EP PID EP 0x03 establece que tipo de paquete se va enviar y en que end-point

USB-A Status PKTSTAT 0x03 indica el resultado de la ultima transaccion

USB-A Address FNADDR 0x04 fija la direccion del dispositivo USB (0-127)

Ctrl1 CTL1 0x05 genera reset, control de low/full, suspension/habilitaciondel USB y generacion automatica de SOF

Int. Enable IE 0x06 habilita las interrupciones

Int. Status INTSTATUS 0x0D muestra el estado de las interrupciones

SOF Low SOFCT L 0x0E contador low, para generar frame de 1 ms

HW Revision HWR 0x0E indica la version del hardware

SOF High/Ctrl2 SOFCT H 0x0F contador high, para generar frame de 1ms

Cuadro 2.2: Registros y definiciones para modo host.

2.3. Senales de control

El microcontrolador accede al SL811HS por medio de una serie de pines de en-trada y de salida. Estas senales permiten realizar las funciones basicas para realizar

1El documento se puede encontrar en la pagina www.cypress.com o en el CD-ROM adjunto a la memoria,“Documentos/Sl811hs/SL811HS - Datasheet.pdf”.

40

CAPITULO 2. CONTROLADOR SL811HS

las operaciones dentro del chip y ası poder establecer una comunicacion USB. Sibien es importante saber el funcionamiento de estas senales para poder construirlas primeras operaciones basicas dentro del chip, en un momento dado, luego de lasconstrucciones de las funciones basicas (lectura y escritura), estas senales pasaran aun segundo plano, ya que difıcilmente seran manipuladas en una forma directa porel programador. Las senales basicas se muestran en la figura 2.5.

Figura 2.5: Senales de acceso para el SL811HS.

A continuacion se explican las senales del SL811HS y se muestran las definicionesdel codigo para el uso del microcontrolador.

CHIP SELECT (nCS): Esta senal se usa para habilitar la lectura o escrituratanto de los registros de configuracion como del buffer para almacenamientode datos, de esta manera se protege el uso del chip cuando se compartan lasmismas senales en el microcontrolador.

#define USB_EN_ON P1OUT=BIT2

#define USB_EN_OFF P1OUT&=~BIT2

#define USB_EN_init P1DIR=BIT2;P1SEL&=~BIT2; // OUT; DigitalIO;

READ (nRD): Con una senal baja, el microcontrolador puede acceder a lalectura de los registros y memoria del SL811HS, sin embargo antes de que unalectura pueda llevarse a cabo, la direccion del registro o memoria que se desealeer debe estar escrita en el puntero del SL811HS. Previamente la senal nCSdebe habilitar la lectura del chip para que se pueda reconocer la senal nRD.

#define USB_RD_ON P1OUT=BIT4

#define USB_RD_OFF P1OUT&=~BIT4

#define USB_RD_ini P1SEL&=~BIT4; // DigitalIO;

#define USB_RD_OUT P1DIR=BIT4;

#define USB_RD_IN P1DIR&=~BIT4;

41

CAPITULO 2. CONTROLADOR SL811HS

WRITE (nWR): Esta senal se activa con un bit bajo para que el microcon-trolador pueda escribir en el puntero, registro o memoria del chip. Al igual quela senal de lectura nRD se debe activar nCS para su uso.

#define USB_WR_ON P1OUT=BIT3

#define USB_WR_OFF P1OUT&=~BIT3

#define USB_WR_init P1SEL&=~BIT3; // DigitalIO;

#define USB_WR_OUT P1DIR=BIT3;

#define USB_WR_IN P1DIR&=~BIT3;

ADDRESS (A0): La senal A0 es manejada para que en conjunto con la senalnWR se pueda definir si la escritura es hacia el puntero o hacia los registros.

#define USB_A0_ON P1OUT=BIT5

#define USB_A0_OFF P1OUT&=~BIT5

#define USB_A0_init P1SEL&=~BIT5; //OUT; DigitalIO;

#define USB_A0_OUT P1DIR=BIT5;

#define USB_A0_IN P1DIR&=~BIT5;

Las formas de ondas que se producen dentro del SL811HS cuando se produceuna escritura en un registro son mostradas en la figura 2.6.

Figura 2.6: Formas de ondas cuando se escribe en un registro del SL811HS.

INTERRUPT (INTRQ): La senal INTRQ entrega un valor alto al microcon-trolador, cuando ocurre una de las posibles interrupciones programadas dentrodel SL811HS, como por ejemplo la conexion de un nuevo dispositivo. INTRQvuelve a cero solo cuando el registro de interrupcion es borrado a traves desoftware.

42

CAPITULO 2. CONTROLADOR SL811HS

#define USB_INT P1IN&BIT0 //Active High

#define USB_INT_B BIT0 //Active High

#define USB_INT_init P1DIR&=~BIT0;P1SEL&=~BIT0; // IN; DigitalIO;

#define USB_INT_EN P1IE=BIT0;P1IES&=~BIT0;

DATA BUS (D[7:0]): El SL811HS usa este bus bi-direccional para transferirdatos de entrada y salida de los registros y memoria.

#define USB_IN P4IN

#define USB_OUT P4OUT

#define USB_SEL P4SEL

#define USB_DIR P4DIR

RESET (NRST): La senal NRST se realiza a traves de un nivel bajo de en-trada para generar un reset. El reset es valido cuando se cumplen 16 ciclos dereloj del SL811HS.

#define USB_RST_ON P1OUT=BIT1

#define USB_RST_OFF P1OUT&=~BIT1

#define USB_RST_init P1DIR=BIT1;P1SEL&=~BIT1; // OUT; DigitalIO;

2.4. Funciones basicas

El objetivo es poder realizar cuatro funciones que permitiran configurar y estable-cer la comunicacion USB: iniciar el SL811HS, leer registros/memoria, escribir en losregistros/memoria del SL811HS y detectar la velocidad de un dispositivo.

2.4.1. Escritura en registros

La funcion wr811(), cuyo codigo es mostrado mas abajo, realiza la funcion deescribir en la direccion del registro/memoria “a” del SL811HS, el valor del byte “d”.Para ello utiliza la habilitacion de las senales discutidas anteriormente.

void wr811(BYTE a, BYTE d) 1

USB_SELECT; //Make SL811 ready to communicate with.2

USB_DIR=0xFF; //Data port to outputs3

USB_OUT=a;4

USB_A0_OFF; //Write address to pointer5

USB_WR_OFF;6

USB_WR_ON;7

USB_OUT=d;8

USB_A0_ON; //Write data to register9

USB_WR_OFF;10

USB_WR_ON;11

43

CAPITULO 2. CONTROLADOR SL811HS

USB_DIR=0x00; //Data port to inputs (for multiplexing)12

USB_DESELECT; //Liberate used signals13

14

Se construyo una funcion mas util para copiar datos en bloques desde memoriadel microcontrolador al buffer del SL811HS:

char *BuffWr811(BYTE addr, BYTE c, char *ptr)

if(c<=0)

return ptr;

while (c--)

wr811(addr++,*ptr++);

return ptr;

La funcion BuffWr811() es una variacion que permite escribir un bloque de datosde largo especıfico “c” desde un puntero “ptr” a la direccion addr del SL811HS.Como precaucion se debe usar siempre a partir de la direccion 0x10h (addr), puestoque antes se encuentran los registros de configuracion. En caso de querer modificar losregistros de configuracion, siempre sera mejor hacerlo a traves de la funcion wr811()que permite operaciones paso a paso, y de esta manera evitar posibles errores.

Otra operacion de escritura en el SL811HS es la funcion BuffClear811(). La fun-cion fue construida para borrar bloques de memoria del SL811HS. De esta manerase podra borrar basura o limpiar los registros para realizar analisis de los datosrecibidos y ası no mezclar los antiguos datos del SL811HS. El codigo para esta fun-cion es mostrado a continuacion:

void BuffClear811(BYTE addr, BYTE c)

if(c<=0)

return;

while (c--)

wr811(addr++,0x00);

2.4.2. Lectura de registros

La funcion que permite la lectura de los registros o buffer del SL811HS es la fun-cion rd811() donde el codigo es muy parecido a la funcion de escritura. El codigo

44

CAPITULO 2. CONTROLADOR SL811HS

para esta funcion es mostrado a continuacion:

BYTE rd811(BYTE a) 1

unsigned char d;2

USB_SELECT; //Make SL811 ready to communicate with.3

USB_DIR=0xFF; //Data port to outputs4

USB_OUT=a;5

USB_A0_OFF; //Write address to pointer6

USB_WR_OFF;7

USB_WR_ON;8

USB_DIR=0x00; //Data port to inputs9

USB_A0_ON; //Read data from register10

USB_RD_OFF;11

d=USB_IN; //Read DATA12

USB_RD_ON;13

USB_DESELECT; //Liberate used signals14

return d;15

16

Al igual que en la seccion de la escritura, esta vez se diseno la funcion contraria.La funcion BuffRead811() permite leer y copiar datos en bloques desde el SL811HSal microcontrolador. El codigo de esta funcion es mostrado a continuacion.

void BuffRead811(BYTE addr, BYTE c, char *s)

if(c<=0)

return;

while (c--)

*s++=rd811(addr+);

2.4.3. Inicializacion del SL811HS

La inicializacion del SL811HS consiste en primer lugar en aplicar por medio desenales un reset1 al SL811HS . En segundo lugar se habilitan los puertos del microcon-trolador que van controlar las senales del SL811HS. Todo este proceso se encuentradisponible en la funcion USB init(). El codigo de la funcion se muestra a continuacion:

unsigned char USB_init(void)1

2

unsigned char rev;3

1Tambien es posible aplicar un reset a traves de los registro de configuracion, pero para ello tiene queestar inicializado el SL811HS.

45

CAPITULO 2. CONTROLADOR SL811HS

USB_RST_OFF; //Reset activado4

USB_RST_init; //inicializacion de las se~nales5

USB_EN_ON;6

USB_EN_init;7

USB_PWR_OFF;8

USB_PWR_init;9

USB_WR_init;10

USB_RD_init;11

USB_INT_init;12

USB_PWR_FLG_init;13

Delayx100us(250);14

USB_RST_ON; //Reset desactivado.15

USB_SEL=0x00; //DigitalIO16

USB_PWR_ON;17

18

//obetencion de la version del Hardware.19

rev=( (rd811(HWR)&0xF0) >>4 );20

return rev;21

22

Antes que se desactive el reset con una senal alta (lınea 15 del codigo) se esperaun tiempo suficiente para asegurar que se cumplan los 16 ciclos de reloj y ası el resettenga efecto. Esta funcion retorna la version del hardware, leyendo el registro HWR1

del SL811HS. El numero obtenido tiene que desplazarse puesto que la informacionesta en los ultimos 4 bits del registro. El valor de la actual version del chip es 02h(version 1.5).

2.4.4. Deteccion low/full speed

Las cuatro interrupciones que se generan dentro del SL811HS activan una solasenal en el microcontrolador. Las interrupciones se habilitan o deshabilitan con elregistro IE (0x06) del SL811HS, dando las posibilidades de configurar las interrup-ciones para: la deteccion del puerto USB-A o USB-B, interrupciones de desconexiono conexion de un dispositivo esclavo, interrupcion por resumen/suspension de undispositivo y finalmente interrupcion cuando se produce un SOF (Start Of Frame).Como se puede analizar, las interrupciones (excluyendo la interrupcion por SOF) solotienen que ver con el dispositivo fısico. El registro que se encarga de informar cual esla interrupcion que se activa corresponde al registro INTSTATUS (0x0D), que juntocon decir la presencia o ausencia de un dispositivo, entrega informacion (en el bit7)si la lınea conectada es D+ o D-, determinando de esta manera si el dispositivo eslow-speed o full-speed.

Se puede decir que cuando se usa el SL811HS con un solo puerto de entrada (sinhub), las interrupciones que tienen que ver con el dispositivo fısico pueden llegar aser de uso ocasional. Por lo contrario, la interrupcion por SOF es una interrupcion deuso frecuente: cuando se envıan paquetes de control o datos a un dispositivo, estos

1El registro HWR esta definido como el registro de lectura 0x0E.

46

CAPITULO 2. CONTROLADOR SL811HS

se hacen normalmente despues de generarse un SOF1 (inicio de un frame) y para ellose usa las interrupcion por SOF usando la funcion waitframes(BYTE n). La funcionmencionada retorna cuando pasa la cantidad de n-frame y justo despues de habersegenerado el SOF.

Funcion deteccion de velocidad

Internamente la funcion detectar velocidad() consiste en cuatro partes: desac-tivacion de las transferencias USB; comprobacion de la presencia o ausencia de undispositivo a traves de las interrupciones; determinar si el dispositivo es full o lowspeed y finalmente la configuracion para cada caso de velocidad. El codigo de la fun-cion detectar velocidad() es mostrado a continuacion:

int detectar_velocidad(void)

wr811(SOFCT_H, 0x2E 0x80); // 1 msec SOF rate, b7=HOST, b6= no change

wr811(CTL1,USB_RESET); // Reset USB.

Delayx100us(250); //estabiliza.

wr811(CTL1,0x00); // Set normal operacion.

wr811(IE,(USB_IE_INS USB_IE_A USB_IE_RESUME)); // USB-A, Insert/Remove, USB_Resume.

wr811(INTSTATUS,USB_INT_CLEAR); // Limpia las interrupciones.

Delayx100us(250); //estabiliza.

if (rd811(INTSTATUS)&USB_IF_DETECT) //Si no hay dispositivo.

wr811(INTSTATUS,USB_INT_CLEAR); // Limpia las interrupciones.

printf("no hay dispositivo.");

return 0;

else

if (rd811(INTSTATUS)&USB_IF_D) //bit7 de registro 1=full,0=low.

wr811(INTSTATUS,USB_INT_CLEAR); // Limpia las interrupciones.

printf("full speed.");

//activa para usar en full.

wr811(SOFCT_L, 0xE0);

wr811(SOFCT_H, 0x2E 0x80);

wr811(CTL1,0x01);

return 2;

else

wr811(INTSTATUS,USB_INT_CLEAR); // Limpia las interrupciones.

printf("low speed.");

//activar low.

wr811(SOFCT_L, 0xE0);

wr811(SOFCT_H, 0x2E 0xC0);

wr811(CTL1,0x21);

return 1;

1La entrega de los paquetes se puede hacer de forma automatica despues de un SOF usando los registrosde configuracion, pero el SL811HS contiene un error que no permite el uso normal de esta configuracion.

47

CAPITULO 2. CONTROLADOR SL811HS

//end detectar_velocidad.

Hay que mencionar que la funcion detectar velocidad() retorna valores segun seael caso: el valor 0 cuando no hay dispositivo, el valor 1 para dispositivos low-speed yel valor 2 para los dispositivos que sean full-speed. De esta manera la funcion detec-tar velocidad() es el primer paso para la enumeracion del bus.1

Existen dos escenarios distintos para la deteccion de un dispositivo: primer casocuando el dispositivo esta conectado desde un principio al controlador, y segundo casocuando ya se ha iniciado el funcionamiento del controlador y el usuario conecta untiempo despues el dispositivo USB. Para ambos casos la funcion detectar velocidad()cumple con el reconocimiento y configuracion del dispositivo. En el primer caso, endonde un dispositivo se encuentra inicialmente conectado al SL811HS, simplementebasta con colocar en el programa principal las siguientes funciones ya comentadas:

int main(void)

.

.

USB_init();

detectar_velocidad();

.

.

Usando los valores de retorno de la funcion se puede condicionar el paso al restodel codigo con una sentencia while() hasta que se cumpla una condicion verdadera, esdecir, hasta que se conecte un dispositivo. Sin embargo, cuando se ocupa el microcon-trolador para realizar otras tareas y no tiene dedicacion exclusiva para el controladorSL811HS, se debe usar la funcion detectar velocidad() en una rutina de interrupciondel microcontrolador, tal como se muestra el siguiente codigo:

#pragma vector = PORT1_VECTOR __interrupt void port1_int(void)

if(USB_INT_B&P1IFG)

detectar_velocidad();

P1IFG &= ~BIT0;

Se puede decir que las dos formas de utilizacion, ya sea en forma indirecta o di-recta, son convenientes dependiendo de las circunstancias. Por ejemplo, cuando seesta disenando dispositivos USB es preferible usar la funcion en forma directa parala mayor comprension y descartar posibles errores.

1Posteriormente la funcion detectar velocidad() va a ser incluida en otra funcion mas completa llamadaBus Enumeracion().

48

CAPITULO 2. CONTROLADOR SL811HS

2.5. Visualizacion de los registros

Para la construccion de los primeros codigos de programas, la visualizacion de losregistros de configuracion fue un factor muy importante; cuando se producen erroresde comunicacion es necesario consultar los registros de configuracion y ası poder ais-lar el error verificando cada registro del SL811HS. Tambien es util consultar por losdatos que se estan enviando o recibiendo, ubicados en el buffer de SL811HS. Paraambos casos hay dos posibles soluciones: a traves del display de 4 lıneas o a travesde la herramienta watch del IAR Embedded Workbench1.

2.5.1. Visualizacion de los registros a traves del display

El display de 4 lıneas permite mostrar solo hasta 16 numeros en formato hexade-cimal (4 registros por lınea), lo cual es precisamente la cantidad de registros que tieneel SL811HS. Para ello se construyo la funcion Registros(BYTE a). El parametro “a”indica de donde empezar a mostrar los registros.

Figura 2.7: Visualizacion de los registros a traves del display.

Por lo tanto, con solo poner Registros(0x00) en cualquier parte del codigo delprograma, se podra obtener los primeros 16 registros de del SL811HS. En la figura2.7 se muestra un ejemplo real. Utilizando el ejemplo de la figura 2.7 se debe aclarardos cosas: no todos los registros mostrados en el display son para el modo host ysegundo, no todos los registros tienen la misma funcion de lectura y escritura.

2.5.2. Visualizacion de los registros a traves de la ventana Watch

Utilizando la herramienta watch del IAR embedded se pueden visualizar varia-bles, estructuras, arreglos, etc. La manera de cargar los registros a la memoria delmicrocontrolador es por medio de la funcion BuffRead811() mencionada en seccionesanteriores de este capıtulo y que permite leer bloques de memoria del SL811HS. Elprocedimiento para cargar los 16 registros es muy sencillo:

1Software que se utilizo para programar el microcontrolador MSP430f1612.

49

CAPITULO 2. CONTROLADOR SL811HS

char temp[16] ;

BuffRead811(0, 16,temp);

La ventana watch se obtiene desde menu/view/watch y luego se escribe el nom-bre de arreglo que se desea ver. La figura 2.8 muestra el resultado obtenido de losregistros de configuracion en la misma situacion que en el ejemplo anterior. Se puedeobservar que los resultados son los mismos exceptuando por el ultimo registro. Estose debe a que el ultimo registro es un indicador de velocidad de transmision y siempreva a estar en constante cambio.

Figura 2.8: Visualizacion de los registros con la herramienta watch.

50

Capıtulo 3

Peticiones, descriptores yconfiguracion general

Este capıtulo describe como el host tiene a disposicion un set de herramientasdenominadas peticiones (Request). Se detalla el funcionamiento y nombre de lasprincipales peticiones que fueron creadas para que el host pueda utilizarlas en la in-terrogacion y configuracion de los dispositivos, mostrando en cada caso la estructurainterna de cada peticion. Ademas, se explican cuales son los pasos necesarios para laconfiguracion basica de un dispositivo USB y ası luego lograr establecer una comuni-cacion de transferencia en forma exitosa. Finalmente se nombran algunos programasque manejan diferentes aspectos de los dispositivos y protocolos, y de esta maneradescartar posibles errores en la construccion de codigos.

3.1. Peticiones

Las peticiones o Request son una serie de instrucciones definidas por USB-IF quepermiten a los controladores USB la interrogacion y configuracion de los dispositivos.La interrogacion permite obtener informacion clave para la asignacion de un driveradecuado. En total son 11 las peticiones standard que el host puede utilizar en dife-rentes tareas: desde asignar una direccion al dispositivo, hasta desactivar un endpointpara no recibir mas datos. No todas las peticiones tienen un uso fijo, un grupo reduci-do se dividen internamente para generar nuevas sub-peticiones. Algunas peticionesparticipan solo despues de que el dispositivo esta configurado, para ası monitorearmultiples sucesos. Un grupo importante de las peticiones se ejecutan solo al principiode cada configuracion, generando un proceso que se denomina Bus Enumeracion.

3.1.1. Tipos de peticiones

Las 11 peticiones que se muestran en el cuadro 3.1 son llamadas peticiones deltipo standard (Standard Request), definidas en el capıtulo 9 del protocolo USB y vali-das para USB 1.1 y 2.0. Las peticiones standard son de caracter de obligatoriedad de

51

CAPITULO 3. PETICIONES, DESCRIPTORES Y CONFIGURACION GENERAL

implementar por los disenadores de dispositivos USB, de esta manera siempre se vaa tener la seguridad que las peticiones responderan cuando el host las ocupa. Sin em-bargo, no es ası para las peticiones de clase donde grupos de dispositivos de similarescaracterısticas se asocian. Por ejemplo la clase de dispositivos de almacenamientomasivos, en donde se agrupan dispositivos tales como pendrives, CD-ROM, DVD,discos duros, etc. Las clases disponen de nuevas peticiones que son definidas en susrespectivos document class. Las peticiones de clases pueden entregar algun tipo deinformacion adicional, o bien realizar alguna funcion especıfica dentro del dispositivo.

Nombre Valor Nombre Valor(bRequest) (bRequest)

get status 0 set descriptor 7clear feature 1 get configuration 8reservado 2 set configuration 9set feature 3 get interface 10reservado 4 set interface 11set adress 5 synch frame 12get descriptor 6

Cuadro 3.1: Peticiones Standard.

El nombre de cada peticion tiene asociado un valor unico para la identificacion.El valor de cada peticion es pasado como parametro en conjunto con otros valoresque finalmente definen a la peticion. El detalle de las construcciones de las peticionesse vera posteriormente.

3.1.2. Principales peticiones

Las principales peticiones son las que pertenecen al llamado Bus Enumeracion.Estas son: set adress, set configuration, get configuration y get descriptor (descrip-tores generales).

3.1.3. set adress

Todos los dispositivos al conectarse por primera vez estan en la direccion cerodel host, lo que lleva a que siempre se deba estar liberando la direccion para laconfiguracion de los nuevos dispositivos. Mientras un dispositivo permanezca en ladireccion cero, el host no podra reconocer otro dispositivo. La peticion set adressrealiza la asignacion de una entre las 127 direcciones que estan disponibles. En loscontroladores USB la asignacion es unica para el dispositivo, por lo tanto solo unavez se puede asignar una direccion a un dispositivo. La funcion creada para que elhost pueda obtener el acceso a esta peticion se muestra a continuacion:

52

CAPITULO 3. PETICIONES, DESCRIPTORES Y CONFIGURACION GENERAL

Funcion:

set_adress(BYTE adress);

La peticion no retorna ningun valor hacia el host. El parametro adress determi-na la nueva direccion del dispositivo. Por ejemplo set adress(0x01) significara queel nuevo dispositivo estara en la direccion numero 1. La direccion no tiene que sernecesariamente una direccion correlativa, puede tomar cualquier valor menos el valorde 0. Sin embargo, en caso de que el SL811HS tenga configurado un HUB, es re-comendable usar direcciones ordenadas.

3.1.4. set configuration

La peticion set configuration es para declarar que el dispositivo esta completa-mente configurado. De esta manera, el dispositivo ya puede comenzar a usarse sinproblemas. Los dispositivos que no estan declarados como configurados no suelenresponder a las transferencias de datos. La funcion creada para tener acceso a estapeticion se muestra a continuacion:

Funcion:

set_configuration (BYTE adress, BYTE value);

El parametro adress indica la direccion del dispositivo en donde se aplicara estapeticion. El parametro value indica la configuracion que se ha elegido para el dispo-sitivo. El valor lo determina otra peticion llamada Configuration Descriptor en sucampo de retorno llamado bConfigurationValue. Por lo general los dispositivos traenuna sola configuracion y el valor del parametro value es siempre de 0x01.

3.1.5. get configuration

Una manera de saber si realmente un dispositivo esta configurado es a traves dela peticion get configuration. La peticion retorna al host el valor de la actual confi-guracion del dispositivo. En caso que el dispositivo no esta configurado, la peticionget configuration retorna el valor 0. Por lo general la peticion get configuration no esun requisito obligatorio dentro del Bus Enumeracion. La funcion creada para teneracceso a esta peticion se muestra a continuacion:

53

CAPITULO 3. PETICIONES, DESCRIPTORES Y CONFIGURACION GENERAL

Funcion:

int set_configuration (BYTE adress);

3.2. Descriptores

Sin duda una de las peticiones que caracteriza el funcionamiento USB, donde nece-sariamente es un punto de discusion con mas detalle para cualquier tipo de diseno,son las peticiones que se obtienen por medio de get descriptor, comunmente nombra-do como descriptores. La importancia de esta peticion standard radica en el hecho deque cada dispositivo USB tiene grabado en una ROM las descripciones e interfaceshechas por el fabricante del producto. Saber el detalle de las descripciones es com-pletamente necesario para que el host pueda determinar el driver apropiado. Entrelos muchos datos que se pueden obtener estan por ejemplo: tipo de transferencia(Control, Isochronous, Bulk, Interrupt), clase de dispositivo, transferencia maxima,numeros de endpoints disponibles, etc., en fin, una cantidad de informacion util. Sinembargo, tambien se puede consultar por detalles que no son necesarios para el fun-cionamiento del dispositivo pero puede servir de informacion general, por ejemplolos descriptores del tipo string donde entregan datos como: nombre del fabricante,modelo del aparato, numero de serie, etc.

3.2.1. Descriptores Standard

Figura 3.1: Descriptores Standard.

54

CAPITULO 3. PETICIONES, DESCRIPTORES Y CONFIGURACION GENERAL

Son cuatro los Descriptores Standard que se pueden solicitar. La figura 3.1 mues-tra como se dividen jerarquicamente ya que cada descriptor depende del anterior. Sepuede observar que cada dispositivo tiene un Device Descriptor que contiene infor-macion general acerca del dispositivo: numero de la version del USB, maximo tamanopara el endpoint-0, identificadores de fabrica y producto, etc. A su vez, un dispositivoUSB puede tener diferentes configuraciones para que el host puede elegir cual masle convenga, como por ejemplo ahorrar energıa. Normalmente no existen productosUSB con alternativas de configuraciones. Configuration Descriptor contiene in-formacion como: configuraciones posibles, energıa requerida para funcionar, indicarsi la energıa es proveniente del propio Bus USB o de alimentacion externa. CadaConfiguration Descriptor tiene varios Interface Descriptor que detallan: endpointdisponibles y tipo de clase al cual pertenece el dispositivo. Finalmente, el ultimodescriptor corresponde al Endpoint Descriptor que contiene el detalle sobre cadaendpoint, indicando: tamano, tipo de transferencia y direccion (IN-OUT).

Cada descriptor entrega los valores a traves de campos que estan identificadoscon sus respectivos nombres. Ademas, cada descriptor puede tener hasta 18 camposde 1 a 2 bytes. Los primeros dos campos de los descriptores comienzan siempre dela misma manera: el primer campo muestra el largo del descriptor (bLength) y el se-gundo campo identifica el descriptor que se solicito (bDescriptorType). Los nombresde los campos empieza con una letra que identifica el tipo o la forma como debe serleıdo: la letra “b” indica que es del tipo byte, “bcd” indica codigo decimal binario,“id” indica que es identificacion y por ultimo la letra “i” indica que es del tipo string.

A continuacion se describen los campos de cada descriptor, destacandose los cam-pos mas importante para el desarrollo de aplicaciones con dispositivos USB. En cadadescriptor se muestra la respectiva funcion que permite el acceso a ellas, en donde seincluye un ejemplo real obtenido con las funciones para los descriptores. El detalleespecıfico de cada campo se puede encontrar en el capıtulo 9 del protocolo USB.

3.2.2. Device Descriptor

El formato del Device Descriptor corresponde al mostrado en el cuadro 3.2.

El campo bcdUSB describe la version del protocolo USB para el dispositivointerrogado. USB 2.0 es interpretado por el numero 0x0200, USB 1.1 por 0x0110y USB 1.0 por 0x0100. Para el caso del controlador SL811HS la version sera 1.1indistintamente si el dispositivo es para la version 2.0.

Los campos bDeviceClass, bDeviceSubclass, bDeviceProtocol identificana que grupo (clase) de dispositivo corresponde y a que dispositivo especıfica-mente corresponde de ese grupo. Normalmente los valores de estos campos sonsiempre cero, exceptuando por los hub y algunos dispositivos especiales. Cuando

55

CAPITULO 3. PETICIONES, DESCRIPTORES Y CONFIGURACION GENERAL

Campo Tamano Descripcion Ejemplo(bytes)

bLength 1 tamano del descriptor en bytes 0x12

bDescriptorType 1 constante DEVICE(01h) 0x01

bcdUSB 2 num. de especificacion USB 0x0110

bDeviceClass 1 codigo de clase 0x00

bDeviceSubclass 1 codigo de subclase 0x00

bDeviceProtocol 1 codigo de protocolo 0x00

bMaxPacketSize0 1 tamano maximo para el paquete del endpoint0 0x40

idVendor 2 vendedor ID 0x3540

idProduct 2 producto ID 0x0215

bcdDevice 2 num. de version del producto. 0x0110

iManufacturer 1 index del String Descriptor para la fabrica 0x01

iProduct 1 index del String Descriptor para el producto 0x01

iSerialNumber 1 index del String Descriptor para la serie 0x00

bNumConfigurations 1 numero de posibles configuraciones 0x01

Cuadro 3.2: Estructura del Device Descriptor.

los valores tienen el valor cero, los valores reales de estos campos son definidosen el Interface Descriptor a traves de los campos bInterfaceClass, bInterface-SubClass, bInterfaceProtocol. El detalle de las clases y subclases se discutiranposteriormente.

Los campos iManufacturer, iProduct, iSerialNumber entregan un valorllamado index el cual es ingresado como parametro dentro del descriptor op-cional llamado String Descriptor. El valor cero indica que no hay informacionconsultable, como es el caso de numeros de series para dispositivos como tecla-dos y mouse.

La funcion construida con la cual se puede acceder a este descriptor es:

Get_DescriptorDevice(BYTE adress);

El parametro adress indica la direccion del dispositivo. Esta funcion tiene laventaja de mostrar los descriptores no solo para aquellos dispositivos que seestan conectando por primera, sino tambien, para los dispositivos que ya hansido configurados. La funcion Get DescriptorDevice(), al igual que las otras fun-ciones que se construyeron para solicitar a los descriptores, retornan los valoresen estructuras de datos con los mismos nombres del descriptor original. Porejemplo la funcion Get DescriptorDevice() retorna los valores en la siguiente

56

CAPITULO 3. PETICIONES, DESCRIPTORES Y CONFIGURACION GENERAL

estructura1:

struct Device_Struct

unsigned char bLength;

unsigned char bDescriptorType;

unsigned int bcdUSB;

unsigned char bDeviceClass;

unsigned char bDeviceSubClass;

unsigned char bDeviceProtocol;

unsigned char bMaxPacketSize0;

unsigned int idVendor;

unsigned int idProduct;

unsigned int bcdDevice;

unsigned char iManufacturer;

unsigned char iProduct;

unsigned char iSerialNumber;

unsigned char bNumConfigurations;

Device_Descriptor;

Por medio de la herramienta watch del programa IAR embedded se pueden vi-sualizar las estructuras. Las estructuras definidas para los cuatro descriptores son:Device Descriptor, Config Descriptor, Interface Descriptor y Endpoint Descriptor.La figura 3.2 muestra las estructuras ingresadas en la herramienta watch.

Figura 3.2: Estructura de los descriptores para la herramienta watch.

La figura 3.3 muestra los datos obtenidos al solicitar la funcion Get DescriptorDevice()cuando se conecta un teclado USB al controlador SL811HS.

1El resto de las funciones para los descriptores retornan en estructuras similares cambiando los nombresde los campos y el nombre de la estructura.

57

CAPITULO 3. PETICIONES, DESCRIPTORES Y CONFIGURACION GENERAL

Figura 3.3: Device Descriptor al conectar un teclado USB.

3.2.3. Configuration Descriptor

El formato del Configuration Descriptor corresponde al mostrado en cuadro 3.3.

Campo Tamano Descripcion EjemplobLength 1 largo de este descriptor en bytes 0x09bDescriptorType 1 constante CONFIGURATION(02h) 0x02wTotalLength 2 largo real 0x0022bNumInterfaces 1 numero de interfaces 0x01bConfigurationValue 1 identificador de la configuracion 0x01iConfiguration 1 ındice del string configuracion 0x00bmAttributes 1 alimentacion propia o remota 0xA0MaxPower 1 corriente requerida 0x32

Cuadro 3.3: Configuration Descriptor.

El campo wTotalLength (tercer campo) indica el largo total del actual descrip-tor, agregando ademas, la suma de todo el resto de los descriptores que quedan porconsultar: cuando se accede a este descriptor, uno de los parametros que se fijanes indicar el largo del Descriptor (corresponde al valor 0x09, primer campo). Sinembargo, la manera de acceder a los demas descriptores que quedan por consultares a traves del mismo formato del descriptor (codigo original de la funcion), perocambiando el parametro que indica el largo de retorno de los datos. De esta manerael dispositivo devuelve al host todo el resto de los descriptores, incluyendo algunosdescriptores de clase. El maximo retorno de datos es de 255 bytes. Poner un valordiferente al establecido al wTotalLength hace que el dispositivo no reconozca el co-mando y retorne un Stall.

bmAttributes y MaxPower son campos que describen las necesidades de energıadel dispositivo. Si el bit6 del campo bmAttributes es 1, este indicara que el dispositivo

58

CAPITULO 3. PETICIONES, DESCRIPTORES Y CONFIGURACION GENERAL

es auto-alimentado, de lo contrario, un valor 0 indicara que es el Bus quien alimentaal dispositivo. Por su parte el campo MaxPower indica la corriente necesaria parael dispositivo, para ello se multiplica el valor del campo por 2 y el resultado sera enmiliamperes.

La funcion construida con la cual se puede acceder a este descriptor es mostradoa continuacion:

Get_DescriptorConfig(BYTE adress);

La figura 3.4 muestra los datos obtenidos por medio de la herramienta watchpara el Configuration Descriptor. En este caso los datos obtenidos corresponden a unmouse.

Figura 3.4: Configuration Descriptor de un mouse.

3.2.4. Interface Descriptor

El formato del Interface Descriptor corresponde al mostrado en el cuadro 3.4.El campo bInterfaceClass define la clase y corresponde al dato mas importante detodos los descriptores. Una clase se emplea para especificar la manera en que unainterfaz se comunica con el host, tanto a nivel de datos como a nivel de control,entregando informacion sobre la funcionalidad del interfaz. Las distintas clases es-tandarizadas por USB-IF hacen que la gran mayorıa de los fabricantes de dispositivosUSB trabajen con ellas, pues de lo contrario deberan desarrollar sus propios drivers.Otra ventaja de las clases es que se asegura que el host reconocera y manejara sinningun tipo de problemas al dispositivo. Tambien existen los dispositivos compuestos

59

CAPITULO 3. PETICIONES, DESCRIPTORES Y CONFIGURACION GENERAL

que usan multiples clases, por ejemplo un telefono tiene la clase HID (human inter-face device), la clase audio y clase de telefonıa. Los valores para bInterfaceClass ysus respectivas clases estan en el cuadro 3.5.

Campo Tamano Descripcion EjemplobLength 1 tamano del descriptor en bytes 0x09bDescriptorType 1 constante INTERFACE(04h) 0x04bInterfaceNumber 1 valor para fijar la interface 0x00bAlternateSetting 1 valor para consultar sentencias alternativas 0x00bNumEndpoints 1 numeros de endpoints para la interfaz 0x02bInterfaceClass 1 codigo de la clase 0x03bInterfaceSubClass 1 codigo de la subclase 0x00bInterfaceProtocol 1 codigo del protocolo 0x00iInterface 1 index del string de la interface 0x00

Cuadro 3.4: Interface Descriptor.

Class Device bInterfaceClassAudio 0x01CDC-Control 0x02Human Interface 0x03Physical 0x05Image 0x06Printer 0x07Mass-Storage 0x08HUB 0x09CDC-Data 0x0AChip/Smart Card 0x0BContent-Security 0x0DVideo 0x0EDiagnostic Device 0xDCWireless Controller 0xE0Application-Specific 0xFEVendor-Specific 0xFF

Cuadro 3.5: Clases USB.

El sistema operativo Windows utiliza las clases para mostrar en la barra de inicioel grupo de dispositivo que se ha conectado. En la figura 3.5 se puede observar queWindows esta reconociendo y configurando la clase llamada Human Interface Device(dispositivo de interfaz humana), que corresponde a los dispositivos como tecladosy mouse. En la presente memoria se trabajaron con las clases de interfaz humana(0x03) y de almacenamiento masivo (0x08).

60

CAPITULO 3. PETICIONES, DESCRIPTORES Y CONFIGURACION GENERAL

Figura 3.5: Mensaje de Windows para un dispositivo USB.

Los valores de lo campos para bInterfaceSubClass y bInterfaceProtocol de-penden de cada clase. Por ejemplo en la clase de interfaz humana especifica si eldispositivo es un mouse o teclado.

La funcion construida con la cual se puede acceder a este descriptor es la siguiente:

Get_DescriptorInterf(BYTE adress);

La figura 3.6 muestra los datos obtenidos por medio de la herramienta watch delIAR embedded. En este caso corresponde a un mouse conectado al puerto USB delSL811HS.

Figura 3.6: Interface Descriptor para un mouse.

61

CAPITULO 3. PETICIONES, DESCRIPTORES Y CONFIGURACION GENERAL

3.2.5. Endpoint Descriptor

El formato del Endpoint Configuration corresponde al mostrado en el cuadro 3.6.

Campo Tamano Descripcion EjemplobLength 1 tamano del descriptor en bytes 0x07bDescriptorType 1 constante ENDPOINT(05h) 0x05bEndpointAddress 1 direccion de la transferencia 0x82bmAttributes 1 tipo de transferencia 0x03wMaxPacketSize 2 maximo tamano de paquete 0x0040bInterval 1 tiempo de consulta para la transferencia 0x03

Cuadro 3.6: Endpoint Descriptor.

El campo bmAttributes indica el tipo de transferencia en los bit 1..0, el restode los bit son reservados. Si el valor es 00 indica que es del tipo Control, 01Isochronous, 10 Bulk y 11 del tipo Interrupt.

El campo bEndpointAddress indica la direccion del endpoint. El ultimo bitindica el sentido que tiene el endpoint (IN o OUT). Por ejemplo el endpoint 0x02equivaldrıa a un endpoint con la direccion 0x02 tipo OUT y 0x82 equivaldrıa aun endpoint con la direccion 0x02 pero tipo IN.

bInterval es el tiempo medido en frames que indica el perıodo maximo en quese debe consultar por las interrupciones. Es obligacion del host consultar porlas interrupciones.

La funcion construida con la cual se puede acceder a este descriptor es mostradoa continuacion:

Get_DescriptorEndpoint(BYTE adress);

La figura 3.7 muestra los datos obtenidos (dos endpoint) para Get DescriptorEndpointal conectar una impresora1 EPSON C60 al puerto USB del host SL811HS.

1Los datos de una impresora a otra son variables, pero siempre son los mismos para un mismo dispositivo.

62

CAPITULO 3. PETICIONES, DESCRIPTORES Y CONFIGURACION GENERAL

Figura 3.7: Endpoint Descriptor para una impresora.

3.2.6. String Descriptor

Un String Descriptor es una peticion opcional de implementar por los fabricantes.Lo que entrega esta peticion es un texto UNICODE1 sobre configuraciones, fabrica,producto, numero de serie, interfaces, etc. Muchas veces se pueden encontrar textosvacıos a la hora de consultar por estas descripciones, como los casos de los mouse yteclados, ya que por la gran cantidad de productos emitidos no se declaran por ejem-plo numeros de series. Sin embargo, tiene mas sentido declarar numeros de series endispositivos de mayores costos como los pendrives o modems. Un numero de seriepuede a veces resolver problemas de conflictos con equipos o simplemente cargar masrapido un driver, ya que las series de una fabrica son unicas.

La figura 3.8 muestra un mensaje que emite el sistema operativo WindowsXPcuando se conecta un mouse de marca Genius modelo NetScroll. Este mensaje no sevuelve a mostrar si el mouse es colocado en el mismo puerto del computador, perosı se muestra un mensaje sobre la clase de dispositivo que se encontro (figura 3.5).

Figura 3.8: Mensaje de Windows XP para el nombre del producto.

El mensaje mostrado por Windows de la figura 3.8 se realiza consultando conel String Descriptor. Para ello se ingresa como parametro de entrada el valor delcampo del iProduct que entrega el Device Descriptor. Todos los campos que son del

1El texto por defecto es UNICODE pero es configurable a otros tipos de textos.

63

CAPITULO 3. PETICIONES, DESCRIPTORES Y CONFIGURACION GENERAL

tipo index son los campos que comienzan con la letra i1. Si el valor del index es dis-tinto de cero significa que trae informacion consultable a traves del String Descriptor.

Para consultar el String Descriptor en el controlador SL811HS, se realiza con lasiguiente funcion:

Get_DescriptorString(BYTE adress, BYTE index, char *ptr);

El parametro adress indica la direccion del dispositivo, por su parte index especi-fica lo que se va a consultar. A diferencia de los demas descriptores, este descriptorno tiene una estructura fija, es decir, no tiene un tamano unico pues los datos queentregan los dispositivos es variable desde 0 a 255 bytes.

Codigo de ejemplo:

char temp[255];

Get_DescriptorString(0x01,Device_Descriptor.iProduct, temp);

En el codigo de ejemplo se puede observar que se esta consultando por el nombredel producto del dispositivo. El dispositivo esta conectado en la direccion 1 del con-trolador. El resultado obtenido es puesto en temp y es mostrado en la figura 3.9.

Figura 3.9: Nombre del producto de un dispositivo usando el SL811HS.

El resultado obtenido corresponde al mismo que muestra Windows en su barrade inicio (Netscroll).

3.2.7. Construccion de las peticiones

Las peticiones van en un paquete de 8 bytes denominado Setup Packet. Es el hostel encargado de entregar este paquete al dispositivo. El Setup Packet a su vez se

1Los campos tipo id no son validos.

64

CAPITULO 3. PETICIONES, DESCRIPTORES Y CONFIGURACION GENERAL

compone de 5 campos tal como se muestra en el cuadro 3.7. Cada uno de los camposes de tamano de 1 o 2 bytes, donde algunos son configuraciones bit a bit. Los valoresde los campos del Setup Packet son siempre fijos para cada una de las peticionesestandar establecido por USB-IF en el capıtulo 9 del protocolo USB.

Posicion Nombre Bytes Descripcion0 bmRequestType 1 fija la direccion de la transferencia1 bRequest 1 valores de 0 a 12, segun se la peticion.2 wValue 2 varıa segun la peticion4 wIndex 2 varıa segun la peticion6 wLength 2 cantidad de bytes a transferir

Cuadro 3.7: Campos del Setup Packet.

Se construyo una funcion que enviara el Setup Packet y retornara los resultadosen un puntero. La funcion construida se muestra a continuacion:

int Request(BYTE bmRequestType,

BYTE bRequest,

WORD wValue,

WORD wIndex,

WORD wLength,

BYTE adress,

char *ptr

)

La funcion Request() es la base de la construccion de las peticiones que se hanexpuesto en este capıtulo. En ella se le ingresan los cinco campos del Setup Packeten conjunto con la direccion del dispositivo. La funcion retorna el valor “1” cuandola peticion que se solicito existe, de lo contrario, retorna el valor “0”. La funcionRequest() permite experimentar con los valores cuando los documentos oficiales pro-porcionado por USB-IF no son claros para el relleno del Setup Packet. Los documen-tos de clases entregan los valores de los campos de una forma mas precisa para laspeticiones de clases. En el Apendice D se encuentran los detalles de la construccionde la funcion Request(), para ası construir nuevas peticiones.

3.3. Configuracion de un dispositivo cualquiera

Como se dijo al principio de este capıtulo, la configuracion de cualquier dispositivo USBes por medio de una serie de pasos llamado Bus enumeracion. Los pasos para el SL811HSson los siguientes:

65

CAPITULO 3. PETICIONES, DESCRIPTORES Y CONFIGURACION GENERAL

Deteccion de Velocidad

Get Descriptor (Device)

Get Descriptor (Configuracion)

Get Descriptor (Interface)

Get Descriptor (Endpoint)

Set Adress

Set Configuration

Get Configuration

El primer paso corresponde a la deteccion de la velocidad del dispositivo, y es realizadopor el host (SL811HS ) sin hacer ningun tipo de comunicacion directa con el dispositivo,pues es un juego de las senales en conjunto con el manejo de los registros de configuracion.El resto de los pasos son descriptores y peticiones que necesitan una comunicacion deltipo Control y fueron analizados anteriormente. Entre cada paso que se realiza en el BusEnumeracion, hay tomas de decisiones entre los descriptores a traves de las estructurasde los campos, esto lleva a la dependencia de los resultados. Es por eso que esta serie depasos tienen un orden que hay que respetar. No es solo para el caso del host controladorSL811HS, sino tambien, para todos los sistemas operativos que manejan USB. El sistemaoperativo Windows al realizar la Bus Enumeracion agrega la peticion del tipo string parautilizar el nombre del equipo y ası mostrar al usuario lo que se esta configurando en esemomento.

Se desarrollo una funcion estricta y segura para la realizacion de la Bus Enumeracion. Lafuncion que reune a todos los pasos y carga los descriptores es la funcion Bus Enumeracion().El codigo es mostrado a continuacion:

int Bus_Enumeracion(BYTE direccion)1

2

if( detectar_velocidad() ==0) //si no hay dispositivo conectado retorna3

return 0;4

else5

6

//solo si hay algun dispositivo conectado.7

Get_DescriptorDevice(0x00);8

Get_DescriptorConfig(0x00);9

Get_DescriptorInterf(0x00);10

Get_DescriptorEndpoint(0x0);11

Set_Adress(direccion);12

Set_Configuration(direccion,Config_Descriptor.bConfigurationValue);13

14

//comprobacion del dispositivo configurado15

if (Get_Configuration(direccion) == Config_Descriptor.bConfigurationValue)16

17

SEND_CMD(LINE2);18

66

CAPITULO 3. PETICIONES, DESCRIPTORES Y CONFIGURACION GENERAL

printf("Disp. Configurado");19

return 1; // exito20

21

else22

23

SEND_CMD(LINE2);24

printf("Disp. No Configurado");25

return 0;26

27

28

29

En caso de no detectar un dispositivo o no comprobar el estado de la configuracion, lafuncion Bus Enumeracion() retorna un “0” y en caso de exito la funcion retorna el valor “1”.

Con la presencia de un hub, los pasos nombrados anteriormente tambien cumplen con elobjetivo de asignarle una direccion, ya que el hub es un dispositivo USB como otro mas. Ladiferencia radica en que una vez que el hub termina de ser configurado, se deben construirnuevas peticiones definidas especialmente para el hub, las cuales se pueden construir con lafuncion Request(). Estas nuevas peticiones sirven para el control y monitoreo de los puertos.

Con la construccion de las peticiones y la funcion Bus Enumeracion(), la parte princi-pal del programa solamente tendrıa unos pocos pasos para la configuracion inicial de undispositivo. El codigo siguiente muestra como serıa la configuracion de un equipo USB.

#include <stdio.h> /* For printf(). */1

#include <msp430x16x.h>2

#include "LCD_4.inc"3

#include "minhost.c"4

#include "peticiones.c"5

6

/*-----------------------------------------------------------------------------------*/7

int main(void)8

9

Init_Osc_X2();10

Init_LCD();11

Delayx100us(5000);12

USB_init(); //inicializacion del SL811HS13

Delayx100us(5000);14

15

Bus_Enumeracion(0x01); //bus enumeracion direccion 1.16

17

Se debe subrayar que algunos dispositivos como los de almacenamiento masivo que traenincorporado reproductores de mp3 y otras funciones (display y radio), pueden afectar detal manera que no se configure el dispositivo. Esto porque algunos de ellos se enciendende forma mas lenta que otros, causando que las peticiones no respondan. Las peticionesson validas en un cierto tiempo que el host tolera. Sobrepasar ese tiempo involucra que laspeticiones se pierdan y el host responda con un timeout. La colocacion de tiempos grandesantes de hacer las peticiones evita problemas de esa indole. La figura 3.10 muestra como

67

CAPITULO 3. PETICIONES, DESCRIPTORES Y CONFIGURACION GENERAL

se vera la pantalla luego de realizar un bus enumeracion en el SL811HS de forma exitosa1.

Figura 3.10: Visualizacion de la pantalla despues de usar Bus Enumeracion.

3.4. Programas para los descriptores

Unas de la maneras de comprobar los descriptores es por medio de programas especiali-zados. Los programas para diseno USB pueden ser herramientas muy utiles en el principiodel diseno de drivers, pues se debe estar seguro que los descriptores obtenidos son los co-rrectos y ası descartar algun tipo de error en la construccion de ellos. Poner datos erroneosen los drivers, ya sea como el asignar una direccion de un endpoint no valido, lleva a quelos dispositivos nunca realicen sus funciones.

3.4.1. USBview

Hay muchos programas que muestran de manera didactica los descriptores, pero en sumayorıa son limitados hasta que no se pague por el precio del programa. Sin embargo, elprograma mas simple, liviano y gratis es el que en un principio dispuso USB-IF en su paginaoficial www.usb.org llamado USBview (figura 3.11). Sin embargo, actualmente el programase encuentra no disponible en su web. En la presente memoria se incluye USBview para suutilizacion.

En un principio, el programa USBview muestra todos los Root Hub que se encuentraen el computador. Para un optimo resultado se debe tener marcada las opciones mostradasen la figura 3.11. De esta manera el detalle de los descriptores sera mejor. La figura 3.14muestra el listado de los descriptores utilizando USBview.

1La implementacion de la pantalla no es requisito para utilizar las peticiones, solo bastara con desactivarlas funciones printf().

68

CAPITULO 3. PETICIONES, DESCRIPTORES Y CONFIGURACION GENERAL

Figura 3.11: USBview mostrando los dispositivos conectados.

Figura 3.12: USBview mostrando los descriptores.

3.4.2. USBCommandVerifer

Otro programa de uso libre que dispone USB-IF es USBCommandVerifer (figura 3.13).El programa tiene varias herramientas donde la mas importante es verificar que las peti-ciones que estan estipuladas en el capıtulo 9 del protocolo USB estan bien establecidas enel dispositivo y pueden ser solicitadas. Tambien tiene otras funciones como por ejemplo:verificar si un dispositivo USB 2.0 puede funcionar en un host USB 1.1, test para disposi-tivos de interfaz humana y test para Hub.

69

CAPITULO 3. PETICIONES, DESCRIPTORES Y CONFIGURACION GENERAL

Figura 3.13: USBcommandVerifer.

3.4.3. Hardware

Existe Hardware especializado de gran costo que sirve para monitorear el trafico USB(sniffer). La ventaja de estos instrumentos es que pueden capturar todo el trafico incluyen-do cuando se produce la enumeracion del bus, cosa que los programas en su mayorıa nopueden hacer. La captura de datos puede facilitar la construccion de funciones y driversespecializados como tambien facilitar el aprendizaje del protocolo USB. Uno de los hard-ware mas usado por su menor costo es Usbviewer1 cuyo valor es cercano a los US$1000.

Figura 3.14: Conexion de un sniffer para la captura de datos.

1El producto se puede ubicar en la pagina Web: www.usbdeveloper.com.

70

Capıtulo 4

Dispositivos de interfaz humana

Este capıtulo describe al grupo de dispositivos que pertenece a la clase de interfaz hu-mana, detallando la comunicacion y su forma de entregar los datos al host. Se explican losdescriptores standard y especiales para esta clase, mostrando ejemplos reales de dispositivosencuestados. Se establece como se debe reconocer los dispositivos de esta clase y cuales sonlos pasos a seguir para su eventual configuracion. Finalmente se muestra una aplicacioncon los dispositivos HID.

4.1. HID

Human Interface Device (HID) es la clase de dispositivo mas popular entre los usua-rios de computadores. La razon radica en que esta clase define y clasifica principalmentea dispositivos que son utilizados en una forma directa por las personas, con el objetivo deinteractuar y dar ordenes al computador. Tambien otro factor que ha influido en la masifi-cacion de los productos, es su bajo costo de elaboracion. Por su parte, el sistema operativoWindows fue el pionero (1995) en incorporar los drivers para el soporte USB-HID, a travesde su sistema operativo Windows95b.

4.2. Tipos de dispositivos

Estos dispositivos en su mayorıa funcionan al tacto, movimientos, presiones y fuerzas,lo que hace que casi siempre depende de las ordenes del usuario, sin embargo esta claseincorpora en una gran mayorıa a los dispositivos de baja velocidad de transmision (low-speed), donde es comun encontrar dispositivos que no necesariamente interactuan de unaforma directa con las personas como se dijo inicialmente, sino mas bien, son dispositivosque cuya mision es informar como es el caso de los lectores de codigo de barra.

Los dispositivos de interfaz humana que necesitan estar en tiempo real, donde tienenrequisitos como estar en una constante retroalimentacion de datos con el host, son clasi-ficados en otra clase llamada PID (Physical Interface Device) como es el caso de algunos

71

CAPITULO 4. DISPOSITIVOS DE INTERFAZ HUMANA

controles de juego avanzados que no pertenecen a la clase HID. Tambien es el caso de dispo-sitivos como camaras Webs o camaras fotograficas que suelen confundirse con dispositivosde clase HID, ellos pertenecen a la clase llamada imagen class.

Los ejemplos mas tıpicos de la clase HID son:

Teclados, apuntadores, mouses, joysticks y trackballs.

Paneles de controles tales como: tabletas graficas, sliders, botones, controles remotos,pedales.

Algunos dispositivos de audio como: telefonos, microfonos o altavoces digitales, etc.

Dispositivos que no requieren de una intervencion humana pero comparten la mismaclase como por ejemplo: lectores de codigos de barras, voltımetros, termometros, lin-ternas, ventiladores, etc.

En la clase HID es considerable destacar que dada su versatilidad, un dispositivo com-puesto puede llevar incluido en su composicion fısica un dispositivo de clase HID. Es elcaso de los telefonos que perteneciendo a la clase de audio, tienen incorporado parte de unainterfaz humana en los botones u otras funcionalidades anadidas al telefono.

4.3. Pipes de la Clase HID

La clase HID solo se puede comunicar a traves dos pipes, tal como lo muestra la figura4.1.

Figura 4.1: Pipes de la clase HID.

La primera comunicacion por defecto y ademas de caracter obligatorio de tener porparte de los dispositivos de clase HID, es la pipe de Control. Esta pipe, como se dis-cutio en el primer capıtulo, es bi-direccional y corresponde al endpoint-0. Se utilizabasicamente para recibir y responder las peticiones de configuracion del dispositivoUSB-HID. De esta manera, se intercambian en una etapa inicial los datos necesariospara el reconocimiento del dispositivo, usando los Descriptores y Peticiones Standard.

72

CAPITULO 4. DISPOSITIVOS DE INTERFAZ HUMANA

El otro tipo de comunicacion que se encuentra, corresponde a la pipe del tipo Inte-rrupt. Esta atiende, por medio de su endpoint, la recepcion y envıo asıncrona de losdatos.

En el caso de la comunicacion de la clase HID se tiene la particularidad que en lamayorıa de los dispositivos el flujo de datos se hace en una sola direccion (IN), dondepracticamente es muy difıcil encontrar dispositivos que tengan incorporado un endpointInterrupt del tipo OUT. Esto es porque en la clase HID el endpoint OUT es totalmenteopcional. El cuadro 4.1 muestra un resumen de la comunicacion en la clase HID.

Pipe Descripcion RequeridoControl USB control, peticiones, descriptores siInterrupt In datos de entrada, esto es desde el device al host siInterrupt Out datos de salida, esto es desde el host al device opcional

Cuadro 4.1: Resumen de la comunicacion HID.

4.4. Identificacion

Para la identificacion de la clase HID y especificar el dispositivo que se encuentraconectado al controlador, se realiza la comprobacion de los siguiente tres campos: bInter-faceClass, bInterfaceSubClass, bInterfaceProtocol. Estos campos definen la clase,subclase y protocolo respectivamente. Los tres campos pertenecen a la peticion InterfaceDescriptor.

4.4.1. Clases

La especificacion USB define a la clase HID con el valor 0x03 para el campo bIn-terfaceClass, de esta manera todos los dispositivos que cumplan con las caracterısticas yconfiguraciones de la clase HID deberan tener el valor mencionado para el campo.

4.4.2. Subclases

El cuadro 4.2 muestra los valores posibles para el campo bInterfaceSubClass. El valor1 para la subclase define la capacidad de los dispositivos para funcionar en el arranquey Bios, de lo contrario el valor para el campo bInterfaceSubClass es de 0. Hoy en dıa lamayorıa de los teclados USB tienen soporte para BIOS, pero no es ası para los dispositivoscomo mouse y joystick.

73

CAPITULO 4. DISPOSITIVOS DE INTERFAZ HUMANA

bInterfaceSubClass Descripcion0 sin subclase1 boot interface2-255 reservado

Cuadro 4.2: Codigos de Subclases.

4.4.3. Protocolos

El valor del campo (bInterfaceProtocol) pueden llevar tres valores y es mostrado enel cuadro 4.3. Los valores definen finalmente si el dispositivo es un mouse o teclado. Esimportante resaltar que USB-IF no define valores de protocolos para otros productos po-pulares como es el joystick. La razon de ello radica en que cada fabricante de productosHID, en donde no tienen un comportamiento standard (como el joystick), definen a travesde una tabla llamada Report las caracterısticas del dispositivo como por ejemplo: numerosde botones, movimientos, fuerzas ejercidas, etc. No es el caso de los teclados y mouses queposeen un funcionamiento con un numero de botones fijos.

bInterfaceProtocol Descripcion0 especıfico1 teclado2 mouse3-255 reservado

Cuadro 4.3: Codigos de protocolos.

En resumen, para la identificacion de un dispositivo HID se debe consultar por la fun-cion Get DescriptorInterf() que llama a la peticion solicitando los los descriptores del tipoInterface. Cuando se solicita la funcion Bus Enumeracion() se cargaran automaticamentetodos los descriptores y no sera necesario ejecutar la funcion Get DescriptorInterf(). Laestructura donde se guardan los datos de la Interface es Interface Descriptor.1

4.5. Descriptores de clase

Como se muestra en la figura 4.2, en los dispositivos de clase HID se encuentran losdescriptores Standard y descriptores del tipo String discutido ampliamente en el capıtulo3. Tambien se encuentran los descriptores de clase HID que son unicamente de esta clase.Los descriptores de clase son: HID Descriptor, Report Descriptor y Physical Descriptor, loscuales estan dentro del descriptor Interface.

Si bien es importante saber el detalle y funcionamiento de cada descriptor de la claseHID, la informacion que entrega cada uno de los descriptores de clase, no influye en la

1Para mayor detalles se puede consultar en la presente memoria por el capıtulo 3, seccion de descriptores.

74

CAPITULO 4. DISPOSITIVOS DE INTERFAZ HUMANA

Figura 4.2: Descriptores de la clase HID.

configuracion general de un dispositivo de clase HID tales como teclados y mouse. Sin em-bargo, para dispositivos desconocidos para el host (dispositivo especial) y que forman partede esta clase (HID), la informacion entregada por los descriptores es de gran importanciapara el fruncimiento.

4.5.1. HID Descriptor

La estructura de HID Descriptor se muestra en el cuadro 4.4:

Campo Tamano Descripcion Ejemplo

bLength 1 tamano del descriptor en bytes 0x0B o 0x09

bDescriptorType 1 constante HID 0x21

bcdHID 2 especificacion de la clase 0x0110

bCountryCode 1 numero que especifica el paıs 0x00

bNumDescriptors 1 numero de descriptores de la clase 0x02

bDescriptorType2 1 codigo del primer descriptor 0x22

wItemLength2 2 largo del descriptor 0x0040

bDescriptorType3 1 codigo del tercer descriptor 0x00

wItemLength3 2 largo del tercer descriptor 0x0000

Cuadro 4.4: Estructura del HID Descriptor.

HID Descriptor es una estructura fija que puede ser de 9 o 11 campos, donde su codigode identificacion es 0x21 (bDescriptorType). HID Descriptor es la cabecera de los demas

75

CAPITULO 4. DISPOSITIVOS DE INTERFAZ HUMANA

descriptores de la clase, donde la funcion principal es informar la existencia o no de los otrosdos descriptores de la clase. Como se dijo en el capıtulo anterior, cuando se solicita unapeticion y no concuerda el largo exacto del descriptor que se esta solicitando, se produceun error de comando. Es por eso que el HID Descriptor junto con entregar la existencia ono de los descriptores, entrega ademas, el largo exacto de los otros dos descriptores, puescomo se vera mas adelante, los otros dos descriptores de la clase son estructuras no fijas yvarıan de un dispositivo a otro. El tercer descriptor (bDescriptorType3 ) puede tener el valorcero, indicando que no existe el descriptor. Los codigos para identificar los descriptores semuestra en el cuadro 4.5.

bDescriptorType Clase Descriptor0x21 HID0x22 Report0x23 Physical Descriptor0x24 Reservado

Cuadro 4.5: Descriptores especiales para la clase HID.

Para solicitar el HID Descriptor se construyo la funcion Get DescriptorHID() utilizan-do la funcion base Request() que permite enviar el Setup Packet.

Un resultado obtenido al ejecutar la funcion Get DescriptorHID() conectando un mousegenerico al puerto SL811HS se muestra en la figura 4.3:

Figura 4.3: HID Descriptor.

Se observa en la figura 4.3 que solo existe un descriptor adicional (0x22), el cual corres-ponde al descriptor llamado Report Descriptor. Por otro lado, el valor del campo bcdHIDindica la version de la clase USB del dispositivo. El valor corresponde justamente a la ulti-ma version que es HID 1.1.

76

CAPITULO 4. DISPOSITIVOS DE INTERFAZ HUMANA

4.5.2. Report Descriptor

Report Descriptor entrega una tabla que describe cada pieza del dispositivo que generadatos. Por ejemplo un Report Descriptor define items en un mouse como la posicion ybotones, a su vez determina cuanto esfuerzo hay que aplicar para que el dispositivo generelos datos mınimos y maximos. Debido a esto, la estructura del Report Descriptor es variabley lleva a realizar una funcion en donde la captura de los reportes sea en un arreglo temporal.

La funcion que solicita el Report Descriptor es la siguiente:

int Get_DescriptorReport(BYTE adress, char *ptr)

La peticion se realiza en forma directa a traves de la funcion Request(), pero previamentese solicita el HID Descriptor de manera de asegurar que los campos del HID Descriptor secarguen y ası funcione correctamente el Report Descriptor.

La figura 4.4 muestra los datos obtenidos de un mouse generico. La interpretacionse debe realizar leyendo cada 1, 2 o 3 bytes, donde existe un significado para cada caso.Por ejemplo el primer par de bytes mostrando en la figura 4.4 es 0501 y su significado esindicar que el dispositivo es de un formato conocido (generico). Para el segundo par (0902)su significado es indicar que el dispositivo generico es un mouse. La interpretacion de cadavalor es bastante extensa, pero para los dispositivos conocidos mayormente no influye. Paralos valores de los reportes se puede consultar los documentos oficiales “Device Class Defi-nition for Human Interface Devices (HID 1.1)” y “HID Usage Tables 1.12”, descargablesde la pagina www.usb.org. En los documentos se pueden encontrar tablas genericas paralos dispositivos mas usados de la clase HID.

Figura 4.4: Tabla de reportes.

77

CAPITULO 4. DISPOSITIVOS DE INTERFAZ HUMANA

Los reportes resultan algo engorroso de utilizar para los que realizan dispositivos es-pecıficos de la clase HID. Sin embargo, se disponen de herramientas que facilitan la cons-truccion de las tablas de reportes. Una herramienta muy utilizada es HID descriptor Tool,donde de una manera mas facil se van agregando botones, movimientos, rangos, etc., y deesta manera se va llenando automaticamente la tabla de reportes. La figura 4.5 muestra laherramienta nombrada anteriormente, en donde se configura la tabla de reportes para unmouse.

Figura 4.5: Software HID Descriptor Tool.

4.5.3. Physical Descriptor

Es un descriptor opcional el cual provee informacion sobre que parte del cuerpo humanoes usado para activar los controles. Al igual que en el caso anterior se pueden consultar porlas tablas entregadas por USB-IF en los mismos documentos, pero su implementacion noes vital para el funcionamiento de dispositivos standard o desconocidos. La funcion paraacceder al Physical Descriptor se muestra a continuacion:

int Get_DescriptorPhysical(unsigned int adress, char *ptr)

En los diferentes dispositivos de clase HID que se conectaron al controlador SL811HS, nose encontraron registro alguno del Physical Descriptor. Saber que parte del cuerpo humano

78

CAPITULO 4. DISPOSITIVOS DE INTERFAZ HUMANA

es la que controla al dispositivo, no influye en el funcionamiento general del dispositivo.

4.6. Recibimientos de los datos en un dispositivo HID

Los datos entregados por los dispositivos HID, como al apretar un boton o una tecla,son enviados a traves de los endpoint que especifica el fabricante del dispositivo. General-mente los dispositivos HID traen un solo endpoint del tipo Interrupt. La cantidad maximade datos que pueden enviar los dispositivos low-speed es de 8 bytes. Los teclados ocupan los8 bytes para transmitir los datos al host, en cambio el mouse solo ocupa 4 bytes. Por otraparte, es deber del host preguntar por las interrupciones generadas por los dispositivos, enel tiempo que lo estipula en campo bInterval del Endpoint Descriptor. Pasado ese tiempo,implicarıa que se perdieran los datos de las interrupciones siempre y cuando el usuarioproduzca una nueva interrupcion.

La funcion RecibirInt() permite preguntar si hay datos que el dispositivo desea en-viar (interrupcion de un dispositivo) y posteriormente recibir los datos del dispositivo.RecibirInt() funciona indistintamente de la cantidad de bytes que el dispositivo desea enviar,pues se usa un buffer de recepcion de 8 bytes (lınea 5 del codigo). La funcion RecibirInt()tiene 3 parametros de entradas: adress indica la direccion del dispositivo, endpointhidcorresponde al endpoint que va a trasmitir los datos y ptr el puntero que indicara la di-reccion de memoria para guardar los datos. Si no hay datos en el endpoint, la funcionRecibirInt() retorna el valor 0, por el contrario en caso de recibir datos la funcion retornael valor 1. El codigo de la funcion RecibirInt() se muestra a continuacion:

int RecibirInt(BYTE adress, char endpointhid, char *ptr) 1

BuffClear811(0x10,8); //borra basura del buffer2

wr811(FNADDR,adress); //direccion del dispositivo3

wr811(BUFADR,0x10) ; // inicio de los datos de llegada.4

wr811(BUFLEN,0x08) ; //en low mode, los paquetes son de 8 bytes5

wr811(PID_EP,IN_PID endpointhid); // paquetes tipo IN6

result=go(0x03); // enviar comando, DIREC=0(in), ENAB=1, ARM=17

if (result & 0x01) // ACK si se reciben datos8

9

BuffRead811(0x10, ptr, 8); // copia los datos llegados.10

return 1; //retorna indicado datos positivo11

12

else13

return 0; //no hay datos14

15

En el main() principal del programa, mostrado a continuacion de este parrafo, se mues-tra una rutina para configurar y preguntar por las interrupciones de los dispositivos declase HID. Desde la lınea 1 a 12 del codigo, es la parte en donde se inicializa el controladory se asigna una direccion al dispositivo USB (direccion numero 5). Las lıneas 14, 15 y 16rescatan en variables mas didacticas, los valores esenciales para el funcionamiento del dis-positivo, que corresponden a la clase, protocolo y endpoint del dispositivo. A continuacion,se verifica que la clase obtenida pertenece a clase HID (valor 0x03) y luego se ejecuta la

79

CAPITULO 4. DISPOSITIVOS DE INTERFAZ HUMANA

funcion RecibirInt(). En caso de haber datos, la rutina despliega un mensaje en la pantallaLCD, dependiendo si que el dispositivo que realizo la interrupcion fue un mouse o un tecla-do.

int main(void)1

2

char temp[8]; //temporal para recibir los datos, debe ser 8.3

BYTE clase, protocol, endInter, direccion;4

5

Init_Osc_X2();6

Init_LCD();7

Delayx100us(5000);8

USB_init();9

Delayx100us(5000);10

direccion=0x05; // direccion a asignar al dispositivo.11

Bus_Enumeracion(direccion); //bus enumeracion12

13

clase =Interface_Descriptor[0].bInterfaceClass ;14

protocol =Interface_Descriptor[0].bInterfaceProtocol;15

endInter =Endpoint_Descriptor[0].bEndpointAddress ;16

17

if (clase==0x03) //si es de clase HID.18

19

while(1)20

21

if ( RecibirInt(direccion,endInter,temp) ) //si hay datos 1.22

23

if(protocol==1) // si es teclado.24

printf("teclado interrupcion"); //funcion del usuario25

if(protocol==2) //si es mouse.26

printf("mouse interrupcion"); //funcion del usuario27

28

29

30

31

4.7. Configuracion de un Mouse

Son 4 bytes para representar los movimientos y botones de un mouse. El primer byte(byte0) sirve para representar a todos los botones del mouse, generando un valor unicopara cada boton, tal como se muestra en el cuadro 4.6. Para los casos en que se presionanbotones al mismo tiempo, el valor generado para el byte0 es la respectiva suma de losvalores de cada boton que se presiono. Por ejemplo al presionar al mismo tiempo el botonizquierdo (0x01) con el boton derecho (0x02), el valor para el byte0 es de 0x03.

Cuando se realiza un click en un boton, este genera dos interrupciones: la primera esproducida cuando el boton se presiona y es mantenido en la posicion, entregando el valorcorrespondiente al boton; la segunda interrupcion es producida al momento de soltar elboton, generando el valor 0x00 para el byte0.

80

CAPITULO 4. DISPOSITIVOS DE INTERFAZ HUMANA

Boton (Byte 0) Izquierdo Derecho MedioValor 0x01 0x02 0x04

Cuadro 4.6: Valores para los botones del mouse.

Para el movimiento del cursor, se usa un byte para cada eje de coordenadas: el byte1es para el eje-x, el byte2 para el eje-y y el byte3 representa al movimiento del roller quees utilizado para avanzar y retroceder paginas. Para diferenciar movimientos positivos ynegativos se divide cada byte en dos partes iguales (cuadro 4.7).

Movimiento x+ x - y+ y- roller+ roller-Byte 1 1 2 2 3 3Valor 1 a 127 255 a 129 255 a 129 1 a 127 1 a 127 255 a 129

Cuadro 4.7: Valores para el movimiento del mouse.

La velocidad del cursor es proporcional al valor que se reciba como dato en el byte, porejemplo movimientos muy lentos en el eje x+ significaran valores entre 1 a 10 en el byte1,de igual manera movimientos muy lentos en el eje x- significaran valores desde 255 a 240.Sin embargo, el movimiento del mouse puede pasar por todos los valores, ya que la accioncompleta para acceder a un objeto en la pantalla, pasa desde un movimiento inicial del tipobrusco, finalizando en un movimiento lento. Caso especial es el movimiento del roller, endonde en su mayorıa son movimientos del tipo lento, principalmente porque se requierenque los movimientos sean de esa manera y ademas porque el desplazamiento se realiza atraves de los dedos.

Se puede emular el movimiento del eje-x de un mouse utilizando una pantalla LCD de4 lıneas. Para ello se realizo una sencilla funcion llamada MouseX():

Codigo:

void MouseX(BYTE val)

if(val>=5 && val<=105)

SEND_CMD(Display_and_Cursor+Display_On+Cursor_On+Blink_On);

SEND_CMD(Set_Shift+Shift_Cursor+Right);

Delayx100us(2000);

if (val<=250 && val>=150 )

SEND_CMD(Display_and_Cursor+Display_On+Cursor_On+Blink_On);

SEND_CMD(Set_Shift+Shift_Cursor+Left);

Delayx100us(2000);

Delayx100us(1000);

81

CAPITULO 4. DISPOSITIVOS DE INTERFAZ HUMANA

En la rutina MouseX(), primero se fija los rangos en el cual se aceptan movimientos vali-dos para x- y x+, descartando valores pequenos y valores grandes. Cada vez que se entre enel rango establecido se activa el cursor y el parpadeo (Cursor On+Blink On) de manera devisualizar el movimiento en la pantalla. Luego se procede a realizar el corrimiento del cursorsegun sea el caso (Right o Left). Un movimiento simple y corto del mouse puede provocardecenas de interrupciones dependiendo del tiempo que destine el host para preguntar porlas interrupciones, pero por lo general puede provocar que el cursor se pierda en la pantallaLCD y no se logre seguir el cursor con la vista, principalmente porque la pantalla tiene 30caracteres por lınea, que equivaldrıan a 30 movimiento de cursor por lınea. El problemaanterior se soluciono introduciendo retardos de manera de perder algunas interrupcionespor tiempo y ası demorar el movimiento en la pantalla.

En el main() principal del programa, se debe pasar el valor que representa al movimien-to en el eje-x (byte1 o temp[1]) a la funcion mouseX(). El siguiente codigo ilustra la funcioncompleta.

int main(void)1

2

char temp[8]; //temporal para recibir los datos, debe ser 8.3

BYTE clase, protocol, endInter, direccion;4

5

Init_Osc_X2();6

Init_LCD();7

Delayx100us(5000);8

USB_init();9

Delayx100us(5000);10

direccion=0x05; // direccion a asignar al dispositivo.11

Bus_Enumeracion(direccion); //bus enumeracion12

13

clase =Interface_Descriptor[0].bInterfaceClass ;14

protocol =Interface_Descriptor[0].bInterfaceProtocol;15

endInter =Endpoint_Descriptor[0].bEndpointAddress ;16

17

if (clase==0x03) //si es de clase HID.18

19

while(1)20

21

if ( RecibirInt(direccion,endInter,temp) ) //si hay datos 1.22

23

if(protocol==1) // si es teclado.24

printf("teclado interrupcion");25

if(protocol==2) //si es un mouse.26

MouseX(temp[1]); //temp[1]=eje x.27

28

29

30

31

82

Capıtulo 5

Dispositivos de almacenamientomasivo

Este capıtulo describe la clase Mass Store Device, donde el principal objetivo de anali-sis son los dispositivos llamados pendrives. Ademas, se estudia y desarrolla el protocolo decomandos Bulk-Only que permite encapsular los comandos SCSI para ası realizar la lecturay escritura de archivos. Tambien se explica el sistema de estructura FAT16 que distribuyelas particiones y los archivos en memoria.

5.1. Mass Store Device

La clase Mass Store Device (MSD) corresponde a los dispositivos que tienen la capaci-dad de almacenar y transportar datos. Los dispositivos tıpicos que se pueden encontraren esta clase son: diskette, discos duros, CD-ROM, DVD y pendrives. Sin embargo, el dis-positivo que mas comunmente es usado por el usuario es el pendrive. En un principio lospendrives solo fueron disenados para que cumplieran la funcion de almacenar y transportardatos, teniendo la gran ventaja con respecto a los diskette: la velocidad y capacidad de al-macenamiento. Actualmente el mercado ofrece pendrives con incorporacion de radio, mp3,telefono y video, lo que ha hecho que la utilizacion de los pendrives reemplace en granmedida a los diskettes. Hoy en dıa, los nuevos computadores que salen al mercado estansuprimiendo el uso de las disketeras1, incorporando ranuras para conectar directamentememorias flash y pendrives.

Un pendrive basico, tal como se muestra en la figura 5.1, internamente se componede: varios chip de memoria flash, un controlador de memoria y un interfaz USB. Con estostres componentes los dispositivos emulan el comportamiento de un disco magnetico. Porsu parte, la memoria de datos de los pendrives se asocia a sectores de 512 bytes (bloques),leyendo y escribiendo datos unicamente de esta manera.

1Las nuevas placas madres, soportan que los pendrives tengan la capacidad de ser booteable o cargar unsistema operativo.

83

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

Figura 5.1: Estructura interna de los pendrives.

5.2. Reconocimiento de un dispositivo MSD

Los dispositivos de la clase MSD se identifican al igual que otros dispositivos USB, estoes a traves de los campos bInterfaceClass, bInterfaceSubClass y bInterfaceProtocol. Los trescampos mencionados pertenecen al Interface Descriptor1.

5.2.1. Clase

El campo bInterfaceClass devuelve el valor 0x08, lo cual aclara que el dispositivo es dela clase Mass Store Device.

5.2.2. Subclase

Codigo Juego de comandos Comentarios01h Reduced Block Commands (RBC).

T10 Project 1240-Dnormalmente utilizado por memorias Flashaunque cualquier dispositivo de almace-namiento masivo puede utilizarlo

02h SFF-8020i, MMC-2 normalmente utilizado por CD y DVD03h QIC-157 normalmente utilizado por unidades de cinta04h UFI normalmente usado por unidades de diskette05h SFF-8070i normalmente utilizado por disquete, aunque

tambien puede utilizar otra subclase (comoRBC)

06h SCSI-2 cualquier dispositivo de almacenamiento ma-sivo puede utilizar esta subclase

07h-FFh reservados para uso futuro

Cuadro 5.1: Codigo de subclase para Mass Store Device.

El campo bInterfaceSubClass entrega distintos valores para los dispositivos de la claseMSD (cuadro 5.1). Los distintos valores sirven para identificar el tipo de juego de coman-dos que soporta la interfaz. El cuadro 5.1 muestra los codigos y utilizacion para el campo

1Para mayor informacion sobre los descriptores, dirigirse al capıtulo 3.

84

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

subclase.

Los pendrives utilizan los juegos de comandos SCSI-2 que corresponde al valor 06hdel campo bInterfaceSubClass. Actualmente USB-IF esta intentando unificar todos los dis-positivos con los comandos UFI (Floppy Disk Unit), publicado en el documento oficial“Universal Serial Bus Mass Storage Class - UFI Command Specification1”. El documentosirve para consultar por los comandos SCSI-2 ya que UFI tienen como base a los comandosSCSI-2 y SFF-8070i.

5.2.3. Protocolo

El campo bInterfaceProtocol devuelve un valor para indicar la manera como se trans-porta el juego de comandos. Esto se refiere a como se emplean las transferencias en elprotocolo USB (Control, Bulk, Interrupt, Isochronous). Los valores son mostrados en lacuadro 5.2.

Codigo Protocolo de Transporte de comandos00h CBI con interrupcion de fin de comando01h CBI sin interrupcion de fin de comando50h Bulk-Only02-4Fh reservado51h-FFh reservado

Cuadro 5.2: Codigo de protocolo para Mass Store Device.

El protocolo de transporte de comandos CBI (Control, Bulk, Interrupt) fue el que enun principio se utilizo en los pendrives con capacidad de memoria no superior a 64MB.CBI utiliza tres endpoint para las transferencias de los comandos y datos, produciendoineficiencias en los dispositivos de gran tamano y capaces de soportar high-speed. El usode CBI para cualquier diseno de pendrives fue descartado y puesto por USB-IF en calidadde obsoleto. Hoy en dıa se utiliza el protocolo de transporte Bulk-Only que es mas simplepara la comunicacion, pues solo utiliza los endpoint del tipo Bulk.

En el cuadro 5.3 se muestra el Interface Descriptor de cuatro diferentes pendrives.Las diferencias entre los dispositivos son tanto en tamano, velocidad y modelo de fabrica.Los datos fueron obtenidos por medio de la funcion Bus Enumeracion()2 conectando losdispositivos al puerto USB del SL811HS. Como se observa en el cuadro 5.3 los valores delos campos no varıan de un modelo a otro. Ademas se observa que la cantidad de endpointde cada dispositivo es 2, ya que necesita un endpoint para datos de entrada y un endpointpara datos de salida.

1El documento se encuentra en el CD-ROM adjunto al trabajo, “Documentos/usborg/usbmass-ufi10.pdf”o en www.usb.org.

2La funcion Bus Enumeracion() carga todos los descriptores en sus respectivas estructuras, tal como losenala el capıtulo 3 de la presente memoria.

85

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

Campos Creative1GB

PackerBell256MB

Kingston256MB

I-storage128MB

numeros deinterfaces

0x00 0x00 0x00 0x00

alternativassentencias

0x00 0x00 0x00 0x00

numeros deendpoint

0x02 0x02 0x02 0x02

clase 0x08 0x08 0x08 0x08subclase 0x06 0x06 0x06 0x06protocolo 0x50 0x50 0x50 0x50interface 0x00 0x00 0x00 0x00

Cuadro 5.3: Interface Descriptor para distintos pendrives.

5.3. Peticiones de clase

El protocolo de transporte Bulk-Only define dos peticiones especıficas que deben sopor-tar los dispositivos de la clase MSD, estas son: Bulk-Only Mass Storage Reset y Get MaxLUN.

5.3.1. Bulk-Only Mass Storage Reset

El objetivo de la peticion es aplicar un reset al dispositivo MSD. Ası el dispositivo seprepara para recibir el juego de comandos que tiene especificado (SCSI-2 para los pen-drives). La peticion no retorna ningun dato.

La funcion para acceder a esta peticion es la siguiente:

MassStorageReset(BYTE adress, BYTE interface)

El parametro adress indica la direccion del dispositivo y el parametro interface co-rresponde al valor que entrega el campo bNumInterfaces (interface que se escogio para eldispositivo).

5.3.2. Get Max LUN

La peticion especial Get Max LUN se usa para determinar el numero de unidades logicassoportadas por el dispositivo. Es posible que un dispositivo pueda tener varias unidadeslogicas. Las unidades logicas del dispositivo son enumeradas contiguamente a partir de LUN0 hasta LUN 15 (Fh). Como se vera posteriormente, el host usa el comando encapsulado

86

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

bCBWLUN (Command Block Wrapper) para elegir a que unidad logica sera enviado elpaquete. Por lo general los pendrives solo tienen una unidad logica disponible.

Solicitando la peticion Get Max LUN el dispositivo devolvera un byte de datos con elmaximo LUN (unidades logicas) soportado. Por ejemplo, si el dispositivo soporta cuatroLUNs entonces el valor de retorno serıa 3. Si ningun LUN es asociado con el dispositivo,entonces el valor retornado sera 0 (1 particion). En caso que se envıe un paquete a unaunidad logica que no exista, el dispositivo respondera con un STALL.

La funcion construida para acceder a la peticion Get Max LUN es la siguiente:

GetMaxLUN(BYTE adress, BYTE interface)

5.4. Protocolo de transporte Bulk-Only

El protocolo Bulk-Only1 es el encargado de transportar los datos y estados de un dis-positivo de almacenamiento masivo cualquiera. Esto se hace exclusivamente a traves de lastransferencias tipo Bulk.

5.4.1. Transferencias

La figura 5.2 muestra el flujo de las transferencias de datos en el protocolo Bulk-Only.Las transferencias se realizan a traves de tres bloques: Command, Data y Status Protocol. Elprimer bloque es llamado CBW (Command Block Wrapper), corresponde a un bloque decomando que indica la inicializacion de la transferencia, especificando el tipo de operaciona realizar con el dispositivo. El segundo bloque (Data) puede ser del tipo Data-IN o Data-OUT, dependiendo si la transferencia es hacia al host o hacia el dispositivo. El bloqueData corresponde a los datos reales de la transferencia. La transferencia termina con elbloque CSW (Command Status Wrapper) que contiene la informacion del estado de latransferencia. CSW tiene un estructura similar a CBW y ambos estan encapsulado en unpaquete tipo DATA, sin embargo la estructura especial y fija de los paquetes CBW y CSWpermiten al controlador y al dispositivo diferenciarlos de los paquetes tipo DATA normales.

Las transferencias y el uso de los comandos especiales de control (CBW) no solamentesirven para realizar una lectura o escritura en la memoria de los dispositivos, sino tam-bien, se utilizan para realizar distintas operaciones extras con los dispositivos. En generalse puede decir que el uso de los comandos es para realizar la lectura, escritura y pedirinformacion al dispositivo.

1El documento que especifica USB-IF para el transporte Bulk-Only, se denomina Bulk-Only Transport1.0, el cual se puede encontrar en el CD adjunto a la memoria, con el nombre “usbmassbulk 10.pdf”.

87

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

Figura 5.2: Flujo de datos.

Por otra parte, el protocolo Bulk-Only no permite el encolado de comandos, por lo que elcontrolador USB no envıa ningun nuevo CBW hasta no haber recibido el CSW correspon-diente al ultimo comando enviado. Tampoco se permiten transferencias bi-direccionales,por lo cual, todas las transferencias de datos entre el CBW y el CSW seran en la mismadireccion, es decir todas en su momento OUT o IN.

5.4.2. Bloque CBW

La estructura del CBW comienza exactamente al principio de un paquete de datos ytiene un largo de 31 bytes. Internamente CBW (figura 5.3) se compone de 7 campos,donde algunos son fijos y otros variables. Los campos del CBW se llenan previamenteen el buffer (31 bytes) del SL811HS de tal manera que el comando que se desea enviarsea el correcto para establecer la comunicacion con el dispositivo. Cualquier tipo de erroren el llenado de los campos lleva a que la comunicacion no se establezca con los dispositivos.

Para la construccion de las funciones basicas con los dispositivos de almacenamiento ma-sivo, es de vital importancia saber el detalle de los campos del bloque CBW. A continuacionse detalla cada campo del bloque CBW.

CBWSignature: Se trata de una firma de 4 bytes. El contenido de la firma son loscaracteres ASCII 0x43-0x42-0x53-0x55 que significa USBC (USB Command, en formatolittle-endian). De esta manera el dispositivo identifica que el paquete que esta recibiendoes el comando encapsulado CBW, para luego en un segundo paso verificar que el largo delpaquete sea de longitud de 31 bytes.

CBWTag: Se trata de un numero asignado por el host. El dispositivo devuelve este mismonumero en el paquete CSW para identificar claramente a que CBW pertenece el CSW.Debido a que solo hay un puerto en el SL811HS, se procedio a utilizar los valores: 0x71-0x72-0x73-0x74h.

88

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

Figura 5.3: Command Block Wrapper.

CBWDataTransferLength: Aquı se indica el numero de datos en bytes que el contro-lador espera que se transfieran durante la fase de datos. Si este campo se rellena con uncero, ni el controlador ni el dispositivo envıan paquetes de datos entre el CBW y el CSW.

CBWFlags: En este campo se indica el sentido de las transferencias de datos (Data-Outdesde controlador a dispositivo o Data-In desde dispositivo a controlador). Un valor de0x00 indica que la transferencia es desde el dispositivo al host. Para el sentido contrario elvalor del campo es de 0x80.

CBWLUN: Aquı se indica a que unidad logica va dirigido el comando. Tıpicamente elvalor es de 0x00, pues los dispositivos como pendrives suelen tener una sola unidad logicadisponible.

CBWCBLength: Aquı se indica la longitud (en bytes) del juego de comandos. En estecaso corresponderıa a los comandos SCSI-2 (campo CBWCB). Los valores pueden variarde comando a comando, por ejemplo para un comando de lectura corresponderıa el valorde 0x0A bytes.

CBWCB: En este campo se situa el comando que debe ejecutar el dispositivo. El juego decomandos soportado es indicado por el valor del campo de la subclase (Interface Descrip-tor). CBWCB tiene una longitud de 16 bytes, aunque el juego de comandos utilizado puedeusar una menor longitud. La longitud del bloque viene especificada en el campo anterior yel dispositivo ignora los bytes sobrantes.

5.4.3. Bloque CSW

La estructura del bloque CSW tiene un largo de 13 bytes (figura 5.4).

89

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

Figura 5.4: Command Status Wrapper.

Cada campo tiene las siguientes caracterısticas.

CSWSignature: Se trata de una firma para identificar el paquete de datos como un CSW.El contenido de la firma son los caracteres ASCII 0x53-0x42-0x53-0x55 (USBS = USB Sta-tus, en formato little-endian). El controlador USB identifica que el paquete es un CSW poresta firma y porque el paquete tiene una longitud de 13 bytes.

CSWTag: El dispositivo devuelve en este campo el mismo valor del campo CBWTag delCBW correspondiente.

CSWDataResidue: Para transferencias de datos, el dispositivo indica aquı la diferenciaentre los datos que esperaba recibir y los que realmente se han recibido o viceversa.

CSWStatus: En este campo se indica si el comando se ha ejecutado correctamente o sise ha producido algun error. El host puede confirmar la causa concreta mediante los me-canismos proporcionados por el juego de comandos que se este utilizando. Por ejemplo, sise esta utilizando SCSI o ATAPI, tras un error en la ejecucion de un comando el contro-lador puede enviar el comando Request Sense para que el dispositivo envıe el tipo de errorconcreto.

5.5. Bloques de comandos SCSI-2

En general los comandos SCSI1 o SCSI Block Command (SBC) son una serie de ins-trucciones estandarizadas que permiten la interaccion con los dispositivos que manejandatos. Los comandos SCSI-2 (SBC-2) son comandos reducidos, que estan unicamente orien-tados a realizar acciones en los discos rıgidos, en este caso aplicables a los pendrives. Sinembargo, existen otros comandos SCSI muy parecidos en funciones entre sı, pero orientados

1Small Computer Systems Interface.

90

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

a otros dispositivos como son los comandos SBC-3 para CD-ROM y lectores de DVD. Loscomandos SCSI se encuentran regulados por el comite INCITS (International Committeefor Information Technology Standards) que dispone de los documentos oficiales en la paginaweb www.t10.org.

Los bloques de comandos SCSI tienen una serie de campos que varıan de comando a co-mando, donde deben ser llenados de acuerdo a las especificaciones. Cada comando empiezacon un numero llamado codigo de identificacion, el cual permite diferenciar los comandosentre sı. Tambien, cada comando SCSI tiene establecido una serie de campos que retornanal host.

Codigo Comando0x00 Test Unit Ready0x03 Request Sense0x12 Inquiry0x1A Mode Sense0x1E Prevent Allow Media Removal0x25 Read Capacity0x28 Read(10)0x2A Write(10)0x2F Verify0x5A Mode Sense

Cuadro 5.4: Tıpicos comandos SCSI.

Algunos de los tıpicos comandos que se pueden solicitar se muestran en el cuadro 5.4,de los cuales no todos estan implementados por los fabricantes de pendrives. Esto se debeporque algunos comandos SCSI son reemplazables por las peticiones propias del protocoloUSB. Otro motivo del no soporte a todos los comandos SBC-2, es porque algunos se puedenobtener por otros comandos SCSI. Es el caso del comando Read Capacity que entrega lacapacidad total de memoria del pendrive, sin embargo la informacion tambien se encuentradisponible en la particion logica de la unidad, que entrega una informacion mas precisacon respecto al que entrega el comando Read Capacity, accesible por medio de el comandoRead(10) que permite la lectura de sectores de bloques de memoria.

De todas las pruebas realizadas en diferentes pendrives, se pudo constatar que todos losdispositivos soportan al menos tres comandos basicos que permiten la lectura y escriturade datos, estos son: Inquiry, Read(10) y Write(10). Estos tres comandos fueron construidossegun las especificaciones, llenado los 31 bytes del bloque de comando CBW que envıa lapeticion de comando SCSI.

5.5.1. Inquiry

El comando Inquiry entrega informacion mas precisa sobre el dispositivo, como porejemplo: fabrica del producto, nombre del producto, version del producto, etc. Inquiry es

91

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

muy parecido a las peticiones USB del tipo String, la diferencia radica en que este comandose envıa tıpicamente despues de aplicar un reset al dispositivo, de manera de comprobarque el dispositivo soporta los comandos SCSI y ası indicar al dispositivo que esta listopara recibir otros comandos SCSI. Para acceder al llenado y envıo del comando Inquiry sepuede consultar en el Apendice E. Tambien se incluyen el resto de los comandos construidos.

A continuacion se muestra la funcion construida para ejecutar el comando SCSI Inquiry.

INQUIRY(char *ptr)

Figura 5.5: Resultado del comando Inquiry.

El siguiente codigo muestra la forma de realizar el comando Inquiry.

int main(void)

.

.

.

char temp[36]

Bus_Enumeracion(0x02); //bus enumeracion en 0x02

Buscar_EndpointBulk(); //busca y ordena los endpoint tipo bulk en los descriptores

NUM_DISP=0x02; //var. general, fija la direccion para las funciones SCSI

INQUIRY(temp); // comando SCSI

La figura 5.5 muestra el resultado obtenido al ejecutar el comando SCSI INQUIRY()a un pendrive Packard Bell. En la figura se observa que el dispositivo devuelve la marca,producto y version del dispositivo, demostrando de esta manera que esta listo para seguirrecibiendo comandos SCSI. Sin duda, este comando es muy parecido a las peticiones deltipo string.

92

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

5.5.2. Read(10)

El comando SCSI Read(10 ) permite leer un sector de memoria de 512 bytes (bloque),con la posibilidad de fijar cuantos sectores consecutivos se van a leer. Es decir, la cantidadde bloques que se leen puede ir variando dependiendo de las necesidades del programador.Lo ideal y optimo para la lectura de datos es leer por cluster1. Sin embargo, al usar un mi-crocontrolador se reduce la posibilidad de leer en forma optima los dispositivos con mayormemoria y que a su vez tengan un cluster de mayor tamano. La memoria RAM que poseeel microcontrolador MSP430f1612 es de 5KB (aproximadamente 10 bloques de 512 bytes).Teniendo en cuenta que se debe dejar memoria libre para la escritura de datos, variables,funciones y otras operaciones paralelas que realizara el microcontrolador, la lectura no debesobrepasar mas alla de los 2048 bytes, es decir 4 bloques consecutivos de memoria.

La siguiente funcion permite ejecutar el comando SCSI de lectura de sectores:

Leer_Sector(DWORD sect_leer, BYTE veces, char *ptr)

EL parametro sect leer indica el sector que se va a leer. El parametro veces indica lacantidad de bloques de sectores de memoria (512 bytes). El resultado de la lectura empiezaen el puntero ptr.

En el siguiente ejemplo ilustra como leer el sector de memoria 0x40 y 0x41 utilizandolas propiedades.

int main(void)

.

.

.

char temp[1024];

Leer_Sector(0x000040, 2, temp);

En el ejemplo anterior tambien es posible leer los dos sectores de memoria por se-parado, pero usando las propiedades de la funcion SCSI se pueden reducir notablementelos tiempos de acceso a memoria en los pendrives. Sin duda, la funcion de lectura es laclave del posterior proceso de busqueda y escritura de archivos. Pero en si, la lectura desectores no tiene mucho sentido sino se tiene claro que representa cada sector de memo-ria. En secciones mas adelante se discutira la organizacion de la memoria en los dispositivos.

1Un cluster es una agrupacion de sectores de 512 bytes que dependen de cada dispositivo.

93

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

5.5.3. Write(10)

La funcion SCSI Write(10) permite escribir en un sector de memoria de los dispositi-vos. Esta funcion tiene las mismas caracterısticas y consideraciones que la funcion anteriorRead(10). Sin embargo, la construccion interna es bastante diferente, pues los llenados delos bloques de comandos CBW son distintos y la comunicacion entre el host y el dispositivoes del tipo DATA-OUT.

La siguiente funcion fue creada para ejecutar el comando SCSI de escritura.

Escribir_Sector(DWORD sect_escr, BYTE veces, char *ptr)

El siguiente ejemplo ilustra como escribir los caracteres e, l, o, en el sector de memoria0x40 de un dispositivo MSD.

int main(void)

.

.

char temp[512];

temp[0]=’e’;

temp[1]=’l’;

temp[2]=’o’;

Escribir_Sector(0x000040, 1, temp);

Se debe tener cuidado cuando se intenta escribir en sectores en el cual puede afectarel funcionamiento de los dispositivos. Por ejemplo escribir datos incorrectos en el sector0x00 puede causar que el dispositivo no sea reconocido en los S.O, o escribir en un sectorque no este libre puede causar que se danen los archivos y posteriormente no puedan serrecuperados.

Con la ayuda de la funcion de escritura se creo una nueva funcion capaz de escribira partir desde una posicion del sector (1-512). La funcion es EscrSectorPosic(), donde seutilizo para rellenar sectores cuando se desea escribir al final de un archivo.

5.6. Organizacion De La Memoria Fısica

Actualmente los pendrives tienen una capacidad de almacenamiento desde 16MB a 2GB,lo cual es relativamente pequeno comparado con los actuales discos duros que superan los500GB. La estructura de memoria para discos con capacidades menores a 2GB correspondea FAT16. De esta manera los actuales pendrives vienen por defecto con el formato (FAT16).Sin embargo, los pendrives se pueden formatear bajo Windows a FAT32, pero puede causaralgunos problemas o danos como: reduccion del tamano original, perdida de la Master Boot

94

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

Record o simplemente la perdida del firmware en los Mp3 Player. Sin duda, con el aumen-to gradual de las capacidades de memorias de los pendrives, estos tendran que funcionarnormalmente en otros formatos, lo que esta en plena discusion por USB-IF.

5.6.1. FAT16

La figura 5.6 muestra la estructura para FAT16. En los primeros 512 bytes de memoriase encuentra el sector llamado Master Boot Record (MBR). A continuacion se encuentrancuatro posibles unidades logicas (logical disk). Cada unidad logica contiene: una PartitionBoot Record (PBR), dos FAT identicas (FAT1 y FAT2) y una tabla de directorios raız.En el caso del protocolo USB, el acceso es solo a traves de sectores de 512 bytes y no pormedio de CHS (Cylinder, Head, Sector).

Figura 5.6: Organizacion de la memoria.

Ademas de agrupar la memoria por sectores de 512 bytes, tambien se agrupan sectoresconsecutivos los cuales se llaman cluster. Estos dependen del tamano de la memoria decada dispositivo. El cuadro 5.5 se muestran los cluster por la capacidad de cada dispositivo,en donde mas grande la memoria implicara mas sectores por cluster. El total de cluster quedebe haber en FAT16 es de 65535 cluster (0xFFFF) por area de datos.

Tamano 32MB 64MB 128MB 256MB 512MB 1GBnumero de cluster 1 2 4 8 16 32

Cuadro 5.5: Cluster por tamano.

95

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

5.6.2. Master Boot Record - MBR

El sector Master Boot Record (primer sector de memoria) lleva el control de las diversasparticiones (unidades logicas) que existen en el dispositivo, entregando detalles importantescomo el sector donde comienza dicha particion.

Posicion Descripcion Largo000h Codigo ejecutable (booteable) 446 bytes1BEh 1o Particion 16 bytes1CEh 2o Particion 16 bytes1DEh 3o Particion 16 bytes1EEh 4o Particion 16 bytes1FEh Identificador (55h AAh) 2 bytes

Cuadro 5.6: Master Boot Record.

La Master Boot Record se encuentra dividida en 6 campos (cuadro F.1). La posicion0x1BE de la MBR entrega la informacion necesaria para determinar donde se inicia laprimera particion del disco. Toda esta informacion parcial sobre la primera particion seencuentra en 16 bytes (el detalle de los 16 bytes se encuentra en el Apendice F).

Figura 5.7: Master Boot Record del pendrive Packerbell 256MB.

En la figura 5.7 se muestra la MBR de un pendrive Mp3 Player PackardBell. Se observa

96

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

que los primeros 446 bytes de codigo ejecutable (color verde) no se encuentra en el dispo-sitivo, sin embargo en otros modelos se pudo constatar la presencia del codigo ejecutable.Luego en la figura, se muestran las cuatro unidades logicas disponibles con un largo de16 bytes de informacion. Se puede observar que solo la primera particion esta activa. Porultimo la MBR finaliza con los valores fijos 55h AAh (firma).

No siempre se puede encontrar la MBR en el primer sector. Cuando ocurre esto, elprimer sector de memoria pasa a ser la PBR (Partition Boot Record) de la primera unidadlogica. Esto sucede cuando los dispositivos cuentan con una sola particion (muy comun) yse formatean bajo Windows, pero en caso contrario, la MBR debera estar presente paraindicar las distintas particiones.

5.6.3. Particiones

Cada particion tiene 6 secciones definidas (figura 5.8). Toda particion comienza con laPartition Boot Record (PBR) de un un tamano fijo de 512 bytes. Seguido se encuentran detamano variable: los sectores reservados, dos tablas FAT, tabla de directorios y termina conel area de datos. Toda la informacion respecto del tamano y direcciones de las seccionesnombradas anteriormente la proporciona la PBR, que ademas entrega la cantidad de sec-tores por cluster que tiene la particion1.

Figura 5.8: Estructura de las particiones.

1EL detalle referente a toda la PBR se puede consultar en el Apendice F.

97

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

La figura 5.9 muestra la PBR de un pendrive conectado al SL811HS.

Figura 5.9: Ejemplo de la Partition Boot Record.

5.6.4. Funcion para encontrar particiones

Se construyo una funcion que buscara y calculara los datos utiles para la posteriorbusqueda de archivos (direcciones de cada seccion de la estructura de la particion). Tam-bien que diferenciara entre la MBR y la PBR ya que ambas pueden aparecer en el sector0x00 con un tamano de 512 bytes. El codigo interno de la funcion se basa en lo que ante-riormente se discutio sobre las particiones, en conjunto con los detalles que se encuentranen el Apendice F sobre las particiones.

La funcion construida es la siguiente:

buscaparticion(BYTE adress)

La figura 5.10 muestra los resultados obtenidos al utilizar la funcion buscaparticion()al mismo pendrive del ejemplo de la figura 5.9.

98

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

Figura 5.10: Valores obtenidos al ejecutar la funcion buscaparticion().

Como se puede observar de la figura 5.10, los valores obtenidos y calculados se guardanen la siguiente estructura:

struct Particion_struct

//MBR

DWORD Start; //inicio de la particion.

//PBR

WORD BytesPorSec; //bytes por sector.

BYTE SecPorCluster; //sectores por cluster.

WORD BytesporCluster; //bytes por cluster.

WORD ReservedSectors; //sectores reservados.

WORD MaxRootDir; //maximo root directorio.

WORD SecPorFAT; //sectores por FAT.

//datos calculados a partir de los datos obtenidos

DWORD RootDir; //directorio raız.

DWORD DataArea; //area de datos.

DWORD FAT1; //tabla FAT1.

DWORD FAT2; //tabla FAT2.

//datos utiles

DWORD TamanoCluster; //tama~no del cluster en bytes.

DWORD NumberSecPart; //numeros de sectores en la particion.

DWORD NumberSecData; //numeros de sectores de datos.

DWORD EspTotalBytes; //espacio total del dispositivo.

Particion;

99

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

5.6.5. Distribucion de los archivos en memoria

Como se menciono en este capıtulo, grupos de sectores de 512 bytes se agrupan en clus-ter1. La numeracion de los cluster sucede a partir del area de datos de la particion, para locual, se establece que el area de datos comienza exactamente en el cluster 0x02.

Figura 5.11: Ejemplo de la distribucion de un archivo en memoria.

Cuando se busca un archivo, uno de los datos que se obtienen de aquella busqueda esel cluster que da el comienzo al archivo, llamado cluster de inicio. El cluster de inicio serelaciona directamente con los datos obtenidos de la particion para establecer la direccionprecisa del sector que se debe leer. Ademas, la utilizacion de cluster produce que un archivosiempre ocupe como mınimo la cantidad de 1 cluster de memoria, excepto por los archivosde tamano cero que no tienen un cluster asignado. Por otra parte, los archivos superioresa un cluster se ubican en varios cluster (dependiendo del tamano del archivo), donde nonecesariamente pueden ser consecutivos. De esta manera, la distribucion total del archivoes repartida a lo largo de la memoria del dispositivo. En la figura 5.11 se muestra unejemplo grafico de un archivo repartido a traves de dos cluster.

Como se observa en la figura 5.11, la informacion sobre la continuidad del archivo esproporcionado por la tabla FAT2, indicando a traves de un numero de 2 bytes el proximocluster a leer . El archivo solo termina cuando la tabla FAT entrega el valor 0xFFFF. Sinembargo, la tabla FAT entrega otros valores, como indicar si un cluster esta vacio o danado.

1Mirar el cuadro 5.5.2FAT1 y FAT2 son tablas identicas.

100

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

Los valores que se pueden obtener de la tabla FAT y su interpretacion se muestran en elcuadro 5.7.

Valor Descripcion0x0000 cluster vacio0x0002-0xFFEF usado, proximo cluster0xFFF0 - 0xFFF6 cluster reservado0xFFF7 cluster danado0xFFF8-0xFFFF usado, ultimo cluster en el archivo

Cuadro 5.7: Codigos para el cluster.

5.7. Archivos y directorios

La asignacion de nombre para los archivos y directorios establece dos tipos de formatos:8.3 y LFN. El primer formato (8.3) se utilizo en el sistema operativo DOS para asignarcomo maximo 8 caracteres para el nombre y 3 caracteres para la extension, normalmenteconocido como nombres cortos. El formato 8.3 tiene la ventaja que por cada nombre que seguarde solo ocupara el espacio de 32 bytes, pero con la desventaja que recorta los nombresque se salgan del formato 8.3. Por su parte, el formato Long File Name, por problemasde compatibilidad conserva el formato 8.3, y ademas agrega espacio para los nombres quecontengan mas caracteres de lo que permite el formato 8.3, incluyendo casos como los ca-racteres especiales que no soporta 8.3. El formato LFN se empezo a utilizar a partir deWindows95, en donde se establece una asignacion de espacio multiplo de 32 bytes1.

Cada formato tiene sus propias caracterısticas de como se distribuye los caracteres a lolargo del espacio que tienen asignado para el nombre. Ademas cada archivo o directorio traeconsigo la informacion necesaria para la ubicacion posterior de los datos. La informacionque tiene cada archivo o directorio es en general: nombre, extension, atributos (archivo, di-rectorio, oculto, sistema), fecha de creacion, ultimo dıa de acceso, primer cluster de accesoy tamano del archivo. Hay que rescatar que el significado del primer cluster de acceso paraun archivo, es indicar en que sector de memoria hay que leer el archivo (primeros bytes delarchivo), sin embargo, para un directorio el significado es indicar en que sector de memoriaestan los nombres de archivos y sub-directorios que pertenecen a ese directorio. Para mayordetalle, en el Apendice F se encuentra la distribucion de los caracteres para el formato 8.3 yLFN en conjunto con toda la informacion que se puede obtener de los archivos y directorios.

En la figura 5.12 muestra cuatro ejemplos de diferentes nombres de archivos obtenido dela tabla de directorios de un pendrive. En el primer caso se tiene el nombre “informe.txt”,el cual corresponde al formato de nombres cortos. Se puede observar del caso 1 que elnombre va en mayuscula (no se conserva el nombre original) y ademas, el punto que divideel nombre de la extension es considerado como un caracter de espacio (0x20). En segundo

1El mınimo de espacio que ocupa el formato LFN es de 32 bytes para archivos y directorios cortos.

101

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

Figura 5.12: Ejemplos de nombres y carpetas en la tabla de directorios.

caso, corresponde al archivo “mis documentos.zip”, en donde se utiliza el formato LFN. Seobserva del caso 2 que se ocupan 32 bytes para la asignacion del nombre corto y se agregan64 bytes para el nombre largo. Cada nombre largo tiene detalles como por ejemplo: la ca-dena siempre empieza con el valor 0x01; la continuacion de cada nombre es hacia atras; lainformacion correspondiente al archivo se guarda donde esta el nombre corto; el punto dedivision entre el nombre y la extension es considerando como un caracter de punto (0x2e);los espacios vacıos se rellena con 0xff, etc. El tercer caso 3 corresponde al archivo “todasmis fotografias1 del paseo.rar”, en donde corresponde al formato LFN y ocupa un total 128bytes. En el caso 4 (ultimo ejemplo) corresponde al archivo borrado “notas.doc”. Se puedeobservar que la primera letra del nombre se reemplazo por el valor 0xe5, de esta manera seindica que el archivo ya no existe. En general, como se vieron en los ejemplos, la busquedade un nombre no resulta ser una accion sencilla, ya que por la gran cantidad de detalles nose soluciona con una simple comparacion de cadenas.

5.7.1. Desarrollo de una funcion base de busqueda

Se desarrollo una funcion que sirviera de base para la posterior busqueda de nombresde archivos. La funcion permite buscar nombre entre un rango de sectores que determineel programador. La funcion se muestra a continuacion:

busqueda_archivo(char *name , char atr, DWORD sect_inic, DWORD sect_final)

1El archivo original no lleva acento.

102

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

La funcion permite la busqueda de un nombre name, entre las direccion inicial sect inicy la direccion final sect final, diferenciando con el parametro atr para establecer si se tratade un archivo o directorio (‘D’=directorio y ‘A’=archivo). La funcion retorna el valor 1 sila busqueda es exitosa o el valor 0 en caso contrario. Ademas, permite buscar nombres yasea de cualquier formato (8.3 y LFN), ya que la funcion reconoce y transforma los nom-bres segun sea el caso. Internamente la funcion se ayuda de otras funciones creadas quefacilitan la busqueda, como son: la reubicacion de los caracteres, comparaciones de atribu-tos, comparacion de cadenas, descartar nombres borrados, informacion de cluster, etc. Unavez encontrado el archivo, la funcion guarda en una estructura los datos necesarios parala posterior lectura y escritura del archivo. Los datos mas necesarios que se obtienen alencontrar un archivo son: tamano del archivo y direccion de inicio del sector de datos. A suvez, cuando se encuentra un archivo se guarda la informacion del sector y posicion exactaen donde esta ubicado el nombre del archivo, para que posteriormente se pueda modificarlos bytes que indica el tamano del archivo.

5.7.2. Busqueda de archivos y directorios en la raız

Los archivos y directorios que se encuentran en la raız, son todos aquellos que no estandentro de un directorio. Para encontrar estos archivos se procedio a realizar una funcion quebuscara en todo el sector designado para la tabla de directorios. Es decir, desde el inicio dela tabla de directorios, hasta un sector antes del area de datos1. Este espacio de busqueda,es siempre un rango limitado2 y conocido (dependiendo de la memoria fısica de cada dispo-sitivo), lo cual origina que cuando el espacio para la tabla de directorios se llena, no se puedaguardar un nuevo archivo en la raız, sin embargo se puede seguir escribiendo en los archivos.

Finalmente para la busqueda de nombres en la raız se desarrollo la funcion root(), paralo cual se fijaron los parametros de busqueda de la funcion base busqueda archivo(). Elcodigo de construccion se muestra a continuacion:

int root(char *name, char atr)1

2

int res;3

4

res=busqueda_archivo(name,atr,Particion.RootDir,Particion.DataArea-1);5

6

SEND_CMD(Display_Clear);7

if (res==1)8

printf("Arch o Dir encontrado");9

else10

11

printf("Arch o Dir No encontrado");12

borrartemp();13

14

return res;15

16

1Mirar la figura 5.8, sector Root Directory.2La tabla de directorios pueden ser varios cluster de memoria.

103

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

La funcion root() retorna un valor y un mensaje dependiendo del resultado de la busque-da.

5.7.3. Busqueda de archivos y directorios en directorios

Los archivos y directorios que se encuentran dentro de otro directorio (no-root), se di-ferencian de los archivos que se encuentran en la raız, en tener un espacio limitado solo porla memoria disponible que tenga en el disco (pendrive). Esto se debe porque los nombresde archivos y carpetas se guardan como datos de archivos, utilizando para ello el metododel seguimiento por cluster (FAT).

La funcion que se construyo para la busqueda en directorio es la funcion noroot(), cuyocodigo se muestra a continuacion:

int noroot(char *name, char atr)1

2

int res;3

DWORD ultimo_sectorleido, proximo, final;4

5

SEND_CMD(Display_Clear);6

proximo=Directemp.DireccArchiv; //fija el limite inicial7

final=proximo+Particion.SecPorCluster; //fija el limite final del cluster8

9

if(Directemp.DireccArchiv==0) //verifica si hay un directorio anterior buscado10

11

printf("error, no existe directorio anterior");12

return 0;13

14

15

//se realiza la busqueda hasta que se encuentre el archivo,16

//o hasta que se terminen los cluster de datos.17

18

do19

20

res=busqueda_archivo(name,atr,proximo,final);21

ultimo_sectorleido=proximo;22

proximo=infocluster(proximo);23

final=proximo+Particion.SecPorCluster;24

25

while((res==0) && (ultimo_sectorleido != Directemp.UltimoSector));26

27

if (res==1) //respuesta positiva28

printf("Arch o Dir encontrado");29

else //respuesta negativa30

31

borrartemp();32

printf("Arch o Dir No encontrado");33

34

35

return res;36

37

104

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

Inicialmente la funcion busca en todo el cluster inicial de datos, que es entregado porla funcion anterior root(). Si la busqueda es negativa, consulta si hay mas cluster por leery se fijan los nuevos lımites de busqueda. La busqueda se realiza hasta que se encuentre elarchivo o hasta que la informacion del cluster diga que no hay mas saltos de memoria (nohay mas archivos en ese directorio).

por ejemplo para buscar dos archivos diferentes se procede de la siguiente manera:

int main(void)

.

.

.

//busca el archivo 1

root("archivos",’D’); //directorio "archivo".

noroot("textos generales",’D’); //directorio "textos generales".

noroot("teclado.txt",’A’); //archivo "teclado.txt".

save(0); //graba direccion en posicion 0.

//busca el archivo 2

root("strupr.c",’A’); //archivo "strupr.c"

save(1); //graba direccion en posicion 1.

En la primera parte del ejemplo, se busca un archivo en la ruta “archivos/textosgenerales/teclado.txt”, el resultado se guarda en la posicion 0 . Para el segundo caso sebusca en la raız el archivo “strupr.c” y se guarda en la posicion 1. La funcion save(), quese muestra en el codigo, se diseno para permitir operar con varios archivos: se guarda enuna posicion del 0 al 9 todos los datos respecto del ultimo archivo buscado, de maneraque posteriormente se pueda elegir la lectura y escritura de 10 archivos distintos. Por otrolado, cuando un nombre no se encuentra o no existe, la busqueda (noroot()) y el grabadode datos (save()) no se realizan. Esto porque las distintas funciones verifican si existe unresultado anterior positivo. Ademas, en cada caso se muestra a traves de la pantalla LCDel resultado de la operacion.

El resultado final de la funcion save() queda en la estructura Archiv Open. La figura5.13 muestra el resultado de los dos archivos encontrados en el ejemplo anterior.

Se puede observar en la figura 5.13 que los tamanos de los dos archivos son 4096 y 709bytes respectivamente (TamArchiv). El valor del tamano del archivo es el unico dato quepuede llegar a ser util para el usuario, como por ejemplo mostrarlo el tamano en pantalla.Ademas, es util para abrir el final de un archivo y posteriormente escribir a continuacion.El resto de los datos que se guardan con la funcion save() y que se muestran en la figura(direccion de inicio del archivo, ultimo cluster, index, etc) son para que posteriormente lasfunciones de lectura y escritura de archivos se guıen para cumplir con la tarea. En un futurose podrıa integrar estas tres funciones (root(), noroot() y save()) de manera de realizar unabusqueda general tipo D.O.S, MATLAB, Linux, etc.

105

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

Figura 5.13: Estructura de la funcion save().

5.8. Lectura de archivos

Se construyo una unica funcion capaz de realizar una lectura de archivos, de tal mane-ra que satisficieran las mayorıas de las necesidades de lectura de archivos. La funcion delectura es:

readfile(DWORD numr ,DWORD ini, WORD cuant, char *ptr)

La funcion permite leer un archivo de los que ya se han guardado con la funcion save().Para ello se le ingresa en el parametro numr para indicar el numero del archivo que se desealeer. Tambien se le ingresan los parametros ini y cuant, que permite decirle a la funcion enque byte del archivo empezar a leer y que cantidad de bytes leer respectivamente. Los datosse guardaran en la direccion de memoria ptr. La funcion retorna los bytes que se leyeron,pues se le pueden indicar leer una cantidad que sobrepase el tamano del archivo. En casoque no se pueda leer el archivo, la funcion retorna el valor 0.

La funcion tiene varias restricciones, una de ellas es que no se pueden leer mas de 2048bytes de cualquier parte del archivo, pues por problema de memoria en el microcontro-lador, puede afectar a la escritura de datos o a otras funciones paralelas que se quieranrealizar con el. De esta manera la funcion retorna el valor 0 cuando se ingresan parametros

106

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

de lectura mas grande que 2048 bytes (cuant). Otra restriccion que se realizo fue que elvalor ini solo sea valido desde el valor 1, pues el valor indica el primer byte del archivo.Tambien, la funcion retorna el valor 0 cuando se pone un valor ini mas grande de lo quees el tamano del archivo, de manera de proteger el desarrollo de la funcion. Por ultimo,cuando se pone un valor en el parametro cuant (cantidad de bytes que se desean leer) quecomprometa leer mas alla del tamano real del archivo, pero el valor inicial de lectura ini esvalido, internamente la funcion ajusta el valor de manera que solo se leen los ultimos bytesdel archivo.

Por ejemplo leer los primeros 100 bytes de un archivo guardado en la posicion 0.:

int main(void)

.

.

.

char temp[100];

//busca el archivo 1

root("archivos",’D’);

noroot("textos generales",’D’);

noroot("teclado.txt",’A’);

save(0);

readfile(0,1,100,temp); //lectura de los primeros 100 bytes del archivo 0.

Para leer mas de 2048 bytes (3000) y destinarlo a un mismo arreglo.

int main(void)

.

.

.

char temp[3000];

readfile(3,1,2000,temp); //lee desde 1-2000, el archivo 3.

readfile(3,2001,1000,&temp[2000]); //lee desde 2001-3000, el archivo 3.

Para leer los ultimos 512 bytes de un archivo 9.

int main(void)

.

.

.

char temp[512];

readfile(9,Archiv_Open[9].TamArchiv-512,512,temp);

5.8.1. Escritura en archivos

La escritura en archivo consiste en copiar desde memoria del microcontrolador datos,variables y cadenas de caracteres, a partir del final del archivo. Para realizar tal funcion,

107

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

se procedio a obtener los datos necesarios del ultimo cluster en donde esta la parte finaldel archivo. Con las anteriores funciones desarrolladas se procede a completar los bytesque faltan del ultimo sector, para ası continuar con rellenos por sectores completos segunsea la cantidad de informacion que se desea guardar. En caso que se terminen los bytesdisponibles que posee el ultimo cluster, la funcion de escritura se apoya en otras funcionespara la busqueda de un cluster vacıo, de manera que se siga realizando la escritura dedatos faltantes. En caso de exito (busqueda correcta de un cluster vacıo) la funcion deescritura procede a realizar los respectivos cambios en la FAT, para darle continuidad alarchivo (FAT1 y FAT2). Una vez que se tiene un cluster vacıo, la funcion de escritura siguerellenado los sectores al igual que en la primera parte. Una forma grafica de lo explicadoanteriormente se muestra la figura 5.14, para un dispositivo que tiene 4 sectores por cluster.

Figura 5.14: Relleno de sectores y cluster en la escritura de datos.

En la figura se puede observar como esta distribuido la ultima parte del archivo. Eltamano del archivo del ejemplo es de 2862 bytes, los primeros 2048 bytes estan distribuidoen un cluster en que no es importante para el relleno de los datos, sin embargo, si es impor-ta saber todo lo referente al ultimo cluster, en donde estan los ultimos 824 bytes del archivo.

Tambien se considero para el diseno de la funcion de escritura, el caso de los archivoscon tamano cero, pues estos archivos no tienen un cluster asignado. Para ello, previamentese le asigna un cluster en la FAT. Finalmente cualquier que sea el caso, la funcion de es-critura termina su rutina modificando el nuevo tamano del archivo en donde se encontro,ademas, se actualizan los valores que se guardan en la estructura de la funcion save().De esta forma, en la proxima escritura de datos todos los archivos parten con los nuevoscambios que guiaran correctamente la escritura, como la lectura del archivo.

Las funciones de escritura son las siguientes:

108

CAPITULO 5. DISPOSITIVOS DE ALMACENAMIENTO MASIVO

int writefile_array( int numero, char *ptr, WORD cuanto_escribir);

int writefile_var(int numero, long entero);

int writefile_string( int numero, char *ptr);

El parametro numero indica el archivo que se desea escribir.

Al igual que en la lectura de archivo, estas tres funciones estan basadas en una funcionbase de escritura, de manera que son pequenas variaciones para utilizarlas en diferentescasos. La primera funcion writefile array() corresponde practicamente a la funcion base deescritura pues permite escribir en un archivo un arreglo del tamano que desea el usuario.La segunda funcion writefile var() permite escribir al final de un archivo una variable detamano long. Para ello se procede a transformar la variable a caracteres. La tercera funcionwritefile string() permite escribir un string cualquiera.

Entre los multiples ejemplos que se realizaron para verificar el correcto funcionamientode las funciones, fue realizar una lectura por segmentos iguales de datos (excepto por elultimo segmento) de un archivo, realizando al mismo tiempo una copia de esos segmentosa otro archivo con tamano inicial de 0 bytes. De esta manera, se realiza una copia identicadel archivo original. Tambien se realizo la lectura de MBR, PBR y FAT, para luego pasarla informacion a un archivo de texto. Por ultimo se realizo una copia de datos de un archivoa otro, con la comprobacion de datos escritos en el mismo dispositivo. Todos los ejemplosse pueden consultar en el CD-ROM adjunto a la memoria, cual trae las respectivas aclara-ciones para cada ejemplo.

109

Capıtulo 6

Conclusiones

El desarrollo del driver que permite la escritura y lectura de archivos en dispositivosde almacenamiento masivo USB se concreto exitosamente. Sin embargo se abordaron otrostopicos de gran importancia del protocolo USB como son: peticiones, descriptores y dispo-sitivos de interfaz humana (HID). Estos temas, en conjunto con el tema principal tratado,permitiran al futuro programador trabajar desde un solida base tanto con el controladorUSB SL811HS, como para otros tipos de controladores en donde se requieran realizar nuevosdrivers.

Con respecto al controlador USB en el cual se trabajo, se generaron sencillas funcionespara el usuario como son: cargar de forma automatica los descriptores del dispositivo, detec-tar la velocidad de trabajo, configurar y visualizar si el dispositivo esta enumerado, recibirdatos desde dispositivos HID (mouse, teclado y joystick) y manipular en forma sencillaarchivos de datos. Con esto, sin entrar en gran profundidad en el protocolo USB o en elcontrolador, el usuario solo se encargara de manipular los datos que provienen desde eldispositivo.

Al hacer multiples pruebas con dispositivos de almacenamiento masivo, se observo quela velocidad de transferencia de los archivos que se manipularon, fue notoriamente masbaja de lo que el protocolo USB 1.1 puede brindar. Esto se debe a que la mayorıa de lasfunciones que se crearon, fueron disenadas para asegurar el correcto funcionamiento en dis-positivos de cualquier tamano de memoria. Ademas, la poca memoria RAM que dispone elmicrocontrolador con respecto a la memoria fısica de los dispositivos, implico realizar lasfunciones no de forma mas optima.

A pesar que una norma asegura que un dispositivo USB 2.0 debe por lo menos ser re-conocido en los controladores USB 1.1, la norma no asegura el completo funcionamiento deellos. Esto se pudo comprobar en los distintos dispositivos en que se realizaron pruebas, y severifico que no todos los dispositivos USB 2.0 funcionan adecuadamente en un controlador1.1. Sin embargo, el funcionamiento para los dispositivos USB 1.1 fue correcto para todos.

En general, las aplicaciones que se pueden desarrollar con los dispositivos USB de laclase HID y MSD tienen un sin fin de posibilidades, el cual solo dependera de la imaginacionde quien ocupe estos recursos.

110

Apendice A

Detalles del protocolo USB

En este apendice se encuentra el detalle del protocolo USB. Algunos de los paquetes quese nombran en este apendice se pueden manejar directamente en los registros de controldel SL811HS.

A.1. Paquetes que se encuentran en las transacciones

Nombre Tamano Tipos de paque-tes

Proposito

SYNC 8 bits todos inicio de la tramas y sincronizacionPID 8 bits todos identifica el tipo de paqueteAdress 7 bits IN, OUT, Setup identifica la direccion del dispositivo (funciones)ENDP 4 bits IN, OUT, Setup identifica el numero del endpointFrameNumber

11 bits SOF identifica el numero del frame

Data 0-1023bytes

Data0, Data1 datos

CRC 5 o 16bits

IN, OUT, Setup,Data0, Data1

detectar errores

Cuadro A.1: Paquetes del protocolo USB.

A.1.1. SYNC

SYNC es usado por el circuito de entrada para alinear los datos de llegada con el relojlocal, de esta manera SYNC solo sirve como un mecanismo de sincronizacion en el cualtodos los paquetes lo contienen (Token, Data, Handshake). La estructura del campo SYNCpara low y full-speed corresponde a una secuencia de 8 bits con el string “KJKJKJKK” encodificacion NRZI. Los ultimos dos bits del campo SYNC (“KK”) es un rotulador que seusa para identificar el fin del campo SYNC, para dar el comienzo al campo PID. Sin em-bargo, para la transmision high-speed se requieren de 15 pares “KJ” terminando con “KK”dando un total de 32 sımbolos. Los hubs tienen el permiso de poder descartar hasta 4 bits

111

APENDICE A. DETALLES DEL PROTOCOLO USB

desde el principio del patron SYNC, pero no pueden agregar sımbolos al campo SYNC. Deesa manera, despues de ser repetido por 5 hubs el campo original SYNC de 32 sımbolos,puede llegar a quedar a 12 bits (KJKJKJKJKJKK). Este metodo de eliminacion es paradetectar cuando se conecten mas de 5 hubs al bus de datos.

A.1.2. PID

El PID indica el tipo del paquete en la trama USB. Este consta de 8 bits de los cualeslos primeros cuatro son empleados para indicar el codigo del formato del paquete (cuadroA.2) y los cuatro ultimos llamado IPID son los mismos 4 primeros bits del paquete pero enforma negada, utilizado como un mecanismo de deteccion de errores.

Cuadro A.2: Bits del paquete PID.

A.1.3. Address

El campo ADDR especifica la direccion del dispositivo de manera que el host puedaestablecer la comunicacion. Esto se realiza a traves de 7 bits como lo muestra el cuadroA.3. Con la cantidad 7 bits se puede establecer como maximo 127 direcciones para laenumeracion de los dispositivos, siendo la direccion 0 una direccion reservada para la con-figuracion de los dispositivos.

Cuadro A.3: Bits del paquete Adress.

A.1.4. ENDP

Cuadro A.4: Bits del paquete ENDP.

El campo ENDP especifica en 4 bits (cuadro A.4) el endpoint con el cual el host vaestablecer la pipe de comunicacion. Los dispositivos low-speed dan un soporte como maxi-mo a tres pipes: una pipe de Control obligatoria en el endpoint-0 y dos pipes adicionales(ya sea dos de Control, una de Control y otra del tipo Interrupt, o dos del tipo Interrupt).

112

APENDICE A. DETALLES DEL PROTOCOLO USB

Para los dispositivos full-speed y high-speed se establece un maximo de 16 endpoint.

A.1.5. CRC

La Verificacion de Redundancia Cıclica (CRC) se usa para proteger a todos los paque-tes excepto los paquetes PID. En el caso de la fase Token el CRC5 es aplicado sobre lospaquetes ADDR y ENDP. Para la fase Data, el CRC16 es aplicado solamente para el campoDATA. El motivo de no agregar el paquete PID para la verificacion de errores, es porquelos paquetes tipo PID trae su propio mecanismo de verificacion, al repetir nuevamente losbits pero en forma negada.

A.2. Estados en la lınea de transmision

Gracias al transmisor diferencial, receptor diferencial y las resistencias en los termi-nales, posibilitan transmitir y detectar varios estados electricos en la lınea. Esto es de granimportancia mencionar pues los controladores USB incluyendo el SL811H manejan estosestados en sus registros de configuracion. Los estados electricos son:

A.2.1. Diferencial0 y Diferencial1

Estos estados estan definidos por las senales D+ y D-. Diferencial1 existe cuando lasenal D+ esta en nivel logico bajo y la senal D- esta en el nivel logico alto. De la formacontraria se define Diferencial0.

A.2.2. Single-Ended Zero

El estado Single-Ended-Zero (SE0) ocurre cuando las senales D+ y D- tienen un nivellogico 0. El bus usa el estado Single-Ended-Zero para detectar la conexion y desconexionde dispositivos, para indicar el EOP (fin de paquete) y para generar reset.

A.2.3. J y K

USB tambien define dos datos de estados J y K. Estos estan definidos por los estadosdiferencial0 y diferencial1 dependiendo si se esta conectado de la forma low-speed o full-speed (cuadro A.5). Las definiciones de los estados de datos J y K posibilita el uso de unaterminologıa para describir eventos o estados logicos cuando los voltajes de las lıneas low yfull-speed difieren. Por ejemplo, el estado SOF (start of frame) existe cuando el bus cambiade un estado Idle a un estado K. En full-speed, el estado ocurre cuando D- es mas positivoque D+, mientras que en low-speed, el estado ocurre cuando D+ queda mas positivo que D-.

113

APENDICE A. DETALLES DEL PROTOCOLO USB

Estado Low-Speed Full-SpeedDiferencial0 J KDiferencial1 K J

Cuadro A.5: Estados J y K.

A.2.4. Bus Idle

Indica reposo o lınea en alta impedancia, necesario para permitir transferencias semi-duplex, detectar la conexion y desconexion de dispositivos y discriminar entre dispositivosFS y LS.

A.3. Special Packet para el protocolo USB 2.0

En el grupo de paquetes especiales USB 1.1 define solo un tipo de paquete llamadoPRE para indicarle a todos los hubs que un paquete de baja velocidad sera transmitido.Los hubs toman estos paquetes y los repiten a todos los dispositivos que esten habilitados,sean estos de alta o baja velocidad. El paquete subsiguiente que sea transmitido hacia losdispositivos sea una fase Handshake, Data o Token, sera transmitido en baja velocidad.

En cambio USB 2.0 define tres nuevos tipos de paquetes1 especiales:

ERR: Se usa para indicar errores en transacciones Split high-speed. Solo lo puedetransmitir un hub 2.0 (en modo high-speed) en el campo de handshake de unatransaccion Split.

SPLIT: Lo transmite el host en el campo de Token con el motivo de que los hubs eje-cuten toda la transferencia en high-speed y solo en la parte final de la transaccion seejecute a la velocidad correspondiente al dispositivo (low-speed o full-speed). En USB1.1, si se realiza una transaccion a velocidad low-speed, la transaccion comenzarıa des-de el primer hub a esa velocidad trayendo como consecuencia el desaprovechamientodel ancho de banda.

PING: Es transmitido por el host en el campo de Token de una transaccion para elcontrol de flujo. Esto lo envıa el host para preguntar si el dispositivo esta disponiblesin enviar los datos del tipo Control o Bulk, de esta manera se ahorra ancho de banda.En el caso que el dispositivo responde con un ACK es porque el dispositivo puedeatender al host. Si todavıa no esta disponible responde con un NAK al Token PINGhecho por el host.

1Estos tipos de paquetes no son soportados por el host controlador SL811HS.

114

APENDICE A. DETALLES DEL PROTOCOLO USB

A.4. Resumen de los paquetes en las transacciones

La figura A.1se muestra el resumen de la estructuras de todos los paquetes, incluyendoel protocolo USB 2.0.

Figura A.1: Resumen de la estructura de los paquetes del protocolo USB.

115

APENDICE A. DETALLES DEL PROTOCOLO USB

A.5. Resumen de las transferencias USB

La figura A.2 detalla todas las transferencias del protocolo USB 1.1 y USB 2.0, in-cluyendo todos los paquetes que se ven involucrados en cada caso.

Figura A.2: Resumen de las transferencias del protocolo USB.

116

Apendice B

Diagrama de conexiones

La figura B.1 muestra el diagrama de conexiones que se realizo para desarrollar la pre-sente memoria. La conexion corresponde al microcontrolador MSP430F1612, el controladorUSB SL811HS (modulo uUSB-HS) y un display LCD de 4 lıneas.

Figura B.1: SL811HS USB Host/Slave Controlador, Pin Layout.

117

Apendice C

Registros del controlador SL811HSen modo Host

En este apendice se detallan los registros de control que posee el controlador SL811HS.Los registros pertenecen al modo de operacion en host. A su vez, se muestran diversosejemplos en los registros de mayor interes y uso.

Los registros del SL811HS en modo host estan resumidos en el cuadro C.1.

Registro Definicion DireccionUSB-A Control CTL 0x00USB-A Address BUFADR 0x01USB-A Length BUFLEN 0x02USB-A PID/EP PID EP 0x03USB-A Status PKTSTAT 0x03USB-A Address FNADDR 0x04Ctrl1 CTL1 0x05Interrupt Enable IE 0x06Interrupt Status INTSTATUS 0x0DSOF Low SOFCT L 0x0EHW Revision HWR 0x0ESOF High/Ctrl2 SOFCT H 0x0F

Cuadro C.1: Registros en modo host.

Detalles

Las principales caracterısticas de cada registro con las configuraciones bit a bit, sonexplicadas a continuacion:

Registro 0x00, USB-A Control: Se usa para proveer el control basico de las tran-sacciones realizada por el host. Por ejemplo: habilita las transacciones USB, fija la direccion

118

APENDICE C. REGISTROS DEL CONTROLADOR SL811HS EN MODO HOST

(IN-OUT), DATA toggle, etc. En el cuadro C.2 se detalla el registro 0x00 (CTL).

Bit Nombre funcion0 Arm “1” permite realizar la transferencia, luego vuelve automaticamente a

“0”1 Enable “1” permite habilitar al endpoint, cuando es puesto en “0” la transaccion

es ignorada. Si Enable=1 y Arm=0 el endpoint retornara un NAK2 Direccion “1” transmite el host. “0” el host recibe3 Reservado4 ISO “1” permite transferencias isocronas para el endpoint5 SOF “1” sincroniza la transferencia con el SOF6 Data Toggle “0” es DATA0, “1” es DATA17 Preamble “1” para transferencias a dispositivos low-speed (si hay un hub)

Cuadro C.2: Registro 0x00.

El acceso a este registro se establece con la funcion go(BYTE cmd) que tiene comoparametro cmd, correspondiente a un valor de configuracion del registro 0x00 (cuadroC.2). La funcion go() sirve para enviar o recibir transferencias, en donde ademas, se utilizaotro registro dentro de la funcion go() para retornar el resultado de la operacion (ACK,NAK, STALL). Esta funcion solo debe utilizarse al final de un proceso de configuracion,puesto que para establecer una transferencia final, se deben fijar otros registros como di-reccion, tamano del buffer, endpoint etc.

Considerando que no existe un hub de por medio, ademas, con la posibilidad de errorutilizando la sincronizacion por SOF (Errata), los tıpicos valores se reducen a go(0x03) ygo(0x07).

Ejemplos:

//Recibir datos de un endpoint (DATA0)

go(0x03); // DIREC=0(in), ENAB=1, ARM=1

//Enviar datos a un endpoint (DATA0)

go(0x07); // DIREC=1(out), ENAB=1, ARM=1

Se debe resaltar que es importante saber si el tipo de transaccion es IN, OUT conDATA0, DATA1 o DATA toggle. En el caso de la transferencia de dispositivos de almace-namiento masivo, los endpoint son del tipo Bulk, para lo cual el envıo y recibimiento delos datos es del tipo DATA toggle. De esta manera, siempre se debe estar alternando deDATA0 a DATA1, de lo contrario se produce un error de transferencia. Los endpoint tipoInterrupted y Control funcionan con DATA0.

Registro 0x01, Host Base Address: Cuando se reciben datos, este registro debeconfigurarse para indicar en que parte de la memoria del SL811HS se van a recibir. En caso

119

APENDICE C. REGISTROS DEL CONTROLADOR SL811HS EN MODO HOST

de enviar datos, el registro indica donde comienzan los datos que se van a enviar. En amboscasos el valor de este registro debe ser siempre un valor valido para el buffer del SL811HS,esto es entre 10h hasta FFh.

Ejemplo:

wr811(BUFADR,0x10);

Tıpicamente el valor usado tanto para recibir y entregar datos es el valor 10h. Esto sehace de manera de aprovechar el total del espacio que se encuentra disponible en el bufferdel SL811HS. Sin embargo, es necesario que el registro este fijado antes de rellenar el buffercon los datos que se van a enviar.

Registro 0x02, Base Length: Es usado para determinar el largo maximo de latransaccion. Cuando el SL811HS envıa datos hacia un periferico, este registro determi-na el largo del tamano del paquete. Cuando un dispositivo va a entregar datos al host, elregistro sirve para determinar el tamano maximo que aceptara. Es importante utilizar bieneste registro al momento de enviar datos, pues usar un tamano menor al indicado por elendpoint trae consecuencias que no se reconozcan los comandos de Control, o simplementeno realizar los comandos de bloques especiales para los dispositivos de almacenamientomasivos.

Ejemplos.

wr811(BUFLEN,0x08); //recibir datos en dispositivos low-speed o enviar datos de control.

wr811(BUFLEN,0x40); //recibir de un endpoint tipo Bulk 64 bytes.

wr811(BUFLEN,0x00); //recibir Handshake.

wr811(BUFLEN,0x1F); //enviar comandos CBW a dispositivos de almacenamientos masivo.

Si se reciben datos desde dispositivos low-speed con endpoint del tipo interrupcion, talescomo teclados y mouses, los datos transferidos hacia el host seran en cada transferenciaa lo mas 8 bytes. De la misma manera sucede para realizar una transferencia de Control,ya que el tamano del paquete siempre tiene el largo de 8 bytes. Por otra parte, cuando sehacen transferencias de Handshake, en el cual solo se recibe el resultado de la operacion, elvalor del registro debe ser de 0. De esta manera se asegura que no hay datos en la proximatransaccion, ademas se evitan errores cuando el registro tiene otro valor por antiguas ope-raciones de transferencias. Cuando se reciben transferencias tipo Bulk, los valores puedetener un valor hasta de 64 bytes (dependiendo de cada endpoint). Finalmente para el casode transferencias isocronas (ISO), el maximo paquete permitido por USB 1.1 es de 1023bytes, sin embargo, el SL811HS solo soporta un maximo de 240 bytes (buffer).

Registro 0x03, PID/Endpoint: Este registro tiene las siguientes funciones: indicarel resultado de la operacion, establecer que tipo de paquete se va enviar en la proximatransaccion y establecer a que endpoint se va establecer la comunicacion. Cuando se lee elregistro, este cumple con la funcion de entregar el resultado de la ultima transaccion. Elcuadro C.3 muestra los valores que puede tener el registro 0x03 cuando es leıdo.

120

APENDICE C. REGISTROS DEL CONTROLADOR SL811HS EN MODO HOST

Bit Nombre funcion0 ACK el dispositivo retorna un ACK1 Error error detectado en la comunicacion2 Time-out time-out ocurrido3 Sequence “0” es DATA0, “1” es DATA14 Setup cuando es “1” indica un Setup-Packet5 Overflow largo excedido durante el recibo de datos6 NAK el dispositivo retorna un NAK7 STALL el dispositivo retorna un STALL

Cuadro C.3: Registro 0x03, resultados de la ultima transaccion.

La lectura de este registro entra en juego en una gran parte de los codigos realizados.La funcion GO() al mandar un paquete retornara el resultado de la operacion a traves dela lectura del registro 0x03. Dependiendo tanto del valor entregado como el proposito delprograma, se pueden tomar decisiones de que hacer al respecto con el paquete. Si se estanenviando datos a un dispositivo y se recibe un NAK se debe intentar nuevamente enviar elpaquete hasta que el dispositivo este disponible o desocupado. En caso de recibir un STALLsimplemente se debe descartar el envio de paquetes y no insistir nuevamente, puesto quepuede significar que no acepta el comando o simplemente el endpoint no existe. Tambien esmuy util el bit de overflow para no aceptar mas datos, pues despues del overflow el registroindicara un error de comando.

Cuando se escribe en este registro, los primeros 4 bits (b0-b3) corresponden al numerodel endpoint con el cual se va establecer la comunicacion. Los bits restantes del registro(b4-b7) establecen el tipo de paquete PID de la proxima transaccion. Los valores para elcampo PID se muestra en la tabla C.4.

PID Tipo b7-b4SETUP 1101IN 1001OUT 0001SOF 0101PREAMBLE 1100NAK 1010STALL 1110DATA0 0011DATA1 1011

Cuadro C.4: Registro 0x03, valores para el paquete PID.

Para un mejor manejo se establecen las siguientes definiciones:

#define SETUP_PID 0xD0 //

#define IN_PID 0x90 //

121

APENDICE C. REGISTROS DEL CONTROLADOR SL811HS EN MODO HOST

#define OUT_PID 0x10 //

#define SOF_PID 0x50 //

#define PRE_PID 0xC0 //

Ejemplo:

\\establecer una transferencia del tipo Control, en el endpoint cero.

wr811(PID_EP,SETUP_PID | 0x00);

Registro 0x04, Transfer Count Register/USB Address: Cuando se escribe en elregistro se indica la direccion del dispositivo con el cual el host va establecer la comunicacion(el dispositivo debe existir en esa direccion), con un total de 127 posibles direcciones. A suvez, cuando es leıdo el registro, indicara los bytes sobrantes de la ultima transaccion. Si sevuelven a pedir datos teniendo bytes sobrantes distintos de 0, el dispositivo entregara unSTALL indicando que no reconoce el comando.

Ejemplos:

wr811(FNADDR,0x00); //comunicacion con un dispositivo no configurado.

wr811(FNADDR,0x01); //comunicacion con el dispositivo en direccion 1.

Registro 0x05, Control Register 1: El registro habilita la generacion automaticade SOF, reset del SL811HS, configuracion de la velocidad del bus (low-speed y full-speed)y la suspension del Sl811HS (cuadro C.5).

Bit Nombre Funcion0 SOF ena/dis “1” permite generacion automatica de SOF, “0” desactivado3 USB Engine Reset “1” para reset4 J-K state force mirar tabla C.65 USB Speed “0” para full-speed, “1” para low-speed6 Suspend “1” habilitado, “0” desactivado

Cuadro C.5: Registro 0x05.

El cuadro C.6 muestra el modo de operacion de las lıneas D+ y D-. En donde forzandolos estados J y K se pueden invertir el orden de los voltajes de la lıneas de transmision.

Bit4 Bit3 Funcion0 0 modo normal operacion0 1 fuerza USB Reset1 0 fuerza J-State1 1 fuerza K-State

Cuadro C.6: Estados de operacion de las lıneas D+ y D-.

Registro 0x06, Interrupt Enable: Este registro permite habilitar la senal de interrupcion(INTRQ) cuando ocurran ciertos eventos. Estos eventos incluye SOF, conexion y desconexion

122

APENDICE C. REGISTROS DEL CONTROLADOR SL811HS EN MODO HOST

de dispositivos y deteccion de resumen/suspencion. El cuadro C.7 muestra las habilita-ciones que se pueden realizar.

Bit Nombre Funcion0 USB-A interrupcion USB-A1 USB-B interrupcion USB-B2 reservado3 reservado4 SOF timer “1” = interrupcion por SOF (1ms)5 Insert/Remove interrupcion por insertar o remover dispositivos6 Device Detect/Resume interrupcion por detect/resume

Cuadro C.7: Registro 0x06.

Registro 0x0D, Interrupt Status: El registro permite leer el estado de las interrupcionprogramadas. Las interrupciones son borradas fijando en “1” el respectivo bit. El cuadroC.8 muestra los valores de cada bit.

Bit Nombre Funcion0 USB-A interrupcion dispositivo USB-A1 USB-B interrupcion dispositivo USB-B2 Reservado3 Reservado4 SOF timer interrupcion por SOF (1ms)5 Insert/Remove interrupcion por insert/remove6 Device Detect/Resume interrupcion por detect/resume7 D+ valor del pin D+

Cuadro C.8: Registro 0x0D.

El valor del bit7 sirve para identificar si la lınea conectada es D+ o D-, determinandode esta manera si el dispositivo es low-speed o full-speed.

Registro 0x0E, SOF Counter Low/Hardware Revision: El registro fija el valordel contador low que permite generar el SOF de 1 ms (escritura), basado en un reloj de12-MHz. Para low-speed y full-speed tienen un valor fijo de 0xE0. Por otra parte, el cuadroC.9 muestra los valores que el registro retorna cuando es leıdo. Los valores indican la re-version del hardware. La presente memoria se realizo con la revision 1.5.

Bit Nombre Funcion4-7 HW revision “00h”=SL11H, rev1.2 “01h”=SL811HS , rev 1.5 “02h”=SL811HS

Cuadro C.9: Registro 0x0E, hardware revision.

Registro 0x0F, SOF Counter High/Control2: Cuando se escribe en el registro

123

APENDICE C. REGISTROS DEL CONTROLADOR SL811HS EN MODO HOST

permite: fijar el contador high para generar el SOF de 1 ms, elegir el modo de operacion delSL811HS (master o slave) y cambiar la polaridad de las senales D+/D-. El cuadro C.10muestra las posibles configuraciones. Cuando se lee el registro, retorna un valor propor-cional al contador SOF para poder calcular el ancho de banda disponible.

Bit Nombre Funcion0-5 SOF HIGH Counter Register contador high para el SOF6 Data Polarity Swap “1” cambia la polaridad, “0” no cambia la polaridad7 Master/Slave selection “1” master, “0” slave

Cuadro C.10: Registro 0x0F.

Las configuraciones tıpicas para establecer la comunicacion con dispositivos low-speedy full-speed son puestos en el siguiente ejemplo:

Ejemplos:

\\full-speed

wr811(SOFCT_H, 0x2E 0x80); // 1 msec SOF rate, b7=HOST, b6=no change

\\low-speed

wr811(SOFCT_H, 0x2E 0xC0); // 1 msec SOF rate, b7=HOST, b6=POLSWAP

124

Apendice D

Construccion de las peticiones

En este apendice se encuentra el detalle del paquete de Control para realizar las peti-ciones llamado Setup Packet. Tambien se detalla la construccion de la funcion Request()encargada de enviar el Setup Packet. De esta manera se podran construir nuevas peticionespara las diferentes clases.

D.1. Setup Packet

El Setup Packet se compone de 5 campos tal como se muestra en el cuadro D.1.

Posicion Nombre Bytes Descripcion0 bmRequestType 1 fija la direccion de la transferencia1 bRequest 1 valores de 0 a 12, segun se la peticion.2 wValue 2 varıa segun la peticion4 wIndex 2 varıa segun la peticion6 wLength 2 numero de bytes a transferir

Cuadro D.1: Campos del Setup Packet.

Los cinco campos que se definen el Setup Packet tienen las siguientes caracterısticas:

bmRequestType: Este valor indica en la mayorıa de las veces la direccion de la transfe-rencia, especificando que parte del dispositivo va dirigida la transferencia. En caso generalcuando se pregunta por descriptores del dispositivo esto significara que se desean recibirdatos (Device-to-Host) y para ello se fija el valor de bmRequestType en “0x80”. Por locontrario cuando una peticion es para fijar algun valor dentro del dispositivo, esto sig-nificara que la direccion de los datos es Host-to-Device, por lo que el valor debera de ser“0”. Los dos valores mencionados son estandar para las peticiones basicas (Standard Re-quest), sin embargo una clase especifica de dispositivo o algun fabricante pueden soportarotros valores. En el codigo realizado para el host se definieron los siguientes valores de usomuy comun:

125

APENDICE D. CONSTRUCCION DE LAS PETICIONES

#define DTH 0x80 //device to host

#define HTD 0x00 //host to device

bRequest: Este campo especifica una de las 11 peticiones standard que se pueden consul-tar, cada una de ellas realiza una funcion o tarea diferente y tienen un valor fijo solo parael campo bRequest. Las peticiones tienen el mismo valor para todos los protocolos USB (USB 1.1 y USB 2.0) y no hay nuevas peticiones o variacion de funciones de un protocoloa otro. Todas las posibles peticiones con sus respectivos valores se muestran en el cuadroD.2. Algunos de los valores estan reservados para futuros usos.

Nombre Valor Nombre Valorget status 0 set descriptor 7clear feature 1 get configuration 8reservado 2 set configuration 9set feature 3 get interface 10reservado 4 set interface 11set adress 5 synch frame 12get descriptor 6

Cuadro D.2: Peticiones Standard.

Las definiciones son las siguientes:

#define GET_STATUS 0x00

#define CLEAR_FEATURE 0x01

#define SET_FEATURE 0x03

#define SET_ADDRESS 0x05

#define GET_DESCRIPTOR 0x06

#define SET_DESCRIPTOR 0x07

#define GET_CONFIG 0x08

#define SET_CONFIG 0x09

#define GET_INTERFACE 0x0a

#define SET_INTERFACE 0x0b

#define SYNCH_FRAME 0x0c

Es importante no confundir por ejemplo SET ADRESS con set adress(), lo primerodefine la peticion dentro del Setup Packet y lo segundo es la peticion que realiza la rutinapara la cual fue disenada.

wValue: Este campo varıa segun la peticion que se este realizando, cada peticion tienesu propio valor para wValue, pero algunos pueden definir un valor cero. La peticion parasolicitar los descriptores generales del los dispositivos (get descriptor) utilizan valores de-pendiendo sobre que cosa del dispositivo se desea solicitar, por ejemplo endpoint, configura-ciones, interfaces etc. Los valores que se puede utilizar para las peticiones estan estipuladosen el cuadro D.3.

126

APENDICE D. CONSTRUCCION DE LAS PETICIONES

Descriptor Tipo (wValue) Valordevice 1configuration 2string 3interface 4endpoint 5

Cuadro D.3: Tipos de descriptores.

Los tipos de descriptores van el byte mas significativo del campo wValue. Las defini-ciones para el codigo se muestran a continuacion:

#define DEVICE 0x0100

#define CONFIGURATION 0x0200

#define STRING 0x0300

#define INTERFACE 0x0400

#define ENDPOINT 0x0500

Para USB 2.0 se definen nuevos descriptores que son: DEVICE QUALIFIER, OTH-ER SPEED CONFIGURATION, INTERFACE POWER, pero que no son soportados porcontroladores USB 1.1.

wIndex: Este valor de 2 bytes varıa segun la peticion. Su uso no esta definido para unasola cosa. Por ejemplo en algunas peticiones sirve para definir el numero del endpoint odefinir que interfaz se desea comunicar el host. Es un parametro especıfico.

wLength: Este campo solo tiene una funcion: indicar el largo del paquete de la transferen-cia en una segunda etapa. Esto es porque el host controlador, en este caso el SL811HS, es elque define a traves de sus registros de configuracion cuanto es el largo de los paquetes quese van a transmitir o recibir, en este caso controla el largo del Setup Packet, pero como seesta realizando una peticion al dispositivo este entrega una serie de datos en una segundaetapa que no pueden ser controlados directamente por el host, sino mas bien, es el campowLength quien determina el largo de los datos. El dispositivo nunca entregara mas datosde los que se indica en este valor o bien, si se define un valor cero para este campo nuncaretornarıa algun valor.

D.2. Funcion Request()

Para el controlador SL811HS las peticiones se realizan a traves de la funcion construidaRequest(). El codigo de la funcion junto con los comentarios de la construccion se muestraa continuacion:

127

APENDICE D. CONSTRUCCION DE LAS PETICIONES

int Request(BYTE bmRequestType,1

BYTE bRequest,2

WORD wValue,3

WORD wIndex,4

WORD wLength,5

BYTE adress,6

char *ptr7

)8

9

int i, menor; int overflow;10

11

12

wr811(BUFADR,0x10); //Comienza el buffer en la direccion 0x1013

wr811(BUFLEN,8); //Reserva 8 bytes para el setup packet14

wr811(FNADDR,adress); //datos de control todos en la direccion15

16

//setup packet17

wr811(0x10, bmRequestType) ; // bmRequestType18

wr811(0x11, bRequest) ; // bRequest19

wr811(0x12, (wValue & 0x00FF)); // wValueL20

wr811(0x13,((wValue & 0xFF00)>>8)); // wValueH21

wr811(0x14, (wIndex & 0x00FF)); // wIndexL22

wr811(0x15,((wIndex & 0xFF00)>>8) ); // wIndexH23

wr811(0x16, (wLength & 0x00FF)); // wLengthL24

wr811(0x17,((wLength & 0xFF00)>>8) ); // wLengthH25

26

//envio del Setup Packet27

result = 0; while(!(result & 0x01)) //ACK=0x01.28

29

wr811(PID_EP,SETUP_PID); //Configura un PID tipo s.Packet, endpoint030

result=go(0x07); // Envıa el S.Packet DIREC=1(out), ENAB=1, ARM=1(0x07)31

32

33

34

//reconfigura el tama~no del endpoint IN y del largo del buffer.35

if (buffer_bMaxPacketSize0<=wLength)36

menor=buffer_bMaxPacketSize0;37

else menor=wLength;38

wr811(BUFLEN,buffer_bMaxPacketSize0); //asigna al buffer el tama~no mınimo del paquete.39

40

41

/*recibir datos de control en la pipe, si no hay datos por recibir42

se debe recibir un Handshake como IN*/ wr811(PID_EP,IN_PID); //43

PID tipo IN en endpoint044

45

do 46

result = 0;47

while(!(result & 0x01) && !(result==BIT6)) //ACK o STALL sale.48

// Si hay NAK vuelve a pedir datos.49

waitframes(4);50

result=go(0x03);51

52

53

if ((result==BIT6) | wLength==0) //si hay STALL o no hay datos que recibir sale.54

55

overflow=0;56

128

APENDICE D. CONSTRUCCION DE LAS PETICIONES

return 0; //retorna 0 en caso de error.57

58

59

else60

overflow=rd811(4);61

for(i=0;i<menor;i++)62

*ptr++=rd811(0x10+i); // se copian los datos a la ram63

64

//end do65

66

while (overflow ==0); //repite todo, hasta el overflow.67

68

return 1; //retorna 1 en caso de exito 69

La funcion Request() retorna el valor “1” en el caso de exito, de lo contrario retorna elvalor “0”. Se debe tambien mencionar que la funcion soporta al mismo tiempo las transfe-rencias de datos del tipo Control-No-Data y Control-Read. Para el primer caso en donde laspeticiones no retornan datos (Control-No-Data), la transferencia de control por lo menosdebe recibir un Data-IN para el handshake, a su vez el parametro de entrada ptr debe usarun puntero nulo1.

D.2.1. Ejemplo de la construccion de la peticion Set Adress

El siguiente codigo ilustra la construccion de la peticion Set Adress usando la funcionRequest() y las definiciones.

int Set_Adress(WORD adress_nueva)

return Request(HTD, SET_ADDRESS,adress_nueva, 0x00, 0x00,0, (char *) 0);

La funcion Set Adress es una de las mas simples de implementar porque no retornadatos (puntero nulo) y ademas no depende de ninguna otra peticion.

1Un puntero nulo es igual a (char *)0.

129

Apendice E

Construccion de los comandosSCSI

En este apendice se encuentra el detalle de los comandos SCSI que permiten la lecturay escritura de datos. Junto con ello, se muestra el llenado del buffer para el posterior envıodel bloque de comando CBW.

E.0.2. INQUIRY

El comando INQUIRY permite obtener informacion generalizada del dispositivo. Elcodigo de operacion corresponde al valor 0x12. El formato se muestra en el cuadro E.1.

Cuadro E.1: Campo de envıo del comando INQUIRY.

El campo Allocation Length especifica el largo de bytes que se quieren retornar, el maxi-mo valor es de 0x24 (formato general del retorno). Un valor distinto del valor maximo nocausa error de comando. El campo Page Code es de valor cero (no es soportado en los pen-drives). Por ultimo el campo Allocation Length especifica la particion logica del dispositivo(0 a 7).

130

APENDICE E. CONSTRUCCION DE LOS COMANDOS SCSI

El bloque CBW en conjunto con el comando INQUIRY se envıa en la pipe Bulk delendpoint Out del dispositivo. El llenado del buffer en el SL811HS, con el envıo del paqueteal endpoint correspondiente, se muestra a continuacion.

void CBW_INQUIRY()1

2

/*-----------------------------------------------------------------3

* se rellena el comando CBW en el buffer y se envıa como Data Out4

*---------------------------------------------------------------*/5

6

wr811(BUFADR,0x10); // inicio del buffer.7

wr811(BUFLEN,0x1F); // reserva 31 bytes.8

9

//dCBWSignature.10

wr811(0x10,0x55);11

wr811(0x11,0x53);12

wr811(0x12,0x42);13

wr811(0x13,0x43);14

15

//dCBWTag. aleatorio para identificar.16

wr811(0x14,0x71);17

wr811(0x15,0x72);18

wr811(0x16,0x73);19

wr811(0x17,0x74);20

21

//dCBWDataTransferLength.22

wr811(0x18,0x24); // 36 bytes de regreso.23

wr811(0x19,0x00);24

wr811(0x1A,0x00);25

wr811(0x1B,0x00);26

27

//bmCBWFlags28

wr811(0x1C,0x80);29

30

//bCBWLUN31

wr811(0x1D,0x00);32

33

//bCBWCBLength34

wr811(0x1E,0x06);35

36

/* CBWCB (bloque de comando SCSI=INQUIRY)37

INQUIRY siempre tiene el mismo formato.*/38

39

wr811(0x1F,0x12); //codigo INQUIRY.40

wr811(0x20,0x00); //Logical Unit Number.41

wr811(0x21,0x00);42

wr811(0x22,0x00);43

wr811(0x23,0x24); //Allocation Length.44

wr811(0x24,0x00);45

wr811(0x25,0x00);46

wr811(0x26,0x00);47

wr811(0x27,0x00);48

wr811(0x28,0x00);49

131

APENDICE E. CONSTRUCCION DE LOS COMANDOS SCSI

wr811(0x29,0x00);50

wr811(0x2A,0x00);51

wr811(0x2B,0x00);52

wr811(0x2C,0x00);53

wr811(0x2D,0x00);54

wr811(0x2E,0x00);55

56

//se envıa como Data Out.57

result = 0;58

while( !(result & 0x01) )59

60

wr811(PID_EP,OUT_PID EndBulk.OutDir);61

waitframes(4);62

result=go((0x07 DATA_OUT ));63

64

DATA_OUT ^= BIT6;65

66

Cuando se realiza el comando INQUIRY, los datos que retornan se reciben como DATA-IN, en donde ademas, deben ser recibidos por el controlador SL811HS en forma de Data-Toggle (DATA1 y DATA0 alternadamente). Esta acotacion es valida para todos los coman-dos SCSI que reciben datos. Los campos que retorna el comando INQUIRY es mostradoen el cuadro E.2.

Cuadro E.2: Campos de retorno del comando INQUIRY.

132

APENDICE E. CONSTRUCCION DE LOS COMANDOS SCSI

E.0.3. READ(10)

El comando READ(10) permite realizar transferencia de datos desde los dispositivos alhost. Tiene un codigo de operacion de 0x28. El formato se muestra en el cuadro E.3.

Cuadro E.3: Formato del comando READ(10).

Los campos DPO, FUA y RelAdr deben tener el valor 0.

El bloque CBW en conjunto con el comando READ(10) se envıa en la pipe Bulk delendpoint Out del dispositivo. El llenado del buffer en el SL811HS, con el envıo del paqueteal endpoint correspondiente, se muestra a continuacion.

void CBW_READ(DWORD sector, BYTE veces)1

2

/*----------------------------------------------------------------3

* se rellena el comando CBW en el buffer y se envıa como Data Out4

*---------------------------------------------------------------*/5

6

wr811(BUFADR,0x10); // inicio del buffer.7

wr811(BUFLEN,0x1F); // reserva 31 bytes.8

9

//dCBWSignature.10

wr811(0x10,0x55);11

wr811(0x11,0x53);12

wr811(0x12,0x42);13

wr811(0x13,0x43);14

15

//dCBWTag. aleatorio para identificar.16

wr811(0x14,0x71);17

wr811(0x15,0x72);18

wr811(0x16,0x73);19

wr811(0x17,0x74);20

21

//dCBWDataTransferLength (512 bytes).22

wr811(0x18,0x00);23

133

APENDICE E. CONSTRUCCION DE LOS COMANDOS SCSI

wr811(0x19,0x02);24

wr811(0x1A,0x00);25

wr811(0x1B,0x00);26

27

//bmCBWFlags28

wr811(0x1C,0x80);29

30

//bCBWLUN31

wr811(0x1D,0x00);32

33

//bCBWCBLength34

wr811(0x1E,0x0A);35

36

/* CBWCB (bloque de comando SCSI) */37

38

//Operation Code39

wr811(0x1F,0x28);40

wr811(0x20,0x00);41

42

//Logical Block Address43

wr811(0x21,((sector & 0xFF000000)>>24));44

wr811(0x22,((sector & 0xFF0000)>>16));45

wr811(0x23,((sector & 0xFF00)>>8));46

wr811(0x24,(sector & 0x00FF));47

48

//Reservado49

wr811(0x25,0x00);50

51

//Transfer Length (MSB)52

wr811(0x26,0x00);53

54

//Transfer Length (LSB)55

wr811(0x27,veces);56

57

//reservado58

wr811(0x28,0x00);59

wr811(0x29,0x00);60

wr811(0x2A,0x00);61

wr811(0x2B,0x00);62

wr811(0x2C,0x00);63

wr811(0x2D,0x00);64

wr811(0x2E,0x00);65

66

//se envıa como Data Out.67

result = 0;68

while( !(result & 0x01) )69

70

wr811(PID_EP,OUT_PID EndBulk.OutDir);71

waitframes(4);72

result=go((0x07 DATA_OUT ));73

74

DATA_OUT ^= BIT6;75

76

En la funcion anterior, el parametro sector indica la direccion del sector que se desealeer. El parametro veces indica la cantidad de bloques (512 bytes) que se desean leer con-

134

APENDICE E. CONSTRUCCION DE LOS COMANDOS SCSI

secutivamente.

E.0.4. WRITE(10)

El comando WRITE(10) permite transferir datos desde el host al dispositivo. Tiene uncodigo de operacion de 0x2A. El formato de los campos se muestra en el cuadro E.4.

Cuadro E.4: Campo de envıo del comando INQUIRY.

Los campos DPO, FUA y RelAdr deben tener el valor 0.

El bloque CBW en conjunto con el comando WRITE(10) se envıa en la pipe Bulk delendpoint Out del dispositivo. El llenado del buffer en el SL811HS, con el envıo del paqueteal endpoint correspondiente, se muestra a continuacion.

void CBW_WRITE(DWORD sector, BYTE veces)1

2

/*----------------------------------------------------------------3

* se rellena el comando CBW en el buffer y se envıa como Data Out4

*---------------------------------------------------------------*/5

6

wr811(BUFADR,0x10); // inicio del buffer.7

wr811(BUFLEN,0x1F); // reserva 31 bytes.8

9

//dCBWSignature.10

wr811(0x10,0x55);11

wr811(0x11,0x53);12

wr811(0x12,0x42);13

wr811(0x13,0x43);14

15

//dCBWTag. aleatorio para identificar.16

wr811(0x14,0x71);17

wr811(0x15,0x72);18

wr811(0x16,0x73);19

135

APENDICE E. CONSTRUCCION DE LOS COMANDOS SCSI

wr811(0x17,0x74);20

21

//dCBWDataTransferLength.22

wr811(0x18,0x00);23

wr811(0x19,0x02);24

wr811(0x1A,0x00);25

wr811(0x1B,0x00);26

27

//bmCBWFlags28

wr811(0x1C,0x00);29

30

//bCBWLUN31

wr811(0x1D,0x00);32

33

//bCBWCBLength34

wr811(0x1E,0x0A);35

36

/* CBWCB (bloque de comando SCSI) */37

38

//Operation Code39

wr811(0x1F,0x2A);40

wr811(0x20,0x00);41

42

//Logical Block Address43

wr811(0x21,((sector & 0xFF000000)>>24));44

wr811(0x22,((sector & 0xFF0000)>>16));45

wr811(0x23,((sector & 0xFF00)>>8));46

wr811(0x24,(sector & 0x00FF));47

48

//Reservado49

wr811(0x25,0x00);50

51

//Transfer Length (MSB)52

wr811(0x26,0x00);53

54

//Transfer Length (LSB)55

wr811(0x27,veces);56

57

//reservado58

wr811(0x28,0x00);59

wr811(0x29,0x00);60

wr811(0x2A,0x00);61

wr811(0x2B,0x00);62

wr811(0x2C,0x00);63

wr811(0x2D,0x00);64

wr811(0x2E,0x00);65

66

//se envıa como Data Out67

result = 0;68

while( !(result & 0x01) )69

70

wr811(PID_EP,OUT_PID EndBulk.OutDir);71

waitframes(4);72

result=go((0x07 DATA_OUT ));73

74

DATA_OUT ^= BIT6; 75

136

APENDICE E. CONSTRUCCION DE LOS COMANDOS SCSI

En la funcion anterior, el parametro sector indica la direccion del sector que se deseaescribir. El parametro veces indica la cantidad de bloques (512 bytes) que se desean escribirconsecutivamente.

Una vez enviado el comando CBW se deben recibir o enviar los datos, para luego fi-nalizar la lectura del bloque CSW. Las funciones completas de lectura, escritura e INQUIRYse muestran a continuacion:

E.0.5. Funcion de lectura de sectores, Leer Sector()

int Leer_Sector(DWORD sect_leer, BYTE veces, char *ptr)

int factor,i;

factor=(veces*512/EndBulk.InSize);

/* 1. Se envıa el comando CBW con Data OUT. */

CBW_READ(sect_leer,veces);

/* 2. Se reciben los datos del tipo DATA-IN en el puntero ptr */

for(i=0;i<factor;i++)

ptr=Recive_IN_DTOGGLE(ptr);

/*3. Se pide el comando(CSW) como DATA-IN y se copia en el arreglo CSW_BUFF de 13B*/

Recive_IN_DTOGGLE(CSW_BUFF);

return 1;

E.0.6. Funcion de escritura de sectores, Escribir Sector()

int Escribir_Sector(DWORD sect_escr, BYTE veces, char *ptr)

int factor,i;

factor=(veces*512/EndBulk.OutSize);

/* 1. Se envıa el comando CBW con DATA-OUT. */

CBW_WRITE(sect_escr,veces);

/* 2. Se envıan los datos como DATA-OUT que estan en el puntero ptr.*/

for(i=0;i<factor;i++)

ptr=BuffWr811(0x10, EndBulk.OutSize,ptr);

OUT_DTOGGLE();

/*3. Se pide el comando(CSW) como DATA-IN y se copia en el arreglo CSW_BUFF de 13B*/

Recive_IN_DTOGGLE(CSW_BUFF);

return 1;

E.0.7. Funcion INQUIRY

INQUIRY(char *ptr)

137

APENDICE E. CONSTRUCCION DE LOS COMANDOS SCSI

int factor, i;

if(EndBulk.InSize==8)

factor=4;

if(EndBulk.InSize==16)

factor=2;

if(EndBulk.InSize>=32)

factor=1;

/* 1. Se Envia el comando CBW con data OUT. */

CBW_INQUIRY();

/* 2. Se reciben los datos del tipo DATA-IN en el puntero ptr */

for(i=0;i<factor;i++)

ptr=Recive_IN_DTOGGLE(ptr);

/*3. Se pide el comando(CSW) como DATA-IN y se copia en el arreglo CSW_BUFF de 13B*/

Recive_IN_DTOGGLE(CSW_BUFF);

138

Apendice F

Estructura de informacion FAT16

En este apendice se encuentra la informacion de la estructura FAT16. Tambien se in-cluye la informacion respecto a los formatos de nombres DOS 8.3 y LFN.

F.0.8. Master Boot Record

EL sector llamado MBR (Master Boot Record) informa sobre las diversas particiones(unidades logicas) que existen. Se ubica en los primeros 512 bytes (primer sector de memoriapara los pendrive y Cylinder 0, Head 0, Sector 1, para discos rıgidos). El cuadro F.1 mues-tra los campos que pertenecen al sector MBR, con sus respectivas posiciones y tamanos.

Posicion Descripcion Largo000h Codigo ejecutable (booteable) 446 bytes1BEh 1o Particion 16 bytes1CEh 2o Particion 16 bytes1DEh 3o Particion 16 bytes1EEh 4o Particion 16 bytes1FEh Identificador (55h AAh) 2 bytes

Cuadro F.1: Master Boot Record.

Posicion Descripcion Largo00h Estado de la particion (00h=Inactiva, 80h=Activa) 1 bytes01h Inicio de la particion - Head 1 bytes02h Inicio de la particion - Cylinder/Sector 2 bytes04h Tipo de particion 1 bytes05h Fin de la particion - Head 1 bytes06h Fin de la particion - Cylinder/Sector 2 bytes08h Numero del sector donde se inicia la particion 4 bytes0Ch Numero de sectores en la particion 4 bytes

Cuadro F.2: Informacion de los 16 bytes para cada particion.

139

APENDICE F. ESTRUCTURA DE INFORMACION FAT16

El significado de los 16 bytes que entrega los datos con respecto a las particiones 1, 2,3 y 4, se muestran en el cuadro F.2. Los datos mas importantes que muestra el cuadroF.2, donde ademas fueron considerados para el posterior acceso a las particiones de losdispositivos (pendrives), son los siguientes:

Estado de la particion, Posicion 00h: Indica si la particion esta activa o inactiva.

Tipo de particion, posicion 04h: Indica el tipo de formato de la particion. Los valoresse encuentran en el cuadro F.3. Para el caso de los pendrives el valor corresponde a 06h,equivalente a decir que es una particion tipo FAT16.

Valor Tipo de particion00h Desconocida01h 12-bit FAT04h 16-bit FAT (Particiones menores a 32MB)05h Particion Extendida MS-DOS06h 16-bit FAT (Particiones mayores o iguales a 32MB)0Bh 32-bit FAT (Particiones mayores o iguales 2048GB)

Cuadro F.3: Tipos de particiones.

Sector de inicio, posicion 08h: Indica en que sector de memoria comienza la particion.En caso que no exista el sector MBR, el inicio de la particion correspondera al sector 0x00.

Numero de sectores en la particion, posicion 0Ch: Indica cuantos sectores tiene laparticion. Esto incluye la estructura interna de la particion (PBR, FAT1, FAT2, tabla dedirectorios, sectores reservados y area de datos), por lo cual no corresponde al espacio totaldisponible.

El tamano de cada bloque interno de la particion, en conjunto con otra informacionrelevante que se proporciona sobre la particion, viene establecido en el primer sector decada particion, llamado sector PBR (Partition Boot Record).

140

APENDICE F. ESTRUCTURA DE INFORMACION FAT16

F.0.9. Partition Boot Record

El cuadro F.4 muestra la organizacion del sector PBR (Partition Boot Record) paraFAT16.

Posicion Descripcion Largo (bytes)000h Jump Code + NOP 3B003h Nombre OEM 8B00Bh Bytes por Sector 2B00Dh Sectores por Cluster 1B00Eh Sectores Reservados 2B010h Numero de Copias de FAT 1B011h Maximo Root Directory 2B013h Numero de Sectores en la Particion menor a 32MB 2B015h Media Descriptor (F8h para discos duros) 1B016h Sectores por Fat 2B018h Sectores por Track 2B01Ah Numero de Heads 2B01Ch Numero de sectores escondidos en la Particion 4B020h Numero de sectores en la Particion 4B024h Numero del Logical Drive de la Particion 2B026h Firma (29h) 1B027h Serial de la Particion 4B02Bh Nombre de la Particion 11B036h Nombre de la FAT (FAT16) 8B03Eh Codigo Ejecutable 448B1FEh Marca de Termino (55h AAh) 2B

Cuadro F.4: Campos del sector Partition Boot Record.

Obteniendo los datos del sector PBR (inicio de la particion), se determina la posicionde los otros sectores importantes:

Tabla de directorios = inicio de la particion + sectores reservados + 2 x (sectores porfat)

Tabla FAT1 = inicio de la particion + sectores reservados

Tabla FAT2 = FAT1 + (tabla de directorios)/2

Area de datos = tabla de directorio + ((maximo root directory)*32/bytes por sector)

141

APENDICE F. ESTRUCTURA DE INFORMACION FAT16

F.1. Formatos DOS 8.3 y LFN (Long File Name)

En el cuadro F.7 muestra el formato para nombres DOS 8.3 (nombres cortos).

Offset Tamano Contenido0 8 bytes nombre8 3 bytes extension11 1 byte atributo(00ARSHDV)

0: unused bita: archive bitr: read-only bits: system bitd: directory bitv: volume bit

22 2 bytes time24 2 bytes date26 2 bytes cluster28 4 bytes tamano de archivo

Cuadro F.5: Formato de nombres cortos para DOS 8.3.

El formato de nombre LFN incluye al formato 8.3, agregando nuevos campos que noafecta a los nombres del antiguo formato 8.3, para que estos puedan ser reconocidos en sis-temas nuevos y antiguos. El formato LFN para nombres cortos se muestra en el cuadro F.6.

Offset Tamano Contenido0 8 bytes nombre8 3 bytes extension11 1 byte atributo(00ARSHDV)

0: unused bita: archive bitr: read-only bits: system bitd: directory bitv: volume bit

12 1 byte 0 (reservado para Windows NT)13 1 byte hora de creacion; milisegundos14 2 bytes hora de creacion; hora y minuto16 2 bytes fecha de creacion18 2 bytes ultimo dıa de acceso20 2 bytes 0 (reservado para OS/2)22 2 bytes time24 2 bytes date26 2 bytes cluster28 4 bytes tamano de archivo

Cuadro F.6: Formato de nombres cortos para LFN.

142

APENDICE F. ESTRUCTURA DE INFORMACION FAT16

El formato LFN para nombres largos se muestra a continuacion:

Offset Tamano Contenido0 1 bytes ordinal field1 2 bytes unicode caracter 13 2 byte unicode caracter 25 2 byte unicode caracter 37 2 byte unicode caracter 49 2 bytes unicode caracter 511 1 bytes attribute12 1 bytes type (reservado; siempre 0)13 1 bytes checksum14 2 bytes unicode caracter 616 2 bytes unicode caracter 718 2 bytes unicode caracter 820 2 bytes unicode caracter 922 2 bytes unicode caracter 1024 2 bytes unicode caracter 1126 2 bytes cluster (sin uso; siempre 0)28 2 bytes unicode caracter 1230 2 bytes unicode caracter 13

Cuadro F.7: Formato de nombres largos para LFN

El campo ordinal field corresponde un valor a partir de 1, que indica el orden de la cade-na del nombre. El nombre total se puede repartir a lo largo de diferentes bloques de 32 bytes.

El campo checksum corresponde a los 11 caracteres en formato 8.3. La operacion paracalcular el checksum se muestra a continuacion:

for (sum = i = 0; i < 11; i++)

sum = (((sum & 1) << 7) ((sum & 0xfe) >> 1)) + name[i];

El valor de name[i] corresponde al valor ASCII de cada caracter.

143

Apendice G

Glosario.

En esta seccion se incluyen las principales abreviaciones, terminos, palabras y proto-colos, utilizados en el desarrollo de la memoria. Orientado principalmente a las personasque desean obtener una vision generalizada de los terminos mas comunes que se usan en latecnologıa USB.

A

ACK:Acknowledged o reconocimiento. Este paquete es transmitido cuando el host o el dispositi-vo han recibido satisfactoriamente los datos sin errores. El dispositivo retorna un ACK enel handshake para transacciones OUT o SETUP. En cambio, el host retorna este paquetesolo para transacciones tipo IN.

B

BCD:Codigo Decimal Binario.

Bulk:Una de los cuatro tipos de transferencia que realizan los endpoint para transportar datos

en el protocolo USB. La transferencia Bulk, garantiza la entrega de datos libre de errores.

Bulk-Only:Protocolo de transporte para dispositivos de almacenamiento masivos.

144

APENDICE G. GLOSARIO.

Bus Enumeracion:Deteccion, identificacion y configuracion de un dispositivo USB. Esto incluye: detec-tar la velocidad del dispositivo, asignar una direccion unica al dispositivo y obtenerlos multiples descriptores para la eleccion del driver adecuado.

C

CBI:Control-Bulk-Interrupt. Primer protocolo usado para el transporte de datos en dispositivosde almacenamiento masivo. Actualmente esta obsoleto.

CBW:Command Block Wrapper. Corresponde a un bloque de comando encapsulado utilizado enlos dispositivos de almacenamiento masivo, indicando: la inicializacion de la transferenciay el tipo de operacion a realizar con el dispositivo.

Class o Clases:Agrupaciones de dispositivos USB que reunen similares caracterısticas de funcionamiento

y proposito. La comunicacion entre el host y los dispositivos es similar para los dispositivosde una misma clase. Las clases estan normalizadas por USB-IF.

Control:Una de los cuatro tipos de transferencia que realizan los endpoint para transportar datos

en el protocolo USB. Se utiliza para el transporte inicial de las peticiones (request) que seencargar de configurar un dispositivo USB.

CRC:Verificacion de Redundancia Cıclica. Se usa para proteger los paquetes que se envıan en

el protocolo USB.

CSW:Command Status Wrapper. Es la respuesta del comando CBW que contiene la informaciondel estado de la transferencia.

D

DATA Packet:Consiste en una de las tres fases de las transacciones que se producen en la trama USB. Lafase DATA Packet se compone de un paquete PID, un paquete DATA que lleva los datosreales de la transaccion y finaliza con un paquete de correccion CRC de 16 bits.

145

APENDICE G. GLOSARIO.

DMA:Direct Memory Access.

Downstream:Indica que la direccion de las transferencias va desde el host al dispositivo.

E

Endpoint:Puertos que tienen los dispositivos USB para que el host controlador los utilice, con fin

de realizar las multiples transferencias. El maximo de puertos que puede tener un dispo-sitivo es de 16 endpoint. Existen cuatro tipos de endpoint: Control, Bulk, Isochronous eInterrupt. Ademas, cada endpoint tiene asociado un sentido de la transferencia (In-Out),y un tamano maximo de transporte de datos.

EOP:End Of Packet. Fin del paquete en una trama.

F

FireWire o IEEE-1394:Interfaz de comunicacion de alta velocidad para dispositivos perifericos. Este protocolo

busca el mismo proposito que el protocolo USB. La implementacion de la interfaz IEEE-1394 fue desarrollada por la companıa Apple.

Frame:Dirıjase a la definicion de trama.

FS:Abreviacion de full-speed.

Full-Speed:Velocidad de transmision de 12 Mbps, con proposito para disenos de dispositivos que re-

quieren grandes velocidades de transmision.

H

HID:Human interface Device. Corresponde a la clase de dispositivos que interactuan directa-

mente con las personas.

146

APENDICE G. GLOSARIO.

High-Speed:Velocidad de transicion de 480 Mbps, solo disponible en el protocolo USB 2.0.

Host Controlador:Es el responsable de gestionar todas las transacciones y transferencias entre los perifericos(USB) y el microcontrolador. El host se encarga de obtener los datos necesarios del dispo-sitivo para cargar el driver adecuado. El host controlador puede ser implementado usandouna combinacion entre hardware, firmware y software.

HUB USB:Dispositivo USB que entrega la posibilidad de aumentar la cantidad de conexion (puertos)de dispositivos USB. La maxima cantidad de dispositivos que se puede realizar es de 127perifericos.

I

IAR Embedded Workbench:Software para programar los microcontroladores MSP430 de Texas Instruments.

IDLE:Indica reposo en la lınea de transmision. El estado IDLE es necesario para permitir:

transferencias, detectar la conexion/desconexion de los dispositivos y discriminar entre dis-positivos LS/FS.

Interrupt:Uno de los cuatro tipos diferentes de transferencias que se realizan con los endpoint. Este

tipo de comunicacion incorpora deteccion de errores y retransmision de datos. Es utilizadopor aquellos dispositivos que desean transferir muy poca informacion y ademas poco fre-cuente, asegurando la lectura de los datos dentro de un perıodo maximo de tiempo.

Isochronous:Uno de los cuatro tipos diferentes de transferencias que se realizan con los endpoint. Ha

sido desarrollado especialmente para satisfacer las demandas de la transmision de tiemporeal de voz, video e imagenes.

L

Low-Speed:Velocidad mas baja que se encuentra disponible en los dispositivos USB. La velocidad

corresponde a 1.5 Mbps, donde tıpicamente es usado por los dispositivos como teclados ymouse.

147

APENDICE G. GLOSARIO.

LS:Abreviacion de low-speed.

M

MBR:Master Boot Record. Corresponde al primer sector de memoria de un dispositivo de alma-cenamiento (discos duros o pendrives). El sector MBR entrega informacion de las diversasparticiones que se encuentran activas, indicando la direccion y el tipo de formato.

Microtrama o microframe:Segmentos de tiempos de 125 microsegundos del bus de datos para realizar las transaccio-nes. Esta definicion es aplicable solo a los buses high-speed del protocolo USB 2.0.

MSD:Clase USB llamada Mass Store Device. Corresponde a los dispositivos que tienen la ca-

pacidad de almacenamiento y transporte de datos. Los dispositivos tıpicos que se puedenencontrar en esta clase son: diskette, discos duros, CD-ROM, DVD y pendrives.

N

NAK:Not Acknowledged o Reconocimiento Negativo. Este paquete es transmitido cada vez que

el dispositivo no esta listo para una operacion, tanto de transmision como de recepcion depaquetes.

NRZI:Non Return Zero Inverted. Corresponde a un metodo de codificacion de datos que se utilizaen el protocolo USB. Este consiste en que la lınea cambia de nivel si se transmite un 0 y lalınea se mantiene si transmite un 1.

O

OTG:On-The-Go. Protocolo USB desarrollado con el fin de establecer una comunicacion directaentre lo diversos dispositivos USB.

148

APENDICE G. GLOSARIO.

P

PBR:Partition Boot Record. Primer sector de cada particion en donde se encuentra los datos

revelantes sobre la estructura y distribucion de los datos.

Peticiones:Las peticiones o request, son una serie de instrucciones definidas por USB-IF que permitena los controladores USB la interrogacion y configuracion de los dispositivos. La interrogacionpermite obtener informacion clave para la asignacion de un driver adecuado. USB-IF nor-maliza las peticiones en el capıtulo 9 de los protocolos USB 1.1 y USB 2.0

PID:Corresponde a 8 bits de una trama que identifican el tipo de paquete que se esta enviandoo recibiendo.

Pipe:Nombre para indicar los caminos virtuales que recorren los datos entre el endpoint y el host.

R

Request:Dirıjase a la definicion de peticiones.

S

SCSI-2:Small Computer Systems Interface. Serie de comandos reducidos para realizar operacionescomo lectura y escritura de datos en los discos rıgidos. Estos comandos son aplicables a lospendrives siempre y cuando lo soporten.

SE0:Single Ended Zero. Las senales D+ y D- del cable USB tienen el valor de 0 Volts. Se utilizapara: detectar la conexion/desconexion de dispositivos, indicar el fin de paquete (EOP) ypara generar reset.

SL811HS:Controlador USB de la companıa: Cypress Semiconductor Corporation. El controlador

permite realizar transferencias segun el protocolo USB 1.1

149

APENDICE G. GLOSARIO.

Slave:Termino comun, para referirse a cualquier dispositivo USB.

SOF:Start Of Frame. Inicio de la trama, se repite cada 1 milisegundo.

SOP:Start Of Packet. Inicio de un paquete en una trama.

STALL:El handshake STALL puede tener tres tipos significado: No soporta una peticion de con-

trol (no existe), la peticion de control ha fallado o el endpoint no existe. En el caso que elendpoint falle, el dispositivo es incapaz de recibir o trasmitir los datos. El comando STALLes transmitido hacia arriba (upstream) solo por los dispositivos, y pueden ser recibidosunicamente por el controlador, el cual debe intervenir para solucionar el problema antes deque la comunicacion puede ser reanudada.

T

Trama o Frame:Segmentos de tiempos de 1 milisegundo del bus de datos, en donde se realizan las tran-

sacciones. Aplicable a los buses low-speed y full-speed.

U

UFI:USB Floppy Interface. Son comandos unificados en base a los comandos SCSI-2 y SFF-

8070i.

Upstream:Indica que la direccion de la transferencia es desde el dispositivo al host. Termino muy

recurrente en los dispositivos como los hub USB.

USB:Protocolo de comunicacion Universal Serial Bus.

USB-IF:USB Implementers Forum S.A. Organismo oficial que se encarga de las normas de la

tecnologıa USB. Su pagina web (www.usb.org) cuenta con herramientas y documentostecnicos, que permiten el desarrollo de los dispositivos.

150

APENDICE G. GLOSARIO.

W

WUSB:Wireless Universal Serial Bus. Corresponde al mas reciente protocolo USB, desarrollado

para conectividades inalambricas.

151

Bibliografıa

Textos:

-“Usb Design By Example”:John Hyde, Intel.

-“USB System Architecture (USB 2.0)”:Don Anderson.

-“USB Complete”:Jan Axelson, tercera edicion.

-“Developing USB PC Peripherals”:Wooi Ming Tan.

-“USB Hardware And Software”:John Garney, Ed Solari, Shelagh Callahan, Kosar Jaff, Bradd Hosler.

-“Tecnicas De Diseno Con Microcontrolador MSP430”:Memoria presentada por Jaime A. Zuniga Camiruaga, UTFSM.

Documentos tecnicos:

-“Universal Serial Bus Specification 1.1”:Revision 1.1 Septiembre 23, 1998, http://www.usb.org.

-“Universal Serial Bus Specification 2.0”:Revision 2.0 Abril 27, 2000, http://www.usb.org.

-“Wireless Universal Serial Bus Specification 2.0”:Revision 1.0, http://www.usb.org.

-“Universal Serial Bus Common Class Specification”:Revision 1.0 Diciembre 16, 1997, http://www.usb.org/developers/devclass.html.

152

-“Universal Serial Bus Mass Storage Class, Bulk-Only Transport”:Revision 1.0, http://www.usb.org/developers/devclass.html.

-“Universal Serial Bus Mass Storage Class, Control/Bulk/Interrup (CBI) Transport”:Revision 1.1, http://www.usb.org/developers/devclass.html.

-“Device Class Definition for Human Interface Devices (HID)”:Revision 1.11, http://www.usb.org/developers/devclass.html.

-“SL811HS Embedded USB Host/Slave Controller”:Cypress Semiconductor Corporation.

-“Basic Embedded Host Using the SL811HS”:Cypress Semiconductor Corporation.

-“Interfacing an External Processor to the SL811HS/S”:Cypress Semiconductor Corporation.

-“Errata for SL811HS Embedded USB Host/Slave Controller”:Cypress Semiconductor Corporation.

-“SCSI Block Commands - 2 (SBC-2)”:INCITS, Revision 13, http://www.t10.org/drafts.htm.

-“Un paseo por los dispositivos de almacenamiento masivo USB”:Soporte Tecnico FUJITSU Espana, Marzo de 2003.

-“Un Paseo Por USB-1”:Soporte Tecnico FUJITSU Espana, Marzo de 2000.

Sitios Webs:

-http://www.t10.org/drafts.htm

-http://www.usb.org

-http://www.intel.com/technology/usb