Criando mapas de recursos variados
Embora os mapas de recursos padrão possam atribuir apenas um recurso pai inteiro a um filho de um dispositivo multifuncional, mapas de recursos variados permitem subdividir um recurso pai entre filhos enumerados por mf.sys. Há suporte para mapas de recursos variados no Windows XP e em versões posteriores do sistema operacional baseado em NT.
Por exemplo, considere um cartão serial multiport no barramento PCI. Suponha que cada uma das funções UART de 16550 do cartão exija um conjunto de oito portas de E/S e uma única interrupção compartilhada. Suponha também que o cartão seja implementado como uma única função PCI. Nesse cenário, é comum solicitar um único bloco de portas de E/S e dividir esse bloco em oito segmentos, um para cada função UART 16550.
Além da porta de E/S e dos recursos de interrupção exigidos pelas funções UART de 16550 do cartão, suponha que o dispositivo também exija intervalos de memória e recursos privados do dispositivo.
Com base nessas suposições, mf.sys retornará uma lista de requisitos de recursos para este dispositivo, construída da seguinte maneira:
Número de recursos | Recurso |
---|---|
00 | Intervalo de memória Endereço de Registro Base (BAR) 0 |
01 | Dados Privados |
02 | Intervalo de memória BARRA 1 |
03 | Dados Privados |
04 | Intervalo de portas de E/S BARRA 2 |
05 | Dados Privados |
06 | Interrupção |
Os fornecedores usam diretivas de arquivo INF para especificar o compartilhamento desses recursos entre as funções UART do cartão 16550. Para cada função que requer um segmento dos recursos do dispositivo, você deve usar uma entrada VaryingResourceMap no INF para criar uma entrada do Registro. Veja a seguir um trecho do arquivo 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
A linha que contém VaryingResourceMap é interpretada da seguinte maneira:
O "1" após o parâmetro VaryingResourceMap especifica que o tipo de dados da entrada do Registro é REG_BINARY.
Os números após o "1" são os valores variados do mapa de recursos. O '04' indica o recurso pai, um segmento do qual estamos atribuindo a esse filho. Nesse caso, estamos atribuindo um segmento de recurso 04 (BARRA 2) ao filho (ou seja, uma parte do recurso que representa os oito intervalos de portas de E/S para cada porta serial).
Os próximos dois DWORDs indicam, primeiro, o deslocamento para o recurso e, segundo, o comprimento do intervalo que deve ser alocado para esse filho. Nesse caso, oito portas de E/S estão sendo alocadas para esse filho, começando no deslocamento 0x10 para o recurso pai.
Se esse filho exigisse outro recurso pai, o número, o comprimento e o deslocamento do recurso seriam incluídos na mesma linha do INF, seguindo o primeiro recurso.
O parâmetro ResourceMap é descrito em Criando Mapas de Recursos Padrão e indica que esse filho deve obter um compartilhamento do recurso 06, que nesse caso é a interrupção do dispositivo PCI.
Veja a seguir um exemplo mais completo para este dispositivo, especificando quatro funções filho:
[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"