Share via


Client-Implemented 시퀀스 처리

선택적 EvtSpbControllerLockEvtSpbControllerUnlock 이벤트 콜백 함수는 보완 작업을 수행합니다. EvtSpbControllerLock 함수는 IOCTL_SPB_LOCK_CONTROLLER 요청에 대한 처리기입니다. EvtSpbControllerUnlock 함수는 IOCTL_SPB_UNLOCK_CONTROLLER 요청에 대한 처리기입니다. 클라이언트(즉, 버스의 주변 장치용 드라이버)는 I/O 전송 시퀀스를 시작하고 종료하기 위해 이러한 요청을 보냅니다. 대부분의 SPB 컨트롤러 드라이버는 IOCTL_SPB_LOCK_CONTROLLERIOCTL_SPB_UNLOCK_CONTROLLER 요청을 지원하지 않으므로 EvtSpbControllerLockEvtSpbControllerUnlock 함수를 구현하지 않습니다.

클라이언트는 일련의 간단한 전송 요청(즉, IRP_MJ_READIRP_MJ_WRITE 요청)으로 I/O 전송 시퀀스를 수행할 수 있습니다. 시퀀스의 첫 번째 전송 앞에 IOCTL_SPB_LOCK_CONTROLLER 요청이 있어야 합니다. 이 요청은 SPB 컨트롤러 드라이버에게 I/O 전송 시퀀스의 기간 동안 버스를 잠그도록 지시합니다. 마지막 전송 다음에 는 드라이버 에 버스 잠금을 해제하도록 지시하는 IOCTL_SPB_UNLOCK_CONTROLLER 요청이 있어야 합니다. 이 유형의 I/O 전송 시퀀스를 클라이언트에서 구현한 시퀀스라고 하며 IOCTL_SPB_LOCK_CONTROLLER 및 IOCTL_SPB_UNLOCK_CONTROLLER요청 대신IOCTL_SPB_EXECUTE_SEQUENCE 요청을 사용하는 단일 요청 시퀀스와 구분합니다.

주변 장치용 드라이버가 버스에 대한 잠금을 보유하는 동안 버스 컨트롤러는 버스의 다른 주변 장치에 액세스할 수 없습니다. 버스 잠금 작업의 세부 정보는 버스 유형에 따라 달라집니다. I2C 컨트롤러의 경우 전송 방향(읽기 다음에 쓰기 또는 그 반대의 경우)을 변경하려면I2C 다시 시작 작업이 필요합니다. SPI 컨트롤러의 경우 컨트롤러 잠금이 적용되는 동안 대상 디바이스에 대한 칩 선택을 어설션된 상태로 유지해야 합니다. 자세한 내용은 Atomic Bus 작업을 참조하세요.

클라이언트 구현 전송 시퀀스에 대한 지원은 선택 사항입니다. SPB 컨트롤러 드라이버는 컨트롤러가 다음을 수행할 수 있는 경우에만 지원하도록 요청해야 합니다.

  • 클라이언트 구현 시퀀스의 기간 동안 버스를 잠급니다.
  • 언제든지 버스 잠금을 해제합니다. 예를 들어 바이트 전송 간에 잠금 해제 요청이 발생하는 경우 컨트롤러는 버스를 통해 다음 바이트 전송을 기다리지 않고 버스의 잠금을 해제할 수 있어야 합니다.

버스가 잠겨 있는 동안 클라이언트는 임의로 간단한 전송 요청 시퀀스를 보낼 수 있습니다. 즉, 시퀀스는 임의의 길이일 수 있으며 읽기와 쓰기의 조합일 수 있습니다.

클라이언트 구현 시퀀스에 대한 지원을 나타내기 위해 SPB 컨트롤러 드라이버는 EvtSpbControllerUnlock 함수를 구현합니다. 드라이버가 이 함수를 구현하는 경우 SPB 프레임워크 확장(SpbCx)은 클라이언트의 IOCTL_SPB_LOCK_CONTROLLERIOCTL_SPB_UNLOCK_CONTROLLER 요청을 수락합니다. 그렇지 않으면 SpbCx는 STATUS_NOT_SUPPORTED 상태 코드로 요청을 완료하여 이러한 요청을 실패합니다.

EvtSpbControllerUnlock 함수를 구현하는 SPB 컨트롤러 드라이버는 EvtSpbControllerLock 함수를 구현할 필요가 없습니다. 그러나 EvtSpbControllerLock 함수를 구현하는 SPB 컨트롤러 드라이버도 EvtSpbControllerUnlock 함수를 구현해야 합니다.

드라이버가 EvtSpbControllerUnlock 함수가 아닌 EvtSpbControllerLock 함수를 구현하는 경우 SpbCx는 EvtSpbControllerUnlock 함수를 호출하여 IOCTL_SPB_UNLOCK_CONTROLLER 요청을 처리하지만 STATUS_SUCCESS 상태 코드를 사용하여 IOCTL_SPB_LOCK_CONTROLLER 요청을 완료합니다.

드라이버에는 클라이언트 구현 시퀀스의 시작을 감지하는 두 가지 방법이 있습니다. 먼저 드라이버가 EvtSpbControllerLock 함수를 구현하는 경우 SpbCx는 이 함수를 호출하여 클라이언트의 IOCTL_SPB_LOCK_CONTROLLER 요청을 처리합니다. 드라이버는 시퀀스의 첫 번째 전송 요청 전에 발생하는 이 호출에 의존할 수 있습니다. 둘째, 드라이버가 EvtSpbControllerLock 함수를 구현하지 않는 경우 드라이버가 클라이언트에서 간단한 전송 요청을 처리할 때 SpbRequestGetParameters 메서드를 호출할 수 있습니다. 요청된 전송이 시퀀스의 첫 번째 전송임을 나타내기 위해 이 메서드는 메서드의 출력 구조에서 Position 멤버를 SpbRequestSequencePositionFirst로 설정합니다.

EvtSpbControllerUnlock 콜백은 드라이버가 시퀀스가 종료되는 시기를 결정할 수 있는 유일한 방법입니다. EvtSpbControllerUnlock 함수를 구현하지 않는 드라이버는 클라이언트 구현 시퀀스를 지원할 수 없습니다.