Översikt över GPIO-drivrutinssupport
Från och med Windows 8 förenklar GPIO-ramverkstillägget (GpioClx) uppgiften att skriva en drivrutin för en GPIO-styrenhet. Dessutom tillhandahåller GpioClx drivrutinsstöd för kringutrustning som ansluter till GPIO-stift. GpioClx, som är ett tillägg som tillhandahålls av systemet till drivrutinsramverket i kernelläge (KMDF), utför bearbetningsuppgifter som är gemensamma för medlemmar i GPIO-enhetsklassen.
Den här översikten beskriver följande artiklar:
- översikt över GPIO-drivrutinssupport
GPIO-styrenhetsdrivrutiner
Maskinvaruleverantörer tillhandahåller drivrutiner för att kontrollera sina GPIO-styrenheter. En GPIO-styrenhetsdrivrutin är en KMDF-drivrutin som hanterar alla maskinvaruspecifika åtgärder för en GPIO-styrenhet. GPIO-styrenhetsdrivrutinen samarbetar med GpioClx för att hantera I/O-begäranden för grupper av GPIO-stift som är konfigurerade som dataindata och datautdata. Dessutom samarbetar den här drivrutinen med GpioClx för att hantera avbrottsbegäranden från GPIO-stift som är konfigurerade som avbrottsindata.
En GPIO-styrenhet har ett antal GPIO-stift. Dessa stift kan vara fysiskt anslutna till kringutrustning. GPIO-stift kan konfigureras som indata, datautdata eller indata för avbrottsbegäran. Vanligtvis är en GPIO-pin dedikerad till en kringutrustningsenhet och delas inte av två eller flera enheter. Anslutningar mellan GPIO-stift och kringutrustning är fasta och kan inte ändras av användaren (till exempel genom att ta bort en kringutrustning och ersätta den med en annan enhet). Tilldelningen av GPIO-stift till kringutrustning kan därför beskrivas i plattformens inbyggda programvara.
Följande diagram visar GPIO-styrenhetens drivrutin och GpioClx.
GPIO-styrenhetens drivrutin och GpioClx kommunicerar med varandra via GpioClx-gränssnittet för enhetsdrivrutiner (DDI). GPIO-styrenhetsdrivrutinen anropar drivrutinsstödsmetoder som implementeras av GpioClx. GpioClx anropar funktioner för återanrop av händelser som implementeras av GPIO-styrenhetens drivrutin.
GPIO-styrenhetens drivrutin har direkt åtkomst till maskinvaruregistren för GPIO-styrenheten.
GpioClx hanterar I/O-begäranden från drivrutinerna för kringutrustning som fysiskt ansluter till GPIO-stift. GpioClx översätter dessa I/O-begäranden till enkla maskinvaruåtgärder, som de utför genom att anropa funktionerna för händelseåteranrop som implementeras av GPIO-styrenhetens drivrutin. Om du till exempel vill läsa data från eller skriva data till en uppsättning GPIO-stift anropar GpioClx funktioner för återanrop av händelser, till exempel CLIENT_ReadGpioPins och CLIENT_WriteGpioPins. GpioClx hanterar I/O-köerna för GPIO-kontrollanten och avlastar därmed GPIO-styrenhetens drivrutin för den här uppgiften.
Dessutom hanterar GpioClx primära avbrott från GPIO-styrenheten och mappar dessa avbrott till sekundära avbrott, som hanteras av drivrutiner för kringutrustning. Primära avbrott är avbrott som genereras av maskinvaruenheter. Sekundära avbrott genereras av operativsystemet som svar på vissa primära avbrott. Både primära och sekundära avbrott identifieras av globala systemavbrott (GSI). Den inbyggda ACPI-programvaran för maskinvaruplattformen tilldelar GSI:er till primära avbrott, och vid körning tilldelar operativsystemet GSI:er till sekundära avbrott.
Till exempel tilldelar den inbyggda programvaran en GSI till maskinvaruavbrottet från GPIO-styrenheten, och operativsystemet tilldelar en GSI till en GPIO-pin som är konfigurerad som en avbrottsinmatning.
GpioClx implementerar en ISR som hanterar maskinvarugenererade, primära avbrott från GPIO-styrenheten. När en kringutrustningsenhet initierar ett avbrott på en GPIO-pin och avbrotten på den här pinen är aktiverade och avmaskerade, avbryter GPIO-styrenheten processorn. Som svar schemalägger kernel trap-hanteraren GpioClx ISR för körning. För att identifiera GPIO-stiftet som orsakade avbrottet anropar GpioClx ISR funktionen CLIENT_QueryActiveInterrupts händelseåteranrop, som implementeras av GPIO-styrenhetens drivrutin. GpioClx ISR söker sedan upp den GSI som är tilldelad till den här pin-koden och skickar denna GSI till maskinvaruabstraktionsskiktet (HAL). HAL genererar ett sekundärt avbrott genom att anropa den ISR som är registrerad för denna GSI. Denna ISR tillhör drivrutinen för den kringutrustning som ursprungligen bekräftade avbrottet.
Mer information om primära och sekundära avbrott finns i GPIO-avbrott.
Drivrutiner för kringutrustning som använder GPIO-pins
Vid start räknar PnP-hanteraren upp både PnP-enheter och icke-PnP-enheter. För icke-PnP-enheter med fasta anslutningar till GPIO-stift frågar PnP-hanteraren efter plattformens firmware för att fastställa vilka GPIO-stift som är tilldelade som systemhanterade hårdvaruresurser till dessa enheter.
KMDF-drivrutinen för en kringutrustningsenhet får sina tilldelade maskinvaruresurser under ett EvtDevicePrepareHardware återanrop. Dessa resurser kan innehålla GPIO-stift som är konfigurerade som datautdata, dataindata eller indata från avbrottsbegäran.
En GPIO I/O-resurs är en ny Windows-resurstyp i Windows 8. Den här resursen består av en uppsättning med en eller flera GPIO-stift som kan användas antingen som dataindata eller datautdata. Om en kringutrustningsenhetsdrivrutin öppnar en GPIO I/O-resurs för läsningar använder drivrutinen alla stift i resursen som dataindata. Om en drivrutin öppnar en GPIO I/O-resurs för skrivningar använder drivrutinen alla stift i resursen som datautdata. Kodexempel som visar hur en kringutrustningsenhetsdrivrutin öppnar en logisk anslutning till en uppsättning GPIO I/O-pins finns i följande avsnitt:
Ansluta en KMDF-drivrutin till GPIO I/O-pins
En GPIO-pin som är konfigurerad som en avbrottsinmatning tilldelas till en drivrutin som en vanlig Windows-avbrottsresurs. Abstrahering av avbrottsresurs döljer det faktum att ett avbrott kan implementeras av en GPIO-pin i stället för till exempel en programmerbar avbrottskontrollant. Drivrutinen kan därför behandla en GPIO-baserad avbrottsresurs på samma sätt som andra avbrottsresurser.
För att få åtkomst till GPIO-stiften i en GPIO I/O-resurs måste en kringutrustningsdrivrutin öppna en logisk anslutning till stiften. En KMDF-drivrutin anropar metoden WdfIoTargetOpen för att öppna anslutningen. Via den här anslutningen kan drivrutinen skicka I/O-begäranden till GPIO-stiften. Drivrutinen skickar IOCTL_GPIO_READ_PINS begäranden om att läsa data från dessa pins (om de är indatastift) eller IOCTL_GPIO_WRITE_PINS begäranden om att skriva data till dem (om de är utdatastift).
För att ta emot avbrott från en GPIO-pin genom en avbrottsresurs måste en drivrutin för kringutrustning registrera sin avbrottstjänstrutin (ISR) för att ta emot avbrott från den avbrottsresurs som den här pinnen implementerar. En KMDF-drivrutin anropar metoden WdfInterruptCreate för att ansluta en ISR till avbrottet.