Delen via


GPIO-Based hardwarebronnen

Vanaf Windows 8 zijn de GPIO-pinnen (General-Purpose I/O) die worden beheerd door een GPIO-controllerstuurprogramma beschikbaar voor andere stuurprogramma's als door het systeem beheerde hardwarebronnen. GPIO I/O-pinnen, die zijn pinnen die zijn geconfigureerd als gegevensinvoer of gegevensuitvoer, zijn beschikbaar als een nieuw Windows-resourcetype, GPIO I/O-resources. Daarnaast zijn GPIO-interruptpins, die zijn pinnen die zijn geconfigureerd als invoer voor interruptaanvragen, beschikbaar als gewone Windows-interruptbronnen.

Een GPIO I/O-resource vertegenwoordigt een set GPIO-pinnen waarnaar het stuurprogramma voor een randapparaat kan lezen of schrijven. Windows verbergt details over de onderliggende implementatie van de GPIO I/O-pinnen, zodat randapparatuurstuurprogramma's kunnen worden geschreven om abstracte GPIO I/O-resources te manipuleren. Stuurprogramma's voor randapparatuur die gebruikmaken van deze abstracte resources kunnen werken op platforms, ongeacht de GPIO-controllerhardware waarmee de resources worden geïmplementeerd. Een GPIO I/O-resource wordt vertegenwoordigd door een WDFIOTARGET-ingang die deze resource koppelt aan het specifieke GPIO-controllerstuurprogramma dat eigenaar is van de onderliggende GPIO-pincode of -pinnen.

Normaal gesproken kan een I/O-pin op een GPIO-controller worden geconfigureerd voor invoer of voor uitvoer, afhankelijk van de mogelijkheden van de controllerhardware en het apparaat dat fysiek is verbonden met de pin. Een stuurprogramma kan dus een logische verbinding met deze pincode openen voor schrijf- of leesbewerkingen, maar niet voor beide. Deze beperking wordt echter opgelegd door de hardware en niet door de GPIO Framework-extensie (GpioClx). Als de hardware een I/O-pin kan configureren voor zowel input als output, stelt GpioClx een stuurprogramma in staat om een logische verbinding met de pin tot stand te brengen voor zowel lees- als schrijfbewerkingen.

Voor GPIO-pinnen die zijn geconfigureerd als invoer voor interruptaanvragen, wordt het feit dat een interrupt-aanvraag wordt geïmplementeerd door een GPIO-pincode in plaats van door een interruptcontroller of een speciale interruptaanvraagregel volledig geabstraheerd door het besturingssysteem. GPIO-interrupts worden gepresenteerd aan randapparatuurstuurprogramma's als abstracte interruptbronnen. De abstractie van deze resources wordt ondersteund door de GPIO-stuurprogrammastack en door de hardwareabstractielaag (HAL). Daarom kunnen randapparaatstuurprogramma's die gebruikmaken van interrupt-resources grotendeels details over de onderliggende implementatie van deze resources negeren. Zie GPIO-interrupts voor meer informatie.

In het volgende diagram ziet u een voorbeeld van een toewijzing van resources op basis van GPIO aan twee stuurprogramma's voor randapparatuur:

voorbeeldtoewijzing van resources op basis van gpio.

In het voorafgaande diagram worden de volgende drie GPIO-resources aan apparaatstuurprogramma A toegewezen.

  • Twee pinnen voor gegevensinvoer
  • Een pincode voor gegevensuitvoer
  • Een onderbrekingsinvoerpin

De volgende twee gpIO-resources worden toegewezen aan stuurprogramma B voor randapparatuur:

  • Een pincode voor gegevensinvoer
  • Een onderbrekingsinvoerpin

Stuurprogramma's A en B ontvangen hun toegewezen resources in hun EvtDevicePrepareHardware callback-functies. Als een stuurprogramma een set GPIO I/O-pinnen als resource ontvangt, kan het stuurprogramma een verbinding met deze pinnen openen om er toegang tot te krijgen. Het stuurprogramma verkrijgt een WDFIOTARGET-ingang om de verbinding te identificeren en I/O-aanvragen naar deze ingang te verzenden om te lezen van of schrijven naar deze pinnen.

Zie de volgende onderwerpen voor codevoorbeelden die laten zien hoe u verbinding maakt met een set GPIO I/O-pinnen en I/O-aanvragen naar deze pinnen verzendt:

Verbinden van een KMDF-stuurprogramma met GPIO I/O-pinnen

