Création de mappages de ressources variables
Alors que les mappages de ressources standard peuvent uniquement affecter une ressource parent entière à un enfant d’un appareil multifonction, différents mappages de ressources vous permettent de subdiviser une ressource parente parmi les enfants énumérés par mf.sys. Différentes cartes de ressources sont prises en charge sur Windows XP et les versions ultérieures du système d’exploitation NT.
Par exemple, considérez un carte série multiport sur le bus PCI. Supposons que chacune des fonctions UART 16550 du carte nécessite un ensemble de huit ports d’E/S et une seule interruption partagée. Supposons également que le carte soit implémenté en tant que fonction PCI unique. Dans ce scénario, il est courant de demander un seul bloc de ports d’E/S, puis de fractionner ce bloc en huit segments, un pour chaque fonction UART 16550.
En plus des ressources de port d’E/S et d’interruption requises par les fonctions UART 16550 de l’carte, supposons que l’appareil nécessite également des plages de mémoire et des ressources privées du périphérique.
Sur la base de ces hypothèses, mf.sys retournera une liste des besoins en ressources pour cet appareil, construite comme suit :
Numéro de ressource | Ressource |
---|---|
00 | Plage de mémoire Adresse de registre de base (BAR) 0 |
01 | Données privées |
02 | Plage de mémoire BARRE 1 |
03 | Données privées |
04 | Plage de ports d’E/S BARRE 2 |
05 | Données privées |
06 | Interruption |
Les fournisseurs utilisent des directives de fichier INF pour spécifier le partage de ces ressources entre les fonctions UART 16550 du carte. Pour chaque fonction qui nécessite un segment des ressources de l’appareil, vous devez utiliser une entrée VaryingResourceMap dans l’INF pour créer une entrée de Registre. Voici un extrait du fichier INF pour cet appareil :
[DDInstall.RegHW]
; for each "child" function list hardware ID and resource map
; and/or varying resource map
HKR,Child0002,HardwareID,, child0002-hardware ID
HKR,Child0002,VaryingResourceMap,1,04, 10,00,00,00, 08,00,00,00
HKR,Child0002,ResourceMap,1,06
La ligne contenant VaryingResourceMap est interprétée comme suit :
Le « 1 » suivant le paramètre VaryingResourceMap spécifie que le type de données de l’entrée de Registre est REG_BINARY.
Les nombres qui suivent « 1 » sont les différentes valeurs de carte de ressources. Le « 04 » indique la ressource parente, un segment que nous affectons à cet enfant. Dans ce cas, nous affectons un segment de ressource 04 (BAR 2) à l’enfant (autrement dit, une partie de la ressource représentant les huit plages de ports d’E/S pour chaque port série).
Les deux DWORD suivants indiquent, tout d’abord, le décalage dans la ressource et, deuxièmement, la longueur de la plage qui doit être allouée à cet enfant. Dans ce cas, huit ports d’E/S sont alloués à cet enfant, en commençant par décalage 0x10 dans la ressource parente.
Si cet enfant a besoin d’une autre ressource parente, le nombre, la longueur et le décalage de la ressource sont inclus sur la même ligne de l’INF, après la première ressource.
Le paramètre ResourceMap est décrit dans Création de mappages de ressources standard et indique que cet enfant doit obtenir une part de la ressource 06, qui, dans ce cas, est l’interruption de l’appareil PCI.
Voici un exemple plus complet pour cet appareil, spécifiant quatre fonctions enfants :
[Version]
Signature="$Windows NT$"
Class=MultiFunction
ClassGUID={4d36e971-e325-11ce-bfc1-08002be10318}
Provider=%MYCOMPANY%
DriverVer=1/20/2000
CatalogFile=ExampleCatalog.cat
PnpLockdown=1
[ControlFlags]
ExcludeFromSelect=*
[Manufacturer]
%MYCOMPANY%=MYCOMPANY,NTamd64
[MYCOMPANY.NTamd64]
%MYCOMPANY_4PORT%=MYCOMPANY4PORT_inst, PCI\VEN_10B5&DEV_9050&SUBSYS_003112E0
[MYCOMPANY4PORT_inst]
Include = mf.inf
Needs = MFINSTALL.mf
[MYCOMPANY4PORT_inst.HW]
AddReg=MYCOMPANY4PORT_inst.RegHW
[MYCOMPANY4PORT_inst.Services]
Include = mf.inf
Needs = MFINSTALL.mf.Services
[MYCOMPANY4PORT_inst.RegHW]
HKR,Child0000,HardwareID,,*PNP0501
HKR,Child0000,VaryingResourceMap,1,04, 00,00,00,00, 08,00,00,00
HKR,Child0000,ResourceMap,1,06
HKR,Child0001,HardwareID,,*PNP0501
HKR,Child0001,VaryingResourceMap,1,04, 08,00,00,00, 08,00,00,00
HKR,Child0001,ResourceMap,1,06
HKR,Child0002,HardwareID,,*PNP0501
HKR,Child0002,VaryingResourceMap,1,04, 10,00,00,00, 08,00,00,00
HKR,Child0002,ResourceMap,1,06
HKR,Child0003,HardwareID,,*PNP0501
HKR,Child0003,VaryingResourceMap,1,04, 18,00,00,00, 08,00,00,00
HKR,Child0003,ResourceMap,1,06
[Strings]
MYCOMPANY= "MYCOMPANY Inc."
MYCOMPANY_4PORT="MYCOMPANY 4PORT"