Share via


EVT_SPB_CONTROLLER_SEQUENCE 콜백 함수(spbcx.h)

SPB 컨트롤러 드라이버의 EvtSpbControllerIoSequence 이벤트 콜백 함수는 지정된 대상 디바이스와 시퀀스 요청과 함께 제공되는 버퍼 간에 일련의 데이터 전송을 수행합니다.

구문

EVT_SPB_CONTROLLER_SEQUENCE EvtSpbControllerSequence;

void EvtSpbControllerSequence(
  [in] WDFDEVICE Controller,
  [in] SPBTARGET Target,
  [in] SPBREQUEST Request,
  [in] ULONG TransferCount
)
{...}

매개 변수

[in] Controller

SPB 컨트롤러를 나타내는 프레임워크 디바이스 개체 에 대한 WDFDEVICE 핸들입니다.

[in] Target

이 I/O 요청에 대한 대상에 대한 SPBTARGET 핸들입니다. 대상은 버스에 연결된 주변 장치 또는 포트입니다. SPB 프레임워크 확장(SpbCx)은 이전에 대상에 대한 연결을 연 EvtSpbTargetConnect 콜백의 대상에 이 핸들을 할당했습니다.

[in] Request

I/O 요청에 대한 SPBREQUEST 핸들입니다. SPB 컨트롤러 드라이버는 요청된 작업을 수행하거나 오류 상태 반환하여 이 요청을 완료해야 합니다. 자세한 내용은 비고를 참조하세요.

[in] TransferCount

이 I/O 전송 시퀀스의 개별 전송 수입니다. 각 개별 전송은 간단한 읽기 또는 쓰기 작업입니다.

반환 값

없음

설명

SpbCx는 SPB 컨트롤러에 대한 I/O 큐를 관리합니다. SpbCx는 SPB 컨트롤러의 클라이언트(주변 드라이버)가 버스에 연결된 대상 디바이스에 IOCTL_SPB_EXECUTE_SEQUENCE 요청을 보낼 때 SPB 컨트롤러 드라이버의 EvtSpbControllerIoSequence 콜백 함수를 호출합니다. Request 매개 변수 값은 이 요청을 캡슐화하는 핸들입니다.

EvtSpbControllerIoSequence 콜백은 상태 값을 반환하지 않습니다. 대신 SPB 컨트롤러 드라이버는 I/O 요청에 대한 완료 상태 시퀀스 작업의 상태 나타냅니다.

EvtSpbControllerIoSequence 콜백은 비동기적입니다. 즉, 콜백 함수는 요청된 시퀀스(또는 시퀀스의 첫 번째 부분) 작업을 시작한 다음 작업이 완료되는 것을 기다리지 않고 반환해야 합니다. 나중에 SPB 컨트롤러 드라이버는 요청을 계속 처리하거나 인터럽트 DPC 또는 타이머 DPC 중에 요청을 완료합니다.

SPB 컨트롤러 드라이버는 I/O 요청에서 매개 변수 값을 검색하여 시퀀스 내에서 전송의 최대 길이를 결정할 수 있습니다. 드라이버는 이 길이를 사용하여 시퀀스 내의 각 전송에 다시 사용할 수 있는 DMA 리소스를 할당할 수 있습니다.

SPB 컨트롤러 드라이버는 SpbRequestGetTransferParameters 메서드를 호출하여 시퀀스의 각 전송에 대한 제어 매개 변수 및 데이터 버퍼를 검색할 수 있습니다. 버퍼는 현재 구현에서 연결된 MDL을 캡슐화하는 WDFMEMORY 개체입니다. 연결된 MDL에 대한 자세한 내용은 MDL 사용을 참조하세요.

SPB 컨트롤러는 전체 시퀀스 작업에 대해 대상 디바이스를 선택된 상태로 유지해야 합니다. 디바이스 선택 줄에서 대상을 선택한 경우 시퀀스의 첫 번째 전송 시작부터 마지막 전송이 끝날 때까지 줄을 지속적으로 어설션할 수 있습니다. 이 줄은 시퀀스 시작 시 잠금 작업 초기에 어설션할 수 있으며 시퀀스가 끝날 때 잠금 해제 작업까지 어설션된 상태로 유지될 수 있습니다.

