Compartir a través de


Crear asignaciones de recursos variables

Aunque los mapas de recursos estándar solo pueden asignar un recurso primario completo a un elemento secundario de un dispositivo multifunción, las distintas asignaciones de recursos permiten subdividir un recurso primario entre los elementos secundarios enumerados por mf.sys. Se admiten diferentes asignaciones de recursos en Windows XP y versiones posteriores del sistema operativo basado en NT.

Por ejemplo, considere una tarjeta serie multiporte en el bus PCI. Supongamos que cada una de las funciones UART 16550 de la tarjeta requiere un conjunto de ocho puertos de E/S y una única interrupción compartida. Suponga también que la tarjeta se implementa como una sola función PCI. En este escenario, es habitual solicitar un único bloque de puertos de E/S y, a continuación, dividir este bloque en ocho segmentos, uno para cada función UART de 16550.

Además del puerto de E/S y los recursos de interrupción requeridos por las funciones UART 16550 de la tarjeta, suponga que el dispositivo también requiere intervalos de memoria y recursos privados del dispositivo.

En función de estas suposiciones, mf.sys devolverá una lista de requisitos de recursos para este dispositivo, construida como se indica a continuación:

Número de recurso Resource
00 Intervalo de memoria Dirección de registro base (BAR) 0
01 Datos privados
02 Intervalo de memoria BAR 1
03 Datos privados
04 Intervalo de puertos de E/S BAR 2
05 Datos privados
06 Interrupción

Los proveedores usan directivas de archivo INF para especificar el uso compartido de estos recursos entre las funciones UART 16550 de la tarjeta. Para cada función que requiera un segmento de los recursos del dispositivo, debe usar una entrada VaryingResourceMap en inf para crear una entrada del Registro. A continuación se muestra un extracto del archivo INF para este 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 línea que contiene VaryingResourceMap se interpreta de la siguiente manera:

  • El parámetro "1" después del parámetro VaryingResourceMap especifica que el tipo de datos de la entrada del Registro es REG_BINARY.

  • Los números que siguen a "1" son los distintos valores del mapa de recursos. El "04" indica el recurso primario, un segmento del que estamos asignando a este elemento secundario. En este caso, estamos asignando un segmento de recurso 04 (BAR 2) al elemento secundario (es decir, una parte del recurso que representa los ocho intervalos de puertos de E/S para cada puerto serie).

  • Los dos DWORD siguientes indican, en primer lugar, el desplazamiento en el recurso y, en segundo lugar, la longitud del intervalo que se debe asignar a este elemento secundario. En este caso, se asignan ocho puertos de E/S a este elemento secundario, empezando por el desplazamiento 0x10 en el recurso primario.

  • Si este elemento secundario requería otro recurso primario, el número, la longitud y el desplazamiento del recurso se incluirían en la misma línea de INF, después del primer recurso.

El parámetro ResourceMap se describe en Creating Standard Resource Maps (Crear mapas de recursos estándar ) e indica que este elemento secundario debe obtener un recurso compartido de resource 06, que en este caso es la interrupción del dispositivo PCI.

A continuación se muestra un ejemplo más completo para este dispositivo, especificando cuatro funciones secundarias:

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