Almacenamiento Masivo en USB

De Departamento de Informatica
Saltar a: navegación, buscar
Ejemplo de Memoria USB de la clase Almacenamiento Masivo USB

Una memoria USB (de Universal Serial Bus), es un dispositivo de almacenamiento que utiliza una Memoria Flash para guardar información, estas memorias implementan el estándar "USB mass storage device class" o Especificación de Clase USB.

Las Memorias Flash implementan este estándar por lo tanto la mayoría de los sistemas operativos modernos pueden leer o escribir en dichas unidades sin drivers adicionales pudiendo utilizar drivers adaptativos (drivers que pueden controlar a los dispositivos en función de la propia información descriptiva proporcionada por el dispositivo). Estos drivers adaptativos compatibles con alguna Clase determinada se denominan drivers de Clase.

Un dispositivo (desde el punto de vista del sistema USB) puede tener distintas Configuraciones, funcionando de manera distinta para cada una de ellas. Para cada configuración el dispositivo se organiza (de manera distinta) como un conjunto de Interfaces donde cada Interfaz especifica que parte del Hardware (del dispositivo) interactúa con el sistema, estas partes interactuando se denominan Endpoints. Cada Interfaz también puede admitir varias Configuraciones cada uno con su propia colección de Endpoints. Resumiendo se tiene que un dispositivo es una colección de posibles Configuraciones, cada Configuración es una colección de Interfaces y cada Interfaz es una colección de Endpoints.

Una clase es un conjunto de dispositivos (o interfaces) los cuales comparten características o comportamiento en común. El uso principal, es abstraer la forma de comunicarse los dispositivos con el sistema. Los drivers del dispositivo USB sólo se comunican a través de pipes.

Los descriptores son estructuras que detallan la información al sistema, referido al nivel del dispositivo, configuración, interfaz y endpoint. Estos descriptores permiten la clasificación de los dispositivos dentro del sistema. La Clase, la Subclase y el Protocolo son los valores por los que se suelen clasificar. Con esto se busca asociar y localizar estos campos, a los campos que ya se encuentran en el sistema.

La especificación de Clase de Almacenamiento Masivo USB define como los dispositivos de almacenamiento masivo deben comportarse (protocolos de intercambio y/o formato de datos que reciben o transmiten). Existen 2 protocolos de transporte de comandos, Bulk-Only y CBI(Control-Bulk-Interrupt). Actualmente sólo se utiliza Bulk-Only, ya que Control-Bulk-Interrupt está obsoleto. Sin embargo, ambos están ya implementados en los sistemas operativos, y anteriormente era el fabricante quien decidía cual ocupar.

Contenido

Códigos de Clase, Subclase y Protocolo

Tal como comentamos arriba, existen 3 campos Clase (bInterfaceClass), SubClase (bInterfaceSubClass) y Protocolo (bInterfaceProtocol), los cuales pertenecen a Interface Descriptor, y nos entregarán información para saber como se comportará el sistema.

Clase

La Clase (bInterfaceClass) devuelve el valor 0x08, que identifica a la Clase de Almacenamiento Masivo.

SubClase

Código de SubClase para los Dispositivos de Almacenamiento Masivo

En la imagen mostrada a la derecha, se puede apreciar que bInterfaceSubClass, SubClase, nos entrega distintos valores dependiendo de la clase del dispositivo de almacenamiento masivo. En nuestro caso, al referirnos a los Dispositivos de Almacenamiento Masivo en USB, nos devuelve 06h, el cual tiene un juego de comandos SCSI-2(son una serie de comandos reducidos que permiten la interacción con los dispositivos que manejan datos, orientados a realizar acciones sobre discos rígidos).

Protocolo

Código de Protocolo para los Dispositivos de Almacenamiento Masivo

De acuerdo a la tabla presentada en el costado derecho, se entiende que el valor del protocolo entregado, nos indica la forma como se transporta el juego de comandos.


Los protocolos, serán explicados a continuación.

El protocolo de transporte Bulk-Only

Las Clases están determinadas (entre otras cosas) por las distintas formas de comunicarse con el sistema, utilizando para esto protocolos de transporte. Esta comunicación se genera a través de pipes donde el dispositivo se comunica con el Driver, se definen las pipes entre el sistema y los Endpoints del dispositivo.

El protocolo de transporte Bulk-Only transporta comandos, datos y estados únicamente a través de transferencias tipo Bulk. Para esto el dispositivo (o la interfaz) necesita solo dos Endpoints de tipo Bulk (Entrada/Salida) y además dos Endpoints de Control en la dirección 0 para así establecer una pipe por defecto. Se utiliza esta pipe (solamente) para enviar las peticiones de Clase y restablecer las pipes Bulk.

Peticiones de Clase

Para el protocolo Bulk-Only existen dos peticiones de Clase definidas:

  • Bulk-Only Mass Storage Reset, se utiliza para reiniciar el dispositivo o interfaz.
  • Get Max LUN, se utiliza para obtener el número de unidades lógicas disponibles en el dispositivo o interfaz.

