Partager via


Gestion des séquences de Client-Implemented

Les fonctions de rappel d’événements EvtSpbControllerLock et EvtSpbControllerUnlock facultatives effectuent des opérations complémentaires. La fonction EvtSpbControllerLock est un gestionnaire pour les requêtes IOCTL_SPB_LOCK_CONTROLLER . La fonction EvtSpbControllerUnlock est un gestionnaire pour les requêtes IOCTL_SPB_UNLOCK_CONTROLLER . Un client (c’est-à-dire le pilote d’un périphérique sur le bus) envoie ces demandes pour démarrer et mettre fin aux séquences de transfert d’E/S. La plupart des pilotes de contrôleur SPB ne prennent pas en charge les requêtes IOCTL_SPB_LOCK_CONTROLLER et IOCTL_SPB_UNLOCK_CONTROLLER et, par conséquent, n’implémentent pas les fonctions EvtSpbControllerLock et EvtSpbControllerUnlock .

Un client peut effectuer une séquence de transfert d’E/S sous la forme d’une série de demandes de transfert simples (c’est-à-dire , IRP_MJ_READ et IRP_MJ_WRITE requêtes). Le premier transfert de la séquence doit être précédé d’une demande de IOCTL_SPB_LOCK_CONTROLLER : cette demande indique au pilote du contrôleur SPB de verrouiller le bus pendant la durée de la séquence de transfert d’E/S. Le dernier transfert doit être suivi d’une demande de IOCTL_SPB_UNLOCK_CONTROLLER , qui indique au pilote de déverrouiller le bus. Ce type de séquence de transfert d’E/S est appelé séquence implémentée par le client pour la distinguer d’une séquence de requête unique, qui utilise une requête IOCTL_SPB_EXECUTE_SEQUENCE au lieu de IOCTL_SPB_LOCK_CONTROLLER et IOCTL_SPB_UNLOCK_CONTROLLER requêtes.

Alors que le pilote d’un périphérique contient un verrou sur le bus, le contrôleur de bus n’autorise l’accès à aucun autre périphérique sur le bus. Les détails de l’opération de verrouillage de bus dépendent du type de bus. Pour un contrôleurI2C, une modification du sens de transfert (une lecture suivie d’une écriture, ou inversement) nécessite une opération de redémarrageI2C. Pour un contrôleur SPI, la sélection de puce sur l’appareil cible doit rester affirmée tant que le verrou du contrôleur reste en vigueur. Pour plus d’informations, consultez Opérations de bus atomique.

La prise en charge des séquences de transfert implémentées par le client est facultative. Votre pilote de contrôleur SPB doit prétendre les prendre en charge uniquement si le contrôleur peut effectuer les opérations suivantes :

  • Verrouillez le bus pendant la durée de la séquence implémentée par le client.
  • Déverrouillez le bus à tout moment. Par exemple, si une demande de déverrouillage se produit entre les transferts d’octets, le contrôleur doit être en mesure de déverrouiller le bus sans attendre le transfert d’octet suivant sur le bus.

Lorsque le bus est verrouillé, le client peut envoyer une séquence arbitraire de demandes de transfert simples. Autrement dit, la séquence peut être de longueur arbitraire et peut être n’importe quelle combinaison de lectures et d’écritures.

Pour indiquer la prise en charge des séquences implémentées par le client, un pilote de contrôleur SPB implémente une fonction EvtSpbControllerUnlock . Si votre pilote implémente cette fonction, l’extension d’infrastructure SPB (SpbCx) accepte IOCTL_SPB_LOCK_CONTROLLER et IOCTL_SPB_UNLOCK_CONTROLLER demandes des clients. Sinon, SpbCx échoue à ces demandes en les remplissant avec le code d’état STATUS_NOT_SUPPORTED.

Un pilote de contrôleur SPB qui implémente une fonction EvtSpbControllerUnlock n’est pas nécessaire pour implémenter une fonction EvtSpbControllerLock . Toutefois, un pilote de contrôleur SPB qui implémente une fonction EvtSpbControllerLock doit également implémenter une fonction EvtSpbControllerUnlock .

Si votre pilote implémente une fonction EvtSpbControllerUnlock , mais pas une fonction EvtSpbControllerLock , SpbCx appelle la fonction EvtSpbControllerUnlock pour gérer IOCTL_SPB_UNLOCK_CONTROLLER demandes, mais termine simplement IOCTL_SPB_LOCK_CONTROLLER requêtes avec STATUS_SUCCESS codes d’état.

Votre pilote dispose de deux façons de détecter le début d’une séquence implémentée par le client. Tout d’abord, si votre pilote implémente une fonction EvtSpbControllerLock , SpbCx appelle cette fonction pour gérer une IOCTL_SPB_LOCK_CONTROLLER demandes d’un client. Le pilote peut compter sur cet appel qui se produit avant la première demande de transfert dans une séquence. Deuxièmement, si votre pilote n’implémente pas de fonction EvtSpbControllerLock , il peut appeler la méthode SpbRequestGetParameters quand le pilote gère une simple demande de transfert à partir du client. Pour indiquer que le transfert demandé est le premier transfert d’une séquence, cette méthode définit le membre Position dans la structure de sortie de la méthode sur SpbRequestSequencePositionFirst.

Le rappel EvtSpbControllerUnlock est la seule façon pour un pilote de déterminer quand une séquence se termine. Un pilote qui n’implémente pas de fonction EvtSpbControllerUnlock ne peut pas prendre en charge les séquences implémentées par le client.