Condividi tramite


Creazione di mappe di risorse variabili

Sebbene le mappe delle risorse standard possano assegnare un'intera risorsa padre a un elemento figlio di un dispositivo multifunzione, le mappe delle risorse variabili consentono di suddividere una risorsa padre tra gli elementi figlio enumerati da mf.sys. Le mappe delle risorse variabili sono supportate in Windows XP e versioni successive del sistema operativo basato su NT.

Si consideri ad esempio una scheda seriale multiport sul bus PCI. Si supponga che ognuna delle funzioni UART della scheda 16550 richieda un set di otto porte di I/O e un singolo interruzione condiviso. Si supponga inoltre che la scheda venga implementata come singola funzione PCI. In questo scenario, è tipico richiedere un singolo blocco di porte di I/O e quindi suddividere questo blocco in otto segmenti, uno per ogni funzione UART 16550.

Oltre alle risorse di I/O e di I/O richieste dalle funzioni UART della scheda, presupporre che il dispositivo richieda anche intervalli di memoria e risorse private del dispositivo.

In base a questi presupposti, mf.sys restituirà un elenco dei requisiti di risorsa per questo dispositivo, costruito come segue:

Resourcenumber Risorsa
00 Intervallo di memoria Indirizzo registro di base (BAR) 0
01 Dati privati
02 Intervallo di memoria BARRA 1
03 Dati privati
04 Intervallo di porte I/O BARRA 2
05 Dati privati
06 Interrompere

I fornitori usano direttive di file INF per specificare la condivisione di queste risorse tra le funzioni UART della scheda 16550. Per ogni funzione che richiede un segmento delle risorse del dispositivo, è necessario usare una voce VaryingResourceMap in INF per creare una voce del Registro di sistema. Di seguito è riportato un estratto dal file INF per questo dispositivo:

[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 riga contenente VaryingResourceMap viene interpretata come segue:

  • Il parametro "1" che segue il parametro VaryingResourceMap specifica che il tipo di dati della voce del Registro di sistema è REG_BINARY.

  • I numeri che seguono "1" sono i valori variabili della mappa delle risorse. Il '04' indica la risorsa padre, un segmento di cui si sta assegnando a questo figlio. In questo caso, si assegna un segmento di risorsa 04 (BAR 2) al figlio , ovvero un pezzo della risorsa che rappresenta gli otto intervalli di porte di I/O per ogni porta seriale.

  • I due DWORD successivi indicano, prima, l'offset nella risorsa e, in secondo luogo, la lunghezza dell'intervallo che deve essere allocata a questo elemento figlio. In questo caso, otto porte di I/O vengono allocate a questo elemento figlio, a partire dall'offset 0x10 nella risorsa padre.

  • Se questo figlio richiede un'altra risorsa padre, il numero, la lunghezza e l'offset della risorsa verranno inclusi nella stessa riga di INF, seguendo la prima risorsa.

Il parametro ResourceMap è descritto in Creazione di mappe risorse standard e indica che questo figlio deve ottenere una condivisione di risorsa 06, che in questo caso è l'interruzione del dispositivo PCI.

Di seguito è riportato un esempio più completo per questo dispositivo, specificando quattro funzioni figlio:

[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"