Transferencias

Esquema que muestra como ocurre el transporte de datos en el protocolo Bulk-Only

Según este protocolo las transferencias se realizan encapsulando la información de comando (Bloque de Comando) en un paquete tipo DATA, este paquete contiene una estructura de datos denominada Command Block Wrapper (CBW). La información de estado, por su parte, se encapsula en otro paquete del mismo tipo con una estructura de datos similar pero denominada Command Status Wrapper, estas estructuras son usadas para que tanto el controlador como el dispositivo puedan diferenciar estos paquetes entre si y de los datos.

Los datos se envían de forma normal en paquetes DATA sin ninguna estructura de datos especial y cuyo tamaño esta determinado por el Endpoint.

Este protocolo no permite la "cola de comandos" por lo que el Driver no realizará ni lecturas ni escrituras nuevas hasta no haber recibido el último CSW del último comando, del mismo modo no se permiten transferencias bidireccionales de datos por lo que estás siempre serán en la misma dirección (todas IN o todas OUT).

Las operaciones de transferencia pueden ser de dos tipos cada una realizándose de distinta forma:

  • Escritura, el Driver envía el CBW al pipe Bulk-OUT para luego enviar todos los paquetes de datos necesarios, finalmente el Driver solicita al pipe Bulk-IN un paquete CSW con la información de estado.
  • Lectura, el Driver envía el CBW al pipe Bulk-OUT luego solicita al pipe Bulk-IN todos los paquetes de datos necesarios hasta recibir un paquete CSW.

Estructura del paquete CBW

La estructura de datos contiene distintos campos los cuáles son:

  • CBWSignature firma que permite identificar el paquete de datos como un paquete de datos tipo CBW. La firma son los caracteres individuales que forman USBC(USB Command).
  • CBWTag número asignador por el Driver al comando se utiliza como identificador siendo devuelto en el CSW para identificar a que CBW corresponde el CSW de respuesta.
  • CBWDataTransferLenght se indica en este campo el número de datos a transferir.
  • CBWFlags puede ser Data-Out indicando que el sentido de la transferencia de datos es desde el controlador al dispositivo o Data-In todo lo contrario.
  • CBWLun indica la unidad lógica a la que el comando va dirigido.
  • CBWCB bloque de comando que debe ejecutar el dispositivo.

Estructura del paquete CSW

La estructura de datos contiene distintos campos los cuáles son:

  • CSWSignature misma función que en el caso del CBW.
  • CSWTag misma función que en el caso del CBW.
  • CSWDataResidue para transferencias se indica la diferencia entre los datos que se esperaban recibir y los datos recibidos efectivamente.
  • CSWStatus indica si el comando se ha ejecutado de forma correcta o no.

El protocolo de transporte CBI (Control-Bulk-Interrupt)

El Bus de serie Universal (USB) es una arquitectura que brinda al PC la habilidad de interconectar una variedad de dispositivos por un cable de 4 vías. Los protocolos USB pueden configurar dispositivos al inicio o cuando éstos son enchufados en ejecución de cualquier sistema operativo actual.

Los dispositivos dentro de una clase se pueden dividir en subclases, estas divisiones permiten a los software buscar en el bus y seleccionar todos los dispositivos que se pueden controlar. Todos estos dispositivos pueden tener una o más configuraciones que definirán las funciones de éstos.

Las definiciones de clase del dispositivo USB definen las configuraciones, interfaces, ajustes y endpoints por defecto que un dispositivo en una clase o subclase dada debería proveer. Un “descriptor” describe información general acerca de un dispositivo, configuración, interfaz o endpoint.

Muestra de la organización jerárquica de los USB descriptors.

Esta especificación apunta al entorno a la arquitectura Control/Bulk/Interrupt, en cual las pipes control, bulk In/Out e Interrupt endpoints se usan para comunicación entre el host y el dispositivo.

  • La pipe de control se utiliza tanto para enviar peticiones estándar USB al dispositivo, como para mandar comandos, todo esto a través de peticiones especificas de clase definidas en este protocolo.
  • Las pipes Bulk-In y Bulk-Out se utilizan para transportar datos.
  • La pipe de interrupción se usa para el transporte de información de fin de comando.

Peticiones de Clase

El protocolo CBI define una petición de Clase:

  • Accept Device Specific Command (ADSC). Es el paquete donde se encapsula el Bloque de Comando para su transporte sobre USB hacia el dispositivo.

Transferencias

El host y el dispositivo de almacenamiento masivo se comunican sobre el USB usando protocolos descritos en esta especificación. Éstos se basan en estilos de comunicación comando/data/estado. Esto es, los bloques de comandos del protocolo de transporte van desde el host hasta el dispositivo; transportando datos entre host y dispositivo; transportando “estados” del bloque de comandos desde el dispositivo hasta el host; y permitiendo al host resetear el dispositivo:

