Cómo tener acceso a memoria de atributos de PC Card

Seleccione idioma Seleccione idioma
Id. de artículo: 308038 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

Resumen

En este artículo se muestra mediante código de cómo puede utilizar el método de interfaz BUS_INTERFACE_STANDARD un controlador de PC Card para tener acceso a la memoria de atributo en una IRQL menor o igual a DISPTACH_LEVEL.

Más información

Un controlador de dispositivo de la función de una tarjeta de PC que necesite tener acceso a la memoria de atributo de la tarjeta de muchas razones, como:
  • La necesidad de obtener información acerca la propia tarjeta desde la estructura de información de tarjeta (CIS), que es normalmente se encuentra al principio de la memoria de atributos pero también puede ser común en encuentra espacio de direcciones de memoria. Dicha información incluye la identidad de tarjeta y tipo de dispositivo y características, entre otras cosas.
  • Algunos dispositivos PC Card utilizan registros de configuración (registros estándar y posiblemente de fabricante específico registros), que se encuentran en la memoria de atributos. Algunos de los registros de configuración estándar son requerida por las tarjetas de E/s pero opcional para las tarjetas de memoria. Controladores deben suelen tener acceso directamente a estos registros dentro de una rutina de servicio de interrupción (ISR), por ejemplo leer el registro de estado de configuración (CSR) para comprobar que es una solicitud de interrupción pendiente y, en el caso de tarjetas de función único, desactive la solicitud de interrupción. Otro ejemplo es un controlador de acceso a un registro específicas del fabricante para fines de control.
El controlador debe obtener una interfaz BUS_INTERFACE_STANDARD inicialmente desde el controlador de bus PCMCIA enviando una solicitud de plug and play al objeto de dispositivo físico (PDO) (IRP_MN_QUERY_INTERFACE) en la IRQL PASSIVE_LEVEL.
NTSTATUS
GetBusInterfaceStandard(
    IN  PDEVICE_OBJECT DeviceObject,
    OUT PBUS_INTERFACE_STANDARD	BusInterfaceStandard
    )
/*++

Routine Description:

    This routine gets the bus interface standard information from the PDO.

Arguments:

    DeviceObject - Device object to query for this information.

    BusInterface - Supplies a pointer to the retrieved information.

Return Value:

    NT status.

--*/ 
{
    KEVENT event;
    NTSTATUS status;
    PIRP irp;
    IO_STATUS_BLOCK ioStatusBlock;
    PIO_STACK_LOCATION irpStack;
    PDEVICE_OBJECT targetObject;

    Bus_KdPrint(("GetPciBusInterfaceStandard entered.\n"));

    KeInitializeEvent( &event, NotificationEvent, FALSE );

    targetObject = IoGetAttachedDeviceReference( DeviceObject );

    irp = IoBuildSynchronousFsdRequest( IRP_MJ_PNP,
                                        targetObject,
                                        NULL,
                                        0,
                                        NULL,
                                        &event,
                                        &ioStatusBlock );

    if (irp == NULL) {
        status = STATUS_INSUFFICIENT_RESOURCES;
        goto End;
    }

    irpStack = IoGetNextIrpStackLocation( irp );
    irpStack->MinorFunction = IRP_MN_QUERY_INTERFACE;
    irpStack->Parameters.QueryInterface.InterfaceType = (LPGUID) &GUID_BUS_INTERFACE_STANDARD ;
    irpStack->Parameters.QueryInterface.Size = sizeof(BUS_INTERFACE_STANDARD);
    irpStack->Parameters.QueryInterface.Version = 1;
    irpStack->Parameters.QueryInterface.Interface = (PINTERFACE)BusInterfaceStandard;
    irpStack->Parameters.QueryInterface.InterfaceSpecificData = NULL;

    // 
    // Initialize the status to error in case the bus driver does not 
    // set it correctly.
    // 

    irp->IoStatus.Status = STATUS_NOT_SUPPORTED ;

    status = IoCallDriver( targetObject, irp );

    if (status == STATUS_PENDING) {

        KeWaitForSingleObject( &event, Executive, KernelMode, FALSE, NULL );
        status = ioStatusBlock.Status;
    }

End:
    // 
    // Done with reference
    // 
    ObDereferenceObject( targetObject );

    return status;

} 
				
una vez que la interfaz de bus PCMCIA, puede utilizar sus rutinas de interfaz GetBusData o SetBusData para tener acceso a la memoria de atributos. Se escriben datos sólo en incluso bytes en la memoria de atributos. Por tanto, al tener acceso a las tuplas de PC Card en la memoria de atributos, el desplazamiento especificado en las llamadas a GetBusData o SetBusData es un desplazamiento de 16 bits y no un desplazamiento de 8 bits. Por ejemplo, si necesita tener acceso a byte 60 (desde la base de la memoria de atributos), a continuación, un valor de desplazamiento de 30 debe utilizarse. El controlador de bus se ocupa de la traducción (multiplicar por 2). Se diseñó así para impedir el acceso a los bytes impares.
// Read the Configuration Status Register data 
ULONG valueRead;
UCHAR tupleData;
ULONG offset = CSR_OFFSET   // If CSR is located at byte X from attribute memory base, then use an offset value of X/2

valueRead = (BusInterfaceStandard->GetBusData)(PDO, PCCARD_ATTRIBUTE_MEMORY, &tupleData, offset, 1);                          
				
de forma similar, se puede utilizar SetBusData para escritura.

Referencias

Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
253232Cómo obtener la información de configuración y ubicación del dispositivo PCI

Propiedades

Id. de artículo: 308038 - Última revisión: lunes, 24 de febrero de 2014 - Versión: 4.0
La información de este artículo se refiere a:
  • Microsoft Windows Server 2003 Driver Development Kit (DDK)
  • Microsoft Win32 Device Driver Kit for Windows 2000
  • Microsoft Windows XP Driver Development Kit
  • the operating system: Microsoft Windows 2000
  • the operating system: Microsoft Windows XP
Palabras clave: 
kbnosurvey kbarchive kbmt kbfile kbhowto kbkmode kbplugplay kbwdm KB308038 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 308038

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com