SD 카드 버스 인터페이스 열기, 초기화 및 닫기

SD(Secure Digital) 디바이스 드라이버는 SD 버스 인터페이스를 열고 초기화하여 관리하는 디바이스 또는 호스트 컨트롤러와 상호 작용해야 합니다. 이를 위해서는 SD 버스 라이브러리에 대한 두 가지 호출, 즉 SdBusOpenInterface 호출과 인터페이스를 초기화하는 버스 드라이버에서 제공하는 루틴에 대한 호출이 필요합니다. SdBusOpenInterfaceSDBUS_INTERFACE_STANDARD 구조체의 InterfaceReference 멤버에서 인터페이스를 초기화하는 루틴에 대한 포인터를 반환합니다. 디바이스 드라이버는 버스 드라이버에 인터럽트 알림 콜백 루틴에 대한 포인터를 제공하려면 이 초기화 루틴을 호출해야 합니다. 버스 드라이버는 이 콜백을 사용하여 디바이스 드라이버에 하드웨어 인터럽트를 알립니다. SD 버스 인터페이스를 초기화하는 루틴에 대한 자세한 내용은 PSDBUS_INITIALIZE_INTERFACE_ROUTINE 참조하세요. 디바이스 드라이버는 일반적으로 AddDevice 루틴 내에서 SD 버스 인터페이스를 열고 초기화합니다.

다음 코드 예제에서는 SD 버스 인터페이스를 열고 초기화하는 호출 시퀀스를 보여 줍니다.

  status = SdBusOpenInterface (pDevExt->UnderlyingPDO,
    &pDevExt->BusInterface,
    sizeof(SDBUS_INTERFACE_STANDARD),
    SDBUS_INTERFACE_VERSION);

  if (NT_SUCCESS(status)) {
    SDBUS_INTERFACE_PARAMETERS interfaceParameters = {0};
    interfaceParameters.Size = 
      sizeof(SDBUS_INTERFACE_PARAMETERS);
    interfaceParameters.TargetObject = 
      DeviceExtension->TargetObject;
    interfaceParameters.DeviceGeneratesInterrupts = TRUE;
    interfaceParameters.CallbackRoutine = pMyDriverCallback;
    status = STATUS_UNSUCCESSFUL;
    if (DeviceExtension->BusInterface.InitializeInterface) {
      status = (pDevExt->BusInterface.InitializeInterface)
        (pDevExt->BusInterface.Context, &interfaceParameters);
    }
      }

이 코드 예제에서 디바이스 드라이버는 SdBusOpenInterface를 호출하여 인터페이스를 열고, 버스 드라이버는 디바이스 확장(DeviceExtension-BusInterface.InitializeInterface>)에 초기화 루틴에 대한 포인터를 저장합니다. SdBusOpenInterface가 반환되면 드라이버는 디바이스 확장에서 이 포인터를 검색합니다. 다음으로, 드라이버는 자체 인터럽트 콜백 루틴인 pMyDriverCallback 에 대한 포인터를 SDBUS_INTERFACE_PARAMETERS 구조에 배치하고 이 구조를 초기화 루틴에 전달합니다.

또한 디바이스 드라이버는 SdBusOpenInterface 가 SDBUS_INTERFACE_STANDARD 구조체의 컨텍스트 멤버에서 반환하는 컨텍스트 정보를 검색해야 합니다. 드라이버가 SD 버스 인터페이스 루틴을 호출할 때마다 이 컨텍스트 데이터를 전달해야 합니다.

SD 인터페이스 닫기

SD 인터페이스를 닫기 위해 드라이버는 SdBusOpenInterface 루틴에 의해 할당된 모든 리소스를 해제하는 SDBUS_INTERFACE_STANDARD 구조체의 InterfaceDereference 멤버에서 루틴을 호출하여 인터페이스를 역참조해야 합니다. SD 디바이스 드라이버는 다음 IRP를 받을 때 열려 있는 모든 SD 인터페이스를 닫아야 합니다.

IRP_MN_QUERY_REMOVE_DEVICE

IRP_MN_REMOVE_DEVICE

IRP_MN_SURPRISE_REMOVAL

다음 코드 예제에서는 드라이버가 SD 카드 버스 인터페이스를 역참조하는 방법을 보여 줍니다.

if (pDevExt->BusInterface.InterfaceDereference) {
    (pDevExt->BusInterface.InterfaceDereference) (pDevExt->BusInterface.Context);
    RtlZeroMemory(&pDevExt->BusInterface, sizeof(SDBUS_INTERFACE_STANDARD));
}

SdBusOpenInterface 호출은 인터페이스 역참조 루틴에 대한 포인터를 SDBUS_INTERFACE_STANDARD 구조체에 저장합니다. 그러나 드라이버는 루틴을 호출하기 전에 포인터가 NULL 이 아닌지 확인해야 합니다.