In beide onderwerpen opent de IoRoutine functie in het codevoorbeeld een GPIO I/O-pincoderesource voor leesbewerkingen of schrijfbewerkingen, afhankelijk van de ReadOperation parameterwaarde. Als de resource wordt geopend voor leesbewerkingen (DesiredAccess = GENERIC_READ), worden de pinnen in de resource geconfigureerd als invoer en wordt een IOCTL_GPIO_READ_PINS aanvraag die naar de pinresource wordt verzonden, de invoerwaarden bij deze pinnen gelezen. GpioClx staat niet toe dat een IOCTL_GPIO_WRITE_PINS verzoek naar een set invoerpinnen wordt verzonden, en voltooit een dergelijk verzoek met een STATUS_GPIO_OPERATION_DENIED foutstatus. Als de pinresource wordt geopend voor schrijfbewerkingen (DesiredAccess = GENERIC_WRITE), worden de pinnen in de resource geconfigureerd als uitvoer. Een IOCTL_GPIO_WRITE_PINS aanvraag naar de pinresource stelt de waarden in de uitvoervergrendelingen in die deze pinnen aansturen. Normaal gesproken leest het verzenden van een IOCTL_GPIO_READ_PINS aanvraag naar een set uitvoerpinnen de laatste waarden die naar de uitvoervergrendelingen zijn geschreven.

Als u een interruptresource wilt gebruiken om interrupts te ontvangen, moet een clientstuurprogramma een interruptserviceroutine (ISR) verbinden met de interrupt. Normaal gesproken maakt het stuurprogramma deze verbinding door de methode WdfInterruptCreate aan te roepen (of, mogelijk, de IoConnectInterruptEx-routine ). Zie Een Interrupt-object maken voor meer informatie over KMDF-interrupts.

In tegenstelling tot Plug en Play-apparaten die dynamisch kunnen worden verbonden met en losgekoppeld van een hardwareplatform, wordt een GPIO-controllerapparaat permanent aangesloten. Bovendien wordt ervan uitgegaan dat verbindingen tussen GPIO-pinnen en een randapparaat permanent zijn. (Of als het randapparaat uit een sleuf kan worden losgekoppeld, is de sleuf toegewezen aan dit apparaat.) De beschikbare GPIO-resources zijn daarom vast en kunnen worden opgegeven in de platformfirmware. Op dezelfde manier wordt ervan uitgegaan dat apparaatstuurprogramma's voor randapparatuur die gebruikmaken van GPIO-resources gebruikmaken van toegewezen sets GPIO-resources. De resourcevereisten voor deze apparaatstuurprogramma's kunnen dus worden opgegeven in de platformfirmware.

Wanneer de platformfirmware een set GPIO-pinnen aanwijst als een GPIO I/O-resource, geeft de firmware aan of de pinnen in deze resource kunnen worden geopend voor leesbewerkingen, voor schrijfbewerkingen of voor zowel lees- als schrijfbewerkingen.

Als een apparaatstuurprogramma voor randapparatuur meer dan één GPIO I/O-resource gebruikt, moet dit stuurprogramma op de hoogte zijn van de volgorde waarin deze resources worden geïnventariseerd door de PnP-manager. Als een stuurprogramma bijvoorbeeld twee GPIO I/O-pinnen gebruikt, maar deze pinnen onafhankelijk en afzonderlijk moeten worden geopend, moet de platformfirmware elke pin beschrijven als een afzonderlijke GPIO I/O-resource. De PnP-manager inventariseert deze resources in de volgorde waarin ze worden beschreven in de platformfirmware, die moet overeenkomen met de volgorde die door het stuurprogramma wordt verwacht.

Nadat een apparaatstuurprogramma voor randapparatuur een verbinding met een GPIO I/O-resource heeft geopend, heeft een IOCTL_GPIO_READ_PINS of IOCTL_GPIO_WRITE_PINS aanvraag die dit stuurprogramma naar deze verbinding verzendt, toegang tot alle pinnen in de resource. Als het stuurprogramma soms alleen toegang moet krijgen tot een subset van deze pinnen, moet deze subset als afzonderlijke resource aan het stuurprogramma worden toegewezen.

Voor meer informatie over IOCTL_GPIO_READ_PINS-aanvragen, waaronder de toewijzing van invoerpinnen aan de bits in de uitvoerbuffer van de aanvraag, zie IOCTL_GPIO_READ_PINS. Zie IOCTL_GPIO_WRITE_PINS voor meer informatie over IOCTL_GPIO_WRITE_PINS verzoeken, waaronder de indeling van de bits in de invoerbuffer van het verzoek naar de gegevensuitvoerpennen.