Los 2 tipos de reset son:

  • Port Reset
  • Command Reset Protocol

Los 3 tipos de bloques de comando son:

  • Non-Data
  • Data-In
  • Data-Out

Los 3 tipos de bloques de comando, con sus respectivos protocolos, incluyendo estados y reporte de errores. El host decide que protocolo usar, entonces el dispositivo ve si es que coopera. El “status” de un comando de bloque es dado por el dispositivo y es uno de In-progress, o uno de fallo.

Port Reset Protocol

Si un dispositivo de almacenamiento masivo no responde como se esboza en la especificación, el host puede recurrir a un puerto reset del dispositivo infractor.

Command Block Reset Protocol

Antes de tomar la decisión drástica de “Port Reset”, el host puede tratar primero un bloque de comando reset. Para emitir un Command Block Reset, el host deberá usar el comando de protocolo Non-Data para transportar el command block: Luego que un command block reset esta completo, la condición de puesto y la palanca de datos de los endpoints se indefinen.

Non-Data command protocol

El host deberá usar un comando del protocolo Non-Data para transportar un bloque de comandos, y su estatus sin compañía de datos. Comando de transporte para comandos Non-Data: El host deberá enviar cada bloque de comandos para el dispositivo via un pipe de control de transferencia, el host debe empezar el transporte de comando con una solicitud de especificación de clase (ADSC)

Estado de transporte para Non-Data comandos

Para indicar que un bloque esta In-Progress, el dispositivo debe usar NAK (handshake packet indicating a negative acknowledgment) para apropiar el endpoint, para indicar que un bloque de comando ha pasado, el dispositivo deberá usar ACK (Handshake packet indicating a positive acknowledgment) para apropiar el endpoint y poder suplir un estado de bytes por un pipe de interrupción. Para indicar que un bloque de comandos ha fallado, el dispositivo debe posicionar un pipe o suplir bytes de estado para interrumpir el pipe, o usar ambos.

  • Data in Command Protocol.

El host deberá usar el protocolo de comandos Data-In para transportar un bloque de comandos, para leer datos de un dispositivo y transportar el estado de bloque de comandos.

  • Data Out Command Protocol.

El host deberá usar el Protocolo de comandos Data-Out para tranportar un bloque de comandos, para escribir datos al dispositivo, y transportar el estado del bloque de comandos.

Requirimiento de tranporte de datos unidireccional

El set de comandos aplicados a esta especificación, no deberá definir un bloque de comandos que requiere datos para ser transferidos en ambos, bulk in y bulk out pipes.

Descriptores

Los descriptores son las estructuras que proveen toda la información descriptiva del sistema. habiendo distintos tipos de descriptores que dan la información a nivel de dispositivo, tanto de configuración como de interfaz y endpoint

Descriptor de Dispositivo

Los dispositivos de Almacenamiento Masivo especifican la Clase, Subclase y Protocolo en el descriptor de interfaz, por lo que indican el valor 00h en los campos correspondientes (Clase, Subclase y Protocolo) del descriptor de dispositivo.

Descriptor de Configuración

La tabla muestra los campos y valores más relevantes de este descriptor.

En el campo número de Interfaces, el dispositivo especificará como mínimo el valor 1, correspondiente al Interfaz de Datos. En este descriptor el dispositivo informa de otras características, como si se alimenta desde el bus USB (Bus-Power) o si dispone de alimentación propia (Self-power), cuánta corriente consume del bus USB como máximo en esta configuración, y si el dispositivo puede utilizarse para despertar al sistema de un estado de reposo.

Descriptor de Interfaz

El dispositivo dispone al menos del descriptor del Interfaz de Datos. Es posible que el interfaz admita configuraciones alternativas. En este caso, el sistema puede buscar y seleccionar una configuración del interfaz adecuada a la Subclase y Protocolo que mejor pueda manejar.

Descriptores de endpoint

El dispositivo debe disponer al menos de los descriptores de endpoint correspondientes al Interfaz de Datos. Cada descriptor de endpoint indica el tipo (Bulk, Interrupción) y la dirección del endpoint (del 1 al 15), si es de entrada (IN) o de salida (OUT) y el tamaño del paquete de datos soportado por el endpoint.

Referencias

Generales

  1. http://www.usb.org/developers/devclass_docs/usb_msc_cbi_1.1.pdf
  2. http://www.fujitsu.com/downloads/EU/es/soporte/discosduros/UnpaseoporUSBMSD.pdf
  3. http://es.wikipedia.org/wiki/Memoria_USB
  4. http://es.wikipedia.org/wiki/USB_mass_storage_device_class

Bibliografía

  • Andrew S. Tanenbaum (2007)(en inglés). Modern Operating Systems. Prentice Hall (3er Edition)
Herramientas personales
Espacios de nombres
Variantes
Acciones
Navegación
Herramientas