Saludos compañeros, estoy empezando en el tema del usb con el pic y he tomado como punto de partida el proyecto del maestro RedPic "El usb desencadenado : cdc usb", lo he ido entendiendo mas o menos, pero al mirar las librerias para definir al componente he encontrado esto:
//the offset of the starting location of each string.
//offset[0] is the start of string 0, offset[1] is the start of string 1, etc.
const char USB_STRING_DESC_OFFSET[]={0,4,12};
#define USB_STRING_DESC_COUNT sizeof(USB_STRING_DESC_OFFSET)
char const USB_STRING_DESC[]={
//string 0
4, //length of string index
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
0x09,0x04, //Microsoft Defined for US-English
//string 1 --> la compañia del producto ???
8, //length of string index
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
'R',0,
'R',0,
'2',0,
//string 2 --> nombre del dispositivo
22, //length of string index
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
'R',0,
'e',0,
'd',0,
'P',0,
'i',0,
'c',0,
' ',0,
'U',0,
'S',0,
'B',0
};
#ENDIF
La explicacion dada por RedPic es esta:
La tabla USB_STRING_DESC contiene la descripción del dispositivo detectado por el Driver de Windows XP y que nos va a mostrar en la correspondiente entrada en la lista del Hardware Instalado en el Sistema.
Consta de dos partes o tablas, la propiamente dicha USB_STRING_DESC que contiene las descripciones requeridas y una tabla accesoria llamada USB_STRING_DESC_OFFSET que contiene los offset, o desplazamientos con respecto al inicio de USB_STRING_DESC en donde se encuentran las correspondientes cadenas. Ambas constan de tres elementos cada una de ellas.
USB_STRING_DESC_OFFSET tiene tres números que indican cada uno de ellos donde comienza el correspondiente dato en la tabla USB_STRING_DESC. Así un contenido de {0,4,12} nos dice que que el primer string comienza en el byte 0, el segundo en el byte 4 y el tercero se encuentra a partir del byte número 12. Si cambiamos la longitud de cualquiera de los strings deberemos reordenar esta tabla correspondientemente con solo contar los caracteres y apuntar en esta tabla el número de byte donde comienza cada uno de ellos.
USB_STRING_DESC contiene los tres strings en concreto que deseamos transmitir con el descriptor USB. Cada uno de ellos tiene la misma estructura que consta de un primer byte que indica la longitud total de la correspondiente cadena, un segundo byte que indica el tipo de dato que viene a continuación y por último tantos bytes como sean necesarios como contenido del string.
El primer dato de esta tabla es:
4, USB_DES_STRING_TYPE, 0x09, 0x04 que puede leerse como 4 : Longitud en bytes del dato incluido él mismo. USB_DES_STRING_TYPE que es una constante cuyo valor e 3 y que dice que lo que sigue es un string. Y 0x09, 0x04 que le indica al Windows que los strings que siguen están escritos en correcto ingles americano (US-English)
Los dos siguientes datos son los dos strings que definen nuestro dispositivo y cuya estructura es idéntica al caso anterior:
8, USB_DES_STRING_TYPE, 'R', 0, 'R', 0, '2', 0 que define el string el nombre "RR2" de mis Hardware. Total 8 bytes ya que "RR2" se codifica añadiendo un 0x00 tras cada uno de los caracteres.
Y 22, USB_DESC_STRING_TYPE, 'R', 0, 'e', 0, 'd', 0, 'P', 0, 'i', 0, 'c', 0, ' ', 0, 'U', 0, 'S', 0, 'B', 0 que define el nombre de mi dispositivo como "RedPic USB"
Mi duda surge al determinar la longitud de las cadenas: pues al sumarlas,incluyendo en la longitud el propio dato, siempre me sale un byte de menos. La unica explicacion que encuentro, es que la longitud misma de la cadena se expresa usando 2 bytes ¿es esto asi? o sino ¿alguien sabe de dude surge el byte que me falta?
He buscado el tema original, pero no he sido capaz de encontrarlo por eso abro este tema. Muchas gracias por la ayuda.