Vue d’ensemble des transactions D’E/S SerCx2
SerCx2 gère une demande de lecture ou d’écriture d’un client en émettant une ou plusieurs transactions d’E/S au pilote de contrôleur série. Ce pilote traite chaque transaction comme une opération d’E/S autonome qui transfère des données entre le contrôleur série et la mémoire tampon de données dans la demande.
Les circuits intégrés système sur une puce (SoC) incluent fréquemment des contrôleurs série (ou UART) pour permettre la communication série à grande vitesse avec d’autres circuits intégrés qui sont soudés à la même carte de circuit imprimé. Les processeurs de ces SoC peuvent utiliser des E/S programmées (PIO) pour transférer directement des données vers ou à partir des registres de données mappés en mémoire dans ces contrôleurs série. En outre, ces SoC fournissent généralement du matériel DMA avancé pour déplacer les données entre les contrôleurs série et la mémoire.
PiO peut suffire pour les transferts de données courts, mais l’utilisation de PIO pour des transferts plus longs à des taux de données élevés représente une charge trop lourde pour le processeur. DMA est nécessaire pour décharger ces transferts du processeur.
Types de transactions d’E/S
SerCx2 définit les trois types généraux de transactions d’E/S suivants :
- PIO
- DMA système
- Custom
Tous les pilotes de contrôleur série doivent prendre en charge les transactions d’E/S qui utilisent PIO pour transférer des données. Un pilote de contrôleur série peut également prendre en charge les transactions d’E/S qui utilisent le système DMA ou un mécanisme de transfert de données personnalisé, en fonction des fonctionnalités du contrôleur série et du matériel associé. Le pilote peut prendre en charge les transactions DMA système ou les transactions personnalisées, mais pas les deux.
Pour chaque type de transaction d’E/S prise en charge par le matériel du contrôleur série, le pilote du contrôleur série enregistre un package de support avec SerCx2. Ce package décrit les fonctionnalités matérielles pertinentes et inclut un ensemble de fonctions de rappel d’événements implémentées par le pilote que SerCx2 appelle pour lancer et contrôler ce type de transaction d’E/S.
Si un contrôleur série peut utiliser un contrôleur DMA système, qui peut être partagé avec d’autres appareils, le pilote de contrôleur série peut prendre en charge les transactions DMA système. Pour ces transactions, SerCx2 configure le contrôleur DMA système et lance les transferts DMA. Le pilote de contrôleur série effectue relativement peu de travail pendant les transactions DMA système.
Si un contrôleur série dispose d’un mécanisme matériel personnalisé pour transférer des données, le pilote de contrôleur série peut prendre en charge les transactions personnalisées qui utilisent ce mécanisme. Par exemple, si le matériel du contrôleur série dispose d’une fonctionnalité DMA master bus intégrée, le pilote de contrôleur série peut prendre en charge les transactions personnalisées pour rendre cette fonctionnalité disponible pour SerCx2.
Les transactions personnalisées sont flexibles en termes de types de mécanismes de transfert de données qu’elles peuvent prendre en charge. Toutefois, ces transactions sont plus difficiles à implémenter que les transactions PIO ou les transactions DMA système. Pour prendre en charge les transactions personnalisées, le pilote de contrôleur série doit généralement configurer et initialiser le matériel utilisé pour transférer des données. En outre, si une demande de lecture ou d’écriture en attente est annulée avant la fin de la transaction de réception personnalisée ou de transmission personnalisée associée, le pilote doit mettre fin à la transaction et terminer la demande.
Chaque transaction d’E/S est une opération relativement simple. Une transaction d’E/S lit les données du contrôleur série ou écrit des données dans le contrôleur, et ne mélange jamais les lectures et les écritures. Une transaction d’E/S utilise un seul mode de transfert (PIO, DMA système ou personnalisé) et ne mélange jamais les modes de transfert.
SerCx2 peut décider intelligemment d’utiliser PIO ou DMA pour répondre à une demande de lecture ou d’écriture. Par exemple, SerCx2 peut choisir de présenter une demande de lecture ou d’écriture très courte au pilote de contrôleur série en tant que transaction PIO. SerCx2 peut également présenter une demande de lecture ou d’écriture plus longue au contrôleur série en tant que transaction DMA.
Fractionner une demande de lecture ou d’écriture en plusieurs transactions
Certains contrôleurs DMA système peuvent avoir des limitations qui obligent SerCx2 à interrompre une demande de lecture ou d’écriture plus longue en deux ou plusieurs transactions d’E/S. Par exemple, si un contrôleur DMA système exige que les transferts DMA commencent et se terminent sur des limites d’octets pairs dans la mémoire mémoire, mais que la mémoire tampon de données d’une demande de lecture démarre et se termine sur des limites d’octets impaires, SerCx2 peut utiliser PIO pour transférer le premier et le dernier octet vers la mémoire tampon, et utiliser la mémoire tampon DMA système pour transférer toutes les données entre le premier et le dernier octet. Pour cet exemple, SerCx2 émet les trois transactions d’E/S suivantes au pilote de contrôleur série dans l’ordre indiqué :
- Transaction pio-receive pour le premier octet.
- Transaction system-DMA-receive pour les octets entre les octets.
- Transaction pio-receive pour le dernier octet.
De même, si un mécanisme de transfert de données personnalisé peut démarrer et mettre fin à une transaction de transmission personnalisée sur une limite d’octet arbitraire en mémoire, mais que la taille de la mémoire tampon dans une demande d’écriture dépasse la longueur maximale de transfert d’une transaction de transmission personnalisée, SerCx2 partitionne la demande d’écriture en deux (ou plusieurs) transactions de transmission personnalisées, chacune d’elles ne dépassant pas la longueur maximale de transfert.
Si SerCx2 doit fractionner une demande de lecture ou d’écriture en deux ou plusieurs transactions d’E/S, le pilote de contrôleur série peut ignorer en toute sécurité la relation de ces transactions entre elles et avec la demande. SerCx2 sérialise les transactions pour garantir que les données sont reçues ou transmises dans l’ordre correct.
Lorsque le pilote de contrôleur série inscrit un ensemble de fonctions de rappel pour prendre en charge les transactions système-DMA ou les transactions personnalisées, le pilote fournit des valeurs de paramètres qui décrivent les fonctionnalités du matériel qui effectuera ces transactions. Par exemple, pour les transactions DMA système, les paramètres incluent les exigences d’alignement et les longueurs de transfert minimales et maximales que le contrôleur DMA système prend en charge. SerCx2 utilise ces paramètres pour décider s’il faut traiter une demande de lecture ou d’écriture en tant que transaction PIO ou transaction DMA système, et s’il faut diviser la demande en deux ou plusieurs transactions d’E/S.
Toutefois, un contrôleur série peut avoir des fonctionnalités matérielles spéciales qui ne peuvent pas être correctement décrites par les paramètres que le pilote du contrôleur série fournit à SerCx2. Par conséquent, le pilote peut avoir accès à des informations dépendantes du matériel qui permettent au pilote de prendre de meilleures décisions que SerCx2 sur la façon de partitionner une demande de lecture ou d’écriture en une ou plusieurs transactions d’E/S. En option, un tel pilote peut implémenter des fonctions de rappel d’événements EvtSerCx2SelectNextReceiveTransactionType et EvtSerCx2SelectNextTransmitTransactionType . SerCx2 appelle ces fonctions, si elles sont implémentées, pour permettre au pilote de décider des transactions d’E/S à utiliser pour répondre à une demande de lecture ou d’écriture.