L'essentiel de la norme USB en résumé.
Il y a 2 versions de la norme USB : 1.1 et 2.0, la version 2.0 ajoute essentiellement la haute vitesse.
DESCRIPTION
Le bus USB est un bus série synchrone. Il est plug and play et supporte les
connexions/déconnexions à chaud.
Il supporte 3 vitesses de transmissions
qui peuvent cohabiter.
- Basse vitesse 1,5 Mb/s pour les appareils
interactifs tels que clavier, souris, joystick,...
- Pleine vitesse
12 Mb/s pour des appareils à gros débits tels que modem, téléphone, ...
-
Haute vitesse 480 Mb/s pour des appareils multimédia à très gros débits
tels que camescope. Cette vitesse concurrence le bus FireWire.
(Par comparaison
Ethernet "normal" est à 10 Mb/s et Ethernet rapide à 100 Mb/s)
Les
transmissions se font à l'aide d'un protocole à jeton, il y a plus d'analogie
avec un réseau Ethernet ou Token Ring qu'avec une liaison série RS232.
Les
jetons et les paquets de données prennent place dans des trames d'une durée
de 1 milliseconde. En haute vitesse les micro-trames durent 125 microsecondes.
Le
bus USB assure une alimentation limitée de chaque appareil. Un hub V. 2.0 accepte
des appareils basse et pleine vitesse sur ses ports descendants mais communique
avec l'hôte en haute vitesse.
Un appareil peut contenir plusieurs périphériques,
par exemple un télécopieur contient un scanner, une imprimante et un modem.
Les modes de
transferts, qui peuvent cohabiter, sont les suivants : Contrôle, Interruptions,
Bloc, Isochrone.
ARCHITECTURE
Le bus est entièrement contrôlé par un hôte unique, généralement le PC.
La
topologie ressemble à celle d'Ethernet : plusieurs niveaux de hubs sur lesquels
se connectent les appareils au nombre maximum de 127. Le hub racine est
implémenté dans l'hôte, il peut avoir plusieurs ports. Il peut y avoir en cascade
jusqu'à 5 hubs en plus du hub racine. Les ports dirigés vers les appareils
sont appelés ports descendant et ceux dirigés vers l'hôte ports montants. Chaque
hub contient un contrôleur qui surveille les différents ports et rends des comptes
à l'hôte. Celui-ci interroge les contrôleurs de hubs afin de connaitre les connexions
et déconnexions d'appareils.
A la connexion d'un appareil, l'hôte
l'identifie et lui assigne une adresse unique : c'est la phase d'énumération.
Lors de la connexion d'un hub, il y a énumération de tous les appareils
en aval.
L'hôte attribue également la bande passante en fonction des types
de transfert requis par les appareils.
FLUX DE DONNEES
Un appareil USB communique avec un logiciel client installé sur l'hôte.
Le
système USB crée des canaux virtuels pour les différents flux de données. Les
canaux de types "contrôles" sont bidirectionnels, les autres sont
unidirectionnels. Il y a donc séparation des flux de données de chaque
appareil; un canal aboutit dans l'appareil sur une "terminaison".
Un appareil possède plusieurs terminaisons et est toujours reliés à l'hôte
au moins par le "canal par défaut" aboutissant à la terminaison
numéro zéro; cette terminaison est bi-directionnelle. Pour les autres terminaison
il peut y avoir 2 canaux, l'un montant et l'autre descendant; la combinaison
de l'adresse de l'appareil, du numéro de la terminaison et de la direction
est unique. Les caractéristiques de fréquence, de bande passante, de taille
de buffer,
de type de transfert et de sens de flux déterminent les propriétés de chaque
terminaison.
Un appareil basse vitesse est limité à deux terminaisons
optionnelles en plus de la terminaison de numéro zéro obligatoire, un appareil
pleine vitesse peut avoir, en plus de la terminaison de numéro 0, 15 terminaisons
montantes et 15 descendantes.
Les données circulent dans les canaux soit
sous forme de "Messages USB" soit sous forme de flux non-structuré.
Un canal est caractérisé par sa terminaison, sa bande passante et son type de
transfert.
Sauf pour les transferts isochrones, un système d'alternance
entre deux types de paquet de données permet de détecter un paquet perdu et
donc de le retransmettre. Les canaux de type "isochrones" et "interruptions"
obtiennent une bande passante réservée.
Transfert de contrôle.
Destiné à la configuration et à la commande
d'un appareil. Il se compose d'une transaction de "Setup", des
transactions de données éventuelles dans le sens indiqué par le Setup et d'une
transaction de statut. Le système USB utilise le canal par défaut pour configurer
l'appareil par des transferts de contrôle. Ces transactions ont un format
défini par la norme. La charge utile des paquets de données est de 8, 16, 32
ou 64 octets en pleine vitesse et de 8 octets en basse vitesse; la taille maximum
est définie par les caractéristiques de la terminaison. Un système de retransmission
en cas d'erreur assure la fiabilité du transfert.
Transfert isochrone.
C'est un transfert à débit constant tolérant
aux erreurs destiné aux flux importants de données tels l'audio ou la vidéo.
Le débit dans le canal est garantie, auncun format n'est imposé aux données. La charge utile des paquets
peut atteindre 1023 octets en pleine vitesse et 1024 en haute vitesse; ce mode
ne supporte pas la basse vitesse. Les erreurs sont signalés mais il n'y a pas
de retransmission. La synchronisation peut se faire, entre autre, en détectant
le paquet "SOF" qui est placé au début de chaque trame.
Transfert par interruption.
Il est destiné aux appareils transmettant
peu de données mais dans un délai garanti. Il ne s'agit pas vraiment d'interruptions
mais d'interrogations de l'appareil par l'hôte à une cadence fixe et garantie.
Auncun format n'est imposé aux données. La charge utile des paquets de données
est identique à celle des transferts de contrôle. En cas d'erreur il y a retransmission
lors de l'interrogation suivante.
Transfert en bloc.
Il est destiné aux gros volumes de données sporadiques
et sans contraintes temporelles, par exemple pour une imprimante. Le système
peut retarder un transfert en bloc jusqu'à disposer de suffisament de bande
passante. Auncun format n'est imposé aux données. La charge utile des paquets
de données est de 8, 16, 32 ou 64 octets. Les transferts en bloc supportent
la correction des erreurs; ils sont en pleine ou haute vitesse.
LA MECANIQUE
Le cable comprend 4 conducteurs : 2 pour l'alimentation 5 v. et une paire torsadée pour les données, ainsi qu'un blindage. Les données entrantes ou sortantes (De l'hôte) circulent sur la même paire de fils. En basse vitesse il n'y a pas besoin de blindage ni que les conducteurs pour les données soient torsadés. Il y a deux types de connecteurs. Le type A de forme plate se trouve sur les ports montant c'est à dire en sortie de l'hôte ou des hubs. Le type B de forme carrée se trouve sur les ports descendant c'est à dire en entrée des appareils. Un appareil basse vitesse n'a pas de connecteur B : le cable doit être fixé à demeure à l'appareil. La norme définie une atténuation maximale et des délais de transmission dans le cable donc une longueur maximum dépendant de sa qualité. Des considérations électriques font que la longueur des cables basse vitesse ne peut pas atteindre la longueur des cables pleine vitesse qui ne peut pas dépasser 5 mètres.
Couleurs des conducteurs et brochage prise femelle vue de face :
1 : Vbus Rouge |
2 : D - Blanc |
3 : D + Vert |
4 : Masse Noir |
Type A |
Type B |
L'ELECTRICITE
La signalisation
Les lignes de données D+ et D- fonctionnent en
mode différentiel. Les circuits doivent avoir un état haute impédance; les lignes
doivent résister à un court circuit avec Vbus ou la masse. Les ports des hubs
doivent être compatible faible et pleine vitesse. Dans un appareil pleine
vitesse, la ligne D+ est ramenée à une tension comprise entre 3 et 3,6 V par
une résistance de 1,5kohm alors qu'en basse vitesse c'est la ligne D- qui est
ainsi polarisée. On définit sur les lignes de données deux états : J et K.
En
basse vitesse :
Etat J :
D- > D+ d'au moins 200 mV
Etat
K : D+ > D- d'au moins 200 mV
En pleine vitesse c'est le contraire.
Un
état J avec certaines valeurs minimales et maximales de tension indique un état
"innocupé".
De plus il existe une état où D+ et D- sont au potentiel
bas appelé SE0. L'état SE0 pendant plus de 10 ms indique un reset, il est émis
vers un appareil 100 ms après sa connexion. Dès qu'un appareil voit
le signal de reset pendant plus de 2,5 microseconde, il doit faire son reset
et le terminer avant la fin du signal(10 ms).
La polarisation de l'une des
deux lignes permet de détecter la connexion d'un appareil et sa vitesse.
Les appareils haute vitesse doivent pouvoir démarrer en pleine vitesse.
Un
mode "veille" doit être supporté par tout appareil. Ce mode doit
être activé dès qu'il n'y a plus d'activité sur le bus depuis plus de 3 ms;
c'est à dire que les trames ne contiennent aucun paquet. (Rappel : une trame
dure 1ms) Pendant le mode veille la consommation doit être réduite mais néanmoins
la polarisation de D+ ou de D- doit être maintenue. La moindre activité sur
le bus doit réveiller l'appareil. Un appareil peut avoir une fonction
"réveil" destinée à avertir l'hôte par l'intermédiaire du hub.
L'encodage
des donnés se fait selon la méthode NRZI. Un "1" est représenté par
l'absence de changement d'état et un "0" par un changement d'état.
La période est la durée de transmission d'un bit selon la vitesse utilisée.
Pour
éviter une désynchronisation, des changements d'états supplémentaires peuvent
être insérés; ils sont retirés au décodage. Chaque paquet commence par une série
de 7 transitions assurant la synchronisation. Le début d'un paquet est caractérisé
par le passage de l'état "innocupé" (semblable à l'état J aux niveaux
de tension près) à l'état K, puis vient la synchronisation. Les données viennent
ensuite suivie par un état SE0 durant le temps de 2 périodes et enfin le retour
à l'état J.
Un appareil doit laisser un temps d'une durée de 2 périodes
après un paquet et avant d'envoyer son paquet de réponse; cette durée peut atteindre 7,5 périodes. Les durées inter-paquet de l'hôte sont identiques
mais il n'y a pas de maximum pour des paquets de transactions différentes. Des
durées inter-paquet de 16 à 18 périodes provoquent l'abandon d'une transaction.
L'intervale
entre deux trames est compris entre 0,5 et 1,5 ms.
Les hubs ne retransmettent
pas les paquets pleine vitesse vers les appareils basses vitesses.
L'alimentation.
On définit une unité de puissance correspondant
à 100mA (500mW plus exactement). Par défaut un appareil est en basse puissance
et consomme une unité au maximum jusqu'à sa configuration; par programmation
il peut ensuite monter jusqu'à 5 unités.
Le système controle la disponibilité
de la puissance demandée. Un port peut fournir jusqu'à 5 unités; les hubs peuvent
avoir une alimentation externe leur évitant de devoir partager la puissance
drainée sur leur port montant et ainsi fournir jusqu'à 5 unités sur chaque port
descendant. Un hub alimenté par le bus ne peut avoir que 4 ports fournissant
chacun une unité, la cinquième étant pour le hub lui-même.
Les appareils
auto-alimentés peuvent consommer une unité permettant à l'interface de continuer
à fonctionner sans alimentation externe. Le contrôleur de hub informe l'hôte
des conditions d'alimentation.
Un appareil en état de veille ne peux pas
consommer plus de 0,5mA., s'il est configuré comme une source de réveil il peut
aller jusqu'à 2,5mA.
LE PROTOCOLE
La transmission des données se fait avec le bit le moins significatif en
tête.
Chaque paquet contient un identificateur (PID) de 4 bits juste après
la séquence de synchronisation; par sécurité ces 4 bits sont répétés après complémentation.
Le PID indique le type de paquet.
Les différents PIDs :
Code |
Nom |
Type de paquet |
Description |
0001 |
OUT |
Jeton |
Données de l!'hôte pour l'appareil |
1001 |
IN |
Jeton |
Données de l'appareil pour l'hôte |
0101 |
SOF |
Jeton |
Début de trame |
1101 |
SETUP |
Jeton |
Initialisation de transaction de contrôle |
0011 |
DATA0 |
Données |
Paquet de données pair |
1011 |
DATA1 |
Données |
Paquet de données impair |
0111 |
DATA2 |
Données |
Paquet de données haute vitesse |
1111 |
MDATA |
Données |
Paquet de données haute vitesse pour transactions "Split" |
0010 |
ACK |
Acquittement |
Acquittement positif |
1010 |
NAK |
Acquittement |
Acquittement négatif, appareil occupé |
1110 |
STALL |
Acquittement |
Terminaison ou canal hors service |
0110 |
NYET |
Acquittement |
Acquittement négatif haute vitesse |
1100 |
PREP |
Jeton |
Trafic vers un appareil basse vitesse |
1100 |
ERR |
Acquittement |
Erreur transmisse par un hub haute vitesse dans une transaction "Split" |
1000 |
SPLIT |
Jeton |
Transaction avec un hub haute vitesse |
0100 |
PING |
Jeton |
Vérification de liaison |
Ensuite les autres champs dépendent du PID.
Les champs "Adresse"
contiennent l'adresse de l'appareil sur 7 bits, le champ "Terminaison"
le numéro de la terminaison au sein de l'appareil sur 4 bits.
Les paquets
SOF contiennent un numéro de trame sur 11 bits qui s'incrémente de 0 à 7FF.
Les
paquets de données contiennent de 0 à 1024 octets.
Une CRC (Somme de contrôle)
de 5 bits protège les champs adresse et terminaison des paquets jeton et une
CRC de 16 bits protège les paquet de données.
La transaction "Split"
permet une liaison haute vitesse avec un hub qui a sur ses ports descendants
des appareils basse ou pleine vitesse. Les transactions basse ou pleine
vitesse sont transportées en haute vitesse entre l'hôte et le hub par les transactions
"Split". La transaction "Split" apparue avec USB 2.0 est
très complexe, elle possède de nombreuses fonctionnalitées.
Il existe deux paquets
de données DATA0 et DATA1 qui étant émis en alternance permettront la détection
d'un paquet manquant. Le jeton NAK ne veut pas dire qu'il y a erreur mais simplement
qu'il faut retransmettre plus tard.
Format des paquets et nombre de bits.
Paquets |
Champs et taille (en bits) |
|||||
OUT, IN, SETUP, PING |
PID (8) |
Adresse (7) |
Terminaison (4) |
CRC (5) |
||
SPLIT |
PID (8) |
Adresse hub (7) |
Sous-type (1) |
Port (7) |
Indicateurs (4) |
CRC (5) |
SOF |
PID (8) |
Numéro de trame (11) |
CRC (5) |
|||
DATA0, DATA1, DATA2, MDATA |
PID (8) |
Données (0 à 8192, multiple de 8) |
CRC (16) |
|||
ACK, NAK, STALL, NYET, ERR |
PID (8) |
Transaction IN.
Réponse au jeton :
- Si jeton reçu corrompu
: pas de réponse
- Si terminaison bloquée : réponse STALL
- Si terminaison
incapable d'envoyer des données : réponse NAK
- Si terminaison capable d'envoyer
des données : réponse DATA
Acquittement :
- Si données corrompues ou l'hôte
ne peut pas accepter les données : pas de réponse
- Si données acceptées
: réponse ACK
Transaction OUT.
Réponse après réception du jeton et des données
:
- Si paquet reçu corrompu : pas de réponse
- Si terminaison bloquée
: réponse STALL
- Si terminaison accepte les données : réponse ACK
- Si
terminaison incapable d'accepter les données : réponse NAK
Transaction SETUP.
L'appareil doit accepter le paquet DATA0
qui suit un paquet SETUP puis répondre par ACK si les paquets ne sont pas corrompus.
Transfert EN BLOC.
C'est une suite de transactions OUT ou
IN selon le sens du canal.
L'alternance des paquets DATA0 et DATA1 permet
de controler l'intégrité des données.
Transfert DE CONTROLE.
- Le transfert commence par une transaction
SETUP
- C'est ensuite une série de transactions OUT ou IN selon le sens de
transmission indiqué par le SETUP.
- Une transaction IN ou OUT inverse au sens de transmission précédent
termine le transfert en donnant le statut de celle-ci.
Il y a aussi alternance des paquets
DATA0 et DATA1.
Transfert INTERRUPTION.
A interval régulier et négocié lors de
l'établissement du canal, l'hôte execute une transaction IN ou OUT selon le
sens du canal.
Il y a aussi alternance des paquets
DATA0 et DATA1.
Transfert ISOCHRONE.
Ce sont des jetons IN ou OUT selon le sens
du canal suivis de paquets DATA0. Il n'y a pas de réponse ni de controle du
séquencement des données.
FONCTIONNEMENT DU PERIPHERIQUE
Après sa mise sous tension, un appareil ne répond à aucune transaction
avant d'avoir reçu un reset du bus. Après cela l'appareil est adressable
à son adresse par défaut.
Après raccordement d'un appareil, le systèmeUSB
procède à "l'énumération" qui réalise les actions suivantes :
-
Le hub informe l'hôte d'un changement dans son statut.
- L'hôte interroge
le hub sur la nature de ce changement.
- L'hôte attend 100 ms la stabilisation
des tensions puis demande au hub de faire un reset sur le port concerné.
-
Le hub réalise le reset après quoi le port est actif et l'appareil peut
soutirer 100mA de Vbus.
- Après avoir lu le descripteur d'appareil l'hôte
lui assigne une adresse unique. (Windows demande un reset pendant la lecture
du descripteur et recommence l'opération au début)
- L'hôte lit les informations de configuration
et assigne à l'appareil l'une de ses configurations. La puissance fournie
par Vbus peut alors augmenter; l'appareil est prêt à être utilisé.
Tous
les appareils supportent un jeu de requêtes communes. A l'exception de la
requête "SetAdress" et de certaines requêtes longues, le traitement
de la requête doit être terminée avant que l'appareil ne renvoie l'acquittement.
Ces requêtes se font par transfert de contrôle sur le canal par défaut; elles
sont envoyées dans les 8 octets du paquet de donnée d'une transaction SETUP
et doivent en général être terminée en moins de 5 secondes.
Les requêtes
Les champs et leur longueur sont les suivants :
Les jetons SETUP
ont 8 octets de données divisés en 5 champs :
Nom du champ |
Taille en octets |
bmRequestType |
1 |
bRequest |
1 |
wValue |
2 |
wIndex |
2 |
wLength |
2 |
Pour wIndex : Si numéro de terminaison : bits 0 à 3 et direction dans le bit 7; si numéro d'interface : bits 0 à 7
Liste des requêtes standards :
bmRequestType |
bRequest + valeur |
wValue |
wIndex |
wLength |
Données |
00000000 |
CLEAR_FEATURE (1) |
Sélecteur |
0 |
0 |
|
10000000 |
GET_CONFIGURATION (8) |
0 |
0 |
1 |
Valeur configuration |
10000000 |
GET_DESCRIPTOR (6) |
Type
descripteur |
0 ou Id de |
Longueur max. |
Descripteur |
10000001 |
GET_INTERFACE (10) |
0 |
Interface |
1 |
Configuration alternative |
10000000 |
GET_STATUS (0) |
0 |
0 |
2 |
Statut |
00000000 |
SET_ADDRESS (5) |
Adresse |
0 |
0 |
|
00000000 |
SET_CONFIGURATION (9) |
Valeur de |
0 |
0 |
|
00000000 |
SET_DESCRIPTOR (7) |
Type
descripteur |
0 ou Id de |
Longueur max. |
Descripteur |
00000000 |
SET_FEATURE (3) |
Sélecteur |
0 |
0 |
|
00000001 |
SET_INTERFACE (11) |
Configuration |
Interface |
0 |
|
10000010 |
SYNCH_FRAME (12) |
0 |
Terminaison |
2 |
Numéro de trame |
Nom |
Valeur |
Désignation |
Domaine d'application |
0 |
ENDPOINT_HALT |
Arrêt de la terminaison |
Terminaison |
1 |
DEVICE_REMOTE_WAKEUP |
Télécommande de réveil de l'hôte |
Appareil |
2 |
TEST_MODE |
Mode test |
Appareil |
Etats pouvant être retournés par la requête GET_STATUT adressée à un appareil :
Désignation |
Numéro du bit |
Télécommande de réveil de l'hôte active |
1 |
Auto alimentation |
0 |
Les descripteurs
De nombreuses
requêtes vont demander à l'appareil un "descripteur"; il s'agit
d'un bloc de données organisées en champs bien définis. On rencontreta essentiellement
les descripteurs d'appareil, de configuration, de chaines, d'interface
et de terminaison.
Le premier octet contient la longueur du descripteur et
le second octet le type de descripteur.
Types de descripteur :
Type |
Valeur |
Appareil |
1 |
Configuration |
2 |
Chaine de caractères |
3 |
Interface |
4 |
Terminaison |
5 |
Qualificateur d'appareil |
6 |
Autre configuration de vitesse |
7 |
Interface de puissance |
8 |
Classe |
21 |
Champ |
Taille |
Description |
bLength |
1 |
Taille du descripteur en octets |
bDescriptorType |
1 |
Type du descripteur = 1 |
bcdUSB |
2 |
Version USB codée en BCD |
bDeviceClass |
1 |
Code de classe assigné par l'USB-IF |
bDeviceSubClass |
1 |
Code de sous-classe dépendant de la classe |
bDeviceProtocol |
1 |
Code de protocole dépendant de la classe |
bMaxPacketSize0 |
1 |
Taille maximum des paquets pour la terminaison 0 |
idVendor |
2 |
Code fabricant assigné par l'USB-IF (VID) |
idProduct |
2 |
Code produit assigné par le fabricant (PID) |
bcdDevice |
2 |
Version d'appareil codé en BCD |
iManufacturer |
1 |
Index du descripteur de chaine du fabricant |
iProduct |
1 |
Index du descripteur de chaine de l'appareil |
iSerialNumber |
1 |
Index du descripteur de chaine du numéro de série |
bNumConfigurations |
1 |
Nombre de configurations possibles |
Descripteur de configuration :
Champ |
Taille |
Description |
bLength |
1 |
Taille du descripteur en octets |
bDescriptorType |
1 |
Type du descripteur = 2 |
wTotalLength |
2 |
Taille totale de tous les descripteurs pour cette configuration |
bNumInterfaces |
1 |
Nombre d'interfaces supportées par cette configuration |
bConfigurationValue |
1 |
Numéro de cette configuration (A utiliser par SET_CONFIGURATION) |
iConfiguration |
1 |
Index du descripteur de chaine décrivant cette configuration |
bmAttributes |
1 |
Bit 6 : auto-alimentation, bit 5 : commande de réveil, bit 7 = 1 |
bMaxPower |
2 |
Consommation maximum en unités de 2 mA. |
Descripteur d'interface :
Champ |
Taille |
Description |
bLength |
1 |
Taille du descripteur en octets |
bDescriptorType |
1 |
Type du descripteur = 4 |
bInterfaceNumber |
1 |
Numéro de cette interface (Base 0) |
bAlternateSetting |
1 |
Numéro de l'interface alternative |
bNumEndpoints |
1 |
Nombre de terminaisons excluant les terminaisons zéro |
bInterfaceClass |
1 |
Code de classe assigné par l'USB-IF |
bInterfaceSubClass |
1 |
Code de sous-classe dépendant de la classe |
bInterfaceProtocol |
1 |
Code de protocole dépendant de la classe |
iInterface |
1 |
Index du descripteur de chaine décrivant cette interface |
Descripteur de terminaison :
Champ |
Taille |
Description |
bLength |
1 |
Taille du descripteur en octets |
bDescriptorType |
1 |
Type du descripteur = 4 |
bEndpointAddress |
1 |
Adresse de cette terminaison |
bmAttributes |
1 |
Propiétés de la terminaison. |
wMaxPacketSize |
2 |
Taille maximum des paquets de données en octets |
bInterval |
1 |
Intervalle entre chaque demande de données de l'hôte en nombre
de trames. |
Descripteur de chaine :
Ces descripteurs sont facultatifs;
si un appareil ne les supporte pas les références à des descripteurs de chaine
doivent être à 0. Ils sont en UNICODE et peuvent supporter plusieurs langues.
Chaque langue possède un identificateur sur 2 octets. Le descripteur de chaine
d'index 0 contient un tableau des identificateurs des langues supportées. Les
10 derniers bits identifient la langue, les 6 premiers le pays d'application.
-
Quelques identificateurs de langues courantes :
Langue |
Identificateur (Hexa) |
Français |
040c |
Anglais |
0409 |
Allemand |
0407 |
Italien |
0410 |
Espagnol |
040a |
Champ |
Taille |
Description |
bLength |
1 |
Taille du descripteur en octets |
bDescriptorType |
1 |
Type du descripteur = 3 |
wLANGID[0] |
2 |
Identificateur de langue d'index 0 |
... |
2 |
... |
wLANGID[N] |
2 |
Identificateur de langue d'index N |
- Descripteur de chaine d'index supérieur à 0 :
Champ |
Taille |
Description |
bLength |
1 |
Taille du descripteur en octets |
bDescriptorType |
1 |
Type du descripteur = 3 |
bString |
X |
Chaine UNICODE |
L'HOTE ET LES HUBS
La norme décrit en détails le comportement de l'hôte et des hubs. Ces deux chapitres ne concernent que les fabricants de système d'exploitation et de hubs.