시퀀스의 각 전송에 대해 선택적 지연을 지정할 수 있습니다. SPB 컨트롤러 드라이버는 전송을 시작하기 전에 적어도 해당 수의 마이크로초 지연을 담당합니다. 시퀀스의 첫 번째 전송에 연결된 지연이 있는 경우 드라이버는 먼저 주소를 전송하거나 대상 디바이스의 디바이스 선택 줄을 어설션한 다음 데이터 전송을 시작하기 전에 지정된 시간 동안 지연해야 합니다. 이 지연 동안 대상은 선택된 상태로 유지되지만 컨트롤러는 버스에서 시계를 실행해서는 안 됩니다.

대상 디바이스가 시퀀스로 전송하는 동안 NACK에 신호를 전송하는 경우 SPB 컨트롤러는 시퀀스를 중지합니다. 즉, 컨트롤러는 실패한 전송을 다시 시도하지 않으며 시퀀스에서 나머지 전송을 수행하려고 하지 않습니다. 이 경우 SPB 컨트롤러 드라이버는 I/O 요청의 완료 상태 STATUS_SUCCESS 설정하고, I/O 상태 블록의 정보 필드를 실제로 전송된 바이트 수로 설정하고(NACK를 받은 전송에서 손실된 데이터를 계산하지 않음) 요청을 완료해야 합니다.

SPB 컨트롤러 드라이버는 다음 조건 중 하나가 발생하는 경우에만 오류 상태 코드로 I/O 요청을 완료해야 합니다.

  • SPB 컨트롤러는 대상 디바이스를 선택할 수 없습니다(예: I2C 버스의 대상 디바이스는 컨트롤러가 주소 바이트를 전송할 때 NACK에 신호를 보냅니다).
  • SPB 컨트롤러 드라이버는 시퀀스 작업을 처리하는 동안 WDF 또는 WDM 서비스에 대한 호출에서 오류 상태 가져옵니다.

EvtSpbControllerIoSequence 콜백 함수를 등록하려면 SpbDeviceInitialize 메서드를 호출합니다.

예제

EvtSpbControllerIoSequence 콜백 함수를 정의하려면 먼저 정의하는 콜백 함수의 형식을 식별하는 함수 선언을 제공해야 합니다. Windows는 드라이버에 대한 콜백 함수 형식 집합을 제공합니다. 콜백 함수 형식을 사용하여 함수를 선언하면 드라이버에 대한 코드 분석, SDV( 정적 드라이버 검증 도구 ) 및 기타 확인 도구에서 오류를 찾을 수 있으며 Windows 운영 체제용 드라이버를 작성하기 위한 요구 사항입니다.

예를 들어 라는 MyEvtSpbControllerIoSequenceEvtSpbControllerIoSequence 콜백 함수를 정의하려면 다음 코드 예제와 같이 EVT_SPB_CONTROLLER_SEQUENCE 함수 형식을 사용합니다.

EVT_SPB_CONTROLLER_SEQUENCE  MyEvtSpbControllerIoSequence;

그런 다음, 다음과 같이 콜백 함수를 구현합니다.

_Use_decl_annotations_
VOID
  MyEvtSpbControllerIoSequence(
    WDFDEVICE Controller,
    SPBTARGET Target,
    SPBREQUEST Request,
    ULONG TransferCount
    )
{ ... }

EVT_SPB_CONTROLLER_SEQUENCE 함수 형식은 Spbcx.h 헤더 파일에 정의되어 있습니다. 코드 분석 도구를 실행할 때 오류를 보다 정확하게 식별하려면 함수 정의에 Use_decl_annotations 주석을 추가해야 합니다. Use_decl_annotations 주석은 헤더 파일의 EVT_SPB_CONTROLLER_SEQUENCE 함수 형식에 적용되는 주석이 사용되도록 합니다. 함수 선언에 대한 요구 사항에 대한 자세한 내용은 KMDF 드라이버에 함수 역할 형식을 사용하여 함수 선언을 참조하세요. Use_decl_annotations 대한 자세한 내용은 함수 동작 주석 지정을 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 8 부터 지원합니다.
대상 플랫폼 데스크톱
머리글 spbcx.h
IRQL IRQL <= DISPATCH_LEVEL 호출합니다.

추가 정보