Selon Wikipedia , USB:
définit les câbles, les connecteurs et les protocoles de communication utilisés dans un bus pour la connexion, la communication et l'alimentation électrique entre ordinateurs et périphériques électroniques
Mais existe-t-il vraiment un "protocole de communication USB "? Mon compréhension est la suivante:
/dev/theDevice
/dev/theDevice
et le pilote gère le _ de bas niveau IO sur le périphérique/matériel sous-jacent.Pour moi, nulle part dans ce flux un "protocole de communication USB" n'apparaît. Si ma compréhension est correcte, la clé USB est simplement le câble et la connexion électrique entre le PC et le périphérique.
Est-ce que je me trompe ici? Est-ce que l'USB implémente réellement un protocole bas niveau qui souligne le flux ci-dessus? Si oui, de quoi s'agit-il et comment fonctionne-t-il avec une vue à 30 000 pieds?
Oui, voir protocoles USB
Si je comprends bien, la spécification USB définit un ensemble complexe de protocoles en couches et de profils de périphérique.
Par exemple, les périphériques USB peuvent se conformer à des modèles de haut niveau tels que stockage de masse, clavier (ou périphérique d'interface humaine, etc.) et être gérés par un pilote de périphérique générique. Certains périphériques USB peuvent communiquer à un niveau inférieur, de sorte que le support USB du système d'exploitation de bas niveau peut reconnaître que des pilotes de niveau supérieur spécifiques à un périphérique sont nécessaires.
Réponse:
Oui, la spécification USB inclut le protocole USB qui définit la manière dont le bus est utilisé au niveau du bit. C’est le protocole de "bas niveau" qui sous-tend les protocoles de niveau supérieur, à savoir stockage de masse, HID, etc.
Pour plus de détails sur le fonctionnement du protocole USB, ceci wiki OSDev est utile. Voici un autre description intéressante utilisant des diagrammes de séquence pour décrire les différentes transactions de données selon le protocole USB.
Bonus réponse:
'Sous Linux, lorsqu'un noyau compatible USB est utilisé, un périphérique USB en état de fonctionnement sera détecté via hardware et kernel en raison de la spécification USB. Du côté du matériel, la détection est effectuée par le contrôleur hôte USB. Ensuite, dans le noyau, le contrôleur de contrôleur hôte prend le relais et convertit les bits de bas niveau du fil en informations formatées selon le protocole USB. Ces informations sont ensuite renseignées dans le pilote principal USB du noyau. '
J'ai paraphrasé cet excellent article Opensourcefor , qui contient beaucoup plus de détails et de clarté sur votre question dans le contexte Linux.
Comme presque tous les autres types d'interfaces de communication, l'USB est implémenté sous la forme d'une pile de protocole . Les niveaux de cette pile communs à tous ou à plusieurs types de périphériques sont définis par les normes USB elles-mêmes, ce qui permet la compatibilité et empêche chaque périphérique de concevoir un protocole redondant. De plus, chaque couche du protocole extrait des détails dont la couche suivante n'a pas à s'inquiéter. Ainsi, lorsque vous écrivez réellement la couche spécifique à un périphérique, vous ne disposez que de fonctions génériques "envoyer" et "recevoir" qui acheminent les données d'un point final A à un point final B. En tant que concepteur de périphérique, vous n'avez pas à vous soucier de comment ça se passe De plus, les niveaux inférieurs de la pile de protocoles peuvent changer d'implémentation tant qu'ils exposent une interface commune à la couche située au-dessus d'eux. De cette façon, lorsqu'une partie de la pile de protocole change, le reste de la pile ne doit pas nécessairement changer. Idéalement, les protocoles situés aux niveaux les plus élevés de la pile ne doivent même pas se soucier exactement du protocole utilisé à un niveau inférieur de la pile. De manière générale, chaque couche consécutive de la pile encapsulera le message produit par la couche immédiatement supérieure dans son propre champ de données utiles lors de l'envoi d'un message. Lorsqu'un message est reçu, chaque couche décolle la partie pertinente pour cette couche et transfère sa charge utile vers la couche suivante appropriée de la pile. Ceci est vrai non seulement de l'USB, mais de presque tous les bus de communication. La pile TCP/IP/Ethernet est probablement la plus couramment utilisée, par exemple. Les tâches dont les couches sont généralement responsables sont décrites dans des modèles, tels que modèle OSI .
En USB, il existe un protocole de couche physique qui définit les états de tension, la synchronisation, etc. sur le fil et comment ils doivent être interprétés. Il est évident que ce protocole doit faire partie des normes USB elles-mêmes, et non spécifique à un périphérique donné (d'autant plus que l'hôte n'a aucun moyen de savoir quel type de périphérique est sur le point d'être branché sur un port USB donné.)
Ensuite, il y a un protocole de gestion de bus, utilisé pour décrire qui peut parler sur le bus quand. C'est ce qu'on appelle la couche d'accès au support dans le modèle OSI. En USB, cette couche peut être résumée en gros par "le périphérique peut transmettre lorsque l’hôte le lui demande", de sorte qu’il n’ya pas de protocole particulièrement compliqué sur cette couche en USB.
Ensuite, il existe un protocole standard pour décrivant un paquet de données et comment il doit être acheminé de l'expéditeur au destinataire. Cette couche doit également faire partie de la norme USB elle-même, afin que la communication initiale permettant de déterminer le type de périphérique connecté puisse avoir lieu avant que le type spécifique de périphérique ne soit réellement connu de l'hôte. En plus de chaque périphérique ayant un identifiant particulier au niveau de cette couche, il existe également le concept d'un identifiant de point final USB. Cela permet à un périphérique donné d'avoir plusieurs points de terminaison USB multiplexés et démultiplexés par la pile USB standard, de la même manière que les sockets sont multiplexés et démultiplexés par la pile TCP/IP standard. Une application peut traiter chacun de ces points d'extrémité comme des flux de données distincts.
Enfin, il y a le protocole défini pour le périphérique lui-même. Notez que certaines normes préconçues communes sont incluses dans la norme USB pour les cas d'utilisation courants, tels que les périphériques de stockage de masse, les souris, les claviers, etc., de sorte que chaque fabricant de périphérique n'ait pas à réinventer la roue. Toutefois, les périphériques plus complexes sont libres de concevoir leur propre protocole personnalisé sur cette couche. La sortie de cette couche pour une transmission donnée est transmise en tant que charge utile d’un paquet de données dans la couche précédente. Notez que, pour les périphériques suffisamment compliqués, la partie du protocole spécifique au périphérique peut elle-même être divisée en plusieurs couches indépendantes, mais les niveaux inférieurs ne doivent pas nécessairement en être conscients. Tout ce qu'ils ont besoin de savoir, c'est qu'ils doivent transmettre un ensemble d'octets donné de l'hôte à un point de terminaison de périphérique particulier ou d'un point de terminaison de périphérique particulier à l'hôte. Là encore, le fait d’avoir l’interface standard entre les couches permet de séparer les problèmes, de sorte qu’une couche ne doit pas se soucier du fonctionnement interne d’une autre couche, mais uniquement des données spécifiques qu’elle devrait ou qu’elle devrait recevoir des couches immédiatement au-dessus ou en dessous dans la pile.
Il existe en réalité un ensemble de protocoles de communication connexes qui interagissent.
Au niveau le plus bas, il existe un protocole décrivant la manière dont les paquets d'octets sont envoyés via une connexion série. Ceci est commun à tous les périphériques USB (mais différent entre USB2 et USB3).
L'un des premiers paquets envoyés demande à l'appareil de se décrire. Pour éviter les problèmes liés au poulet et aux œufs, le protocole d'identification est le même pour tous les périphériques USB. Le système d'exploitation peut utiliser cette identification pour charger le pilote approprié.
À un autre niveau encore, USB est un bus, ce qui signifie que plusieurs périphériques doivent partager la bande passante. Cela signifie qu’un protocole indique à chaque appareil quand il peut parler et quand il ne le peut pas. Comme tous les périphériques USB doivent s'y conformer, un protocole commun est utilisé pour organiser cela.
Enfin, de nombreux périphériques USB simples sont si simples qu'il existe des protocoles supplémentaires décrivant toute une classe de périphériques (souris, claviers, stockage, adaptateurs Ethernet, ...). La plupart des appareils prennent en charge zéro ou l'un de ces protocoles fonctionnels.
Une partie de la réponse réside peut-être dans la définition de l'expression " protocole de communication ". En allant à la même source que vous (Wikipedia), vous trouverez des informations utiles telles que:
Une façon simple d’y penser est que un protocole est une manière prédéfinie et convenue de faire quelque chose , dans ce cas le Quelque chose explique comment transférer des données dans un périphérique connecté via USB. Sur le plan matériel, chaque broche a un niveau de tension et un protocole d'utilisation prédéfinis, chaque type d'appareil possède un protocole d'utilisation prédéfini pour chaque broche , et chaque paquet de données a une syntaxe et un format de données prédéfinis. Il existe également un protocole de communication poignée de main intégré. Ensemble, ces éléments font partie de l'ensemble des normes d'utilisation des périphériques USB, à savoir le protocole USB , qui sont décidées (c.-à-d. Conçues, proposées, débattues, révisées et finalement approuvées) par les membres. de le forum des développeurs USB, Inc.
Donc oui, il y a un protocole USB, ou plus exactement il existe un certain nombre de protocoles USB prédéfinis et convenus s pour différentes utilisations USB.