다음을 통해 공유


파이프 정책 수정을 위한 WinUSB 함수

애플리케이션이 엔드포인트 파이프의 기본 정책 매개 변수를 가져와서 설정할 수 있도록 하려면 Winusb.dll 파이프의 기본 정책을 검색하는 WinUsb_GetPipePolicy 함수를 노출합니다. WinUsb_SetPipePolicy 함수를 사용하면 애플리케이션에서 정책 매개 변수를 새 값으로 설정할 수 있습니다.

WinUSB를 사용하면 엔드포인트의 파이프에 정책을 적용하여 기본 동작을 수정할 수 있습니다. 이러한 정책을 사용하면 디바이스와 해당 기능에 가장 잘 일치하도록 WinUSB를 구성할 수 있습니다. 다음 표에서는 WinUSB에서 지원하는 파이프 정책 목록을 제공합니다.

참고 항목

테이블에 설명된 정책은 지정된 엔드포인트에 대해서만 유효합니다. 다른 엔드포인트에서 정책을 설정해도 읽기 또는 쓰기 요청에 대한 WinUSB의 동작에는 영향을 주지 않습니다.

정책 번호 정책 이름 설명 엔드포인트(방향) Default value
0x01 SHORT_PACKET_TERMINATE 버퍼가 엔드포인트에서 지원하는 최대 패킷 크기의 배수인 쓰기 요청에 대해 길이가 0인 패킷을 보냅니다. 대량(OUT)

인터럽트(OUT)
FALSE
0x02 AUTO_CLEAR_STALL 데이터 흐름을 중지하지 않고 중단된 파이프를 자동으로 지웁니다. 대량(IN)

인터럽트(IN)
FALSE
0x03 PIPE_TRANSFER_TIMEOUT 요청을 취소하기 전에 시간 제한 간격(밀리초)을 기다립니다. 대량(IN)

대량(OUT)

인터럽트(IN)

인터럽트(OUT)
컨트롤의 경우 5초(5,000밀리초) 다른 사용자의 경우 0
0x04 IGNORE_SHORT_PACKETS 짧은 패킷을 받거나 특정 바이트 수를 읽을 때 읽기 요청을 완료합니다. 파일 크기를 알 수 없는 경우 요청은 짧은 패킷으로 종료됩니다. 대량(IN)

인터럽트(IN)
FALSE
0x05 ALLOW_PARTIAL_READS 호출자가 요청한 것보다 더 많은 데이터를 반환하는 디바이스의 읽기 요청을 허용합니다. 대량(IN)

인터럽트(IN)
TRUE
0x06 AUTO_FLUSH 읽기 요청에서 초과 데이터를 저장하고 다음 읽기 요청에 추가하거나 초과 데이터를 삭제합니다. 대량(IN)

인터럽트(IN)
FALSE
0x07 RAW_IO 큐 및 오류 처리를 우회하여 여러 읽기 요청에 대한 성능을 향상시킵니다. 대량(IN)

인터럽트(IN)
FALSE
0x08 MAXIMUM_TRANSFER_SIZE WinUSB에서 지원하는 USB 전송의 최대 크기를 가져옵니다. WinUsb_GetPipePolicy 호출하여 검색할 수 있는 읽기 전용 정책입니다. 대량(IN)

대량(OUT)

인터럽트(IN)

인터럽트(OUT)
0x09 RESET_PIPE_ON_RESUME 새 요청을 수락하기 전에 일시 중단에서 다시 시작한 후 엔드포인트의 파이프를 다시 설정합니다. 대량(IN)

대량(OUT)

인터럽트(IN)

인터럽트(OUT)
FALSE

다음 표에서는 각 파이프 정책을 사용하는 방법에 대한 모범 사례를 식별하고 정책을 사용할 때의 결과 동작을 설명합니다.

정책 다음 경우 사용... 동작
SHORT_PACKET_TERMINATE(0x01) 디바이스는 길이가 0인 패킷으로 OUT 전송을 종료해야 합니다. 대부분의 디바이스에는 이 요구 사항이 없습니다. 사용하도록 설정된 경우(정책 매개 변수 값이 TRUE 또는 0이 아닌 경우) 엔드포인트에서 지원하는 최대 패킷 크기의 배수인 모든 쓰기 요청 뒤에 길이가 0인 패킷이 잇습니다.

호스트 컨트롤러에 데이터를 보낸 후 WinUSB는 길이가 0인 패킷으로 쓰기 요청을 보낸 다음 WinUsb_WritePipe 의해 만들어진 요청을 완료합니다.
AUTO_CLEAR_STALL 실패한 전송이 엔드포인트를 중단된 상태로 유지하지 않도록 합니다. 이 정책은 RAW_IO 사용하지 않도록 설정된 경우 엔드포인트에 대한 여러 보류 중인 읽기 요청이 있는 경우에만 유용합니다.
  • 사용하도록 설정된 경우(정책 매개 변수 값이 TRUE 또는 0이 아닌 경우) 중단 조건이 자동으로 지워집니다. 이 정책 매개 변수는 제어 파이프에 영향을 주지 않습니다.

    읽기 요청이 실패하고 호스트 컨트롤러가 STATUS_CANCELLED 또는 STATUS_DEVICE_NOT_CONNECTED 이외의 상태를 반환하면 WinUSB는 실패한 요청을 완료하기 전에 파이프를 다시 설정합니다. 파이프를 다시 설정하면 데이터 흐름을 중단하지 않고 중단 조건이 지워지게 됩니다. 새 전송이 디바이스에서 계속 도착하는 한 데이터는 엔드포인트에서 계속 흐릅니다. 새 전송에는 중단이 발생했을 때 큐에 있던 전송이 포함될 수 있습니다.

    이 정책을 사용하도록 설정해도 성능에 큰 영향을 주지는 않습니다.

  • 사용하지 않도록 설정된 경우(정책 매개 변수 값이 FALSE 또는 0인 경우) 중단된 전송 후 엔드포인트에 도착하는 모든 전송은 호출자가 WinUsb_ResetPipe 호출하여 엔드포인트의 파이프를 수동으로 다시 설정할 때까지 실패합니다.
PIPE_TRANSFER_TIMEOUT 특정 시간 내에 엔드포인트로 전송이 완료됩니다.
  • 0(기본값)으로 설정하면 호스트 컨트롤러가 전송을 취소하지 않으므로 전송 시간이 초과되지 않습니다. 이 경우 전송은 수동으로 취소되거나 전송이 정상적으로 완료될 때까지 무기한 대기합니다.
  • 0이 아닌 값(시간 제한 간격)으로 설정하면 호스트 컨트롤러는 전송 요청을 받으면 타이머를 시작합니다. 타이머가 설정된 시간 제한 간격을 초과하면 요청이 취소됩니다.

    타이머 관리로 인해 약간의 성능 저하가 발생합니다.

    WinUSB 큐에서 기다리는 동안 요청이 시간 초과되지 않습니다.

    Windows Vista에서 모든 전송(RAW_IO 사용하도록 설정된 전송 제외)에 대해 WinUSB는 대상 엔드포인트의 모든 이전 전송이 완료될 때까지 요청을 큐에 대기합니다. 호스트 컨트롤러는 제한 시간 간격 계산에 큐 시간을 포함하지 않습니다.

    RAW_IO 사용하도록 설정하면 WinUSB는 요청을 큐에 대기하지 않습니다. 대신 USB 스택이 이전 전송을 처리 중인지 여부에 관계없이 요청을 USB 스택에 직접 전달합니다. USB 스택이 사용 중인 경우 새 요청 처리를 지연할 수 있습니다. 이로 인해 시간이 초과될 수 있습니다.
IGNORE_SHORT_PACKETS RAW_IO 사용할 수 없으며 짧은 패킷이 읽기 요청을 완료하지 않도록 합니다.
  • 사용하도록 설정된 경우(정책 매개 변수 값이 TRUE 또는 0이 아닌 경우) 호스트 컨트롤러는 짧은 패킷을 받은 직후 읽기 작업을 완료하지 않습니다. 대신 다음 경우에만 작업을 완료합니다.
    • 오류가 발생합니다.
    • 요청이 취소되었습니다.
    • 요청된 모든 바이트가 수신되었습니다.
  • 사용하지 않도록 설정된 경우(정책 매개 변수 값이 FALSE 또는 0인 경우) 호스트 컨트롤러는 요청된 바이트 수를 읽거나 짧은 패킷을 받은 후 읽기 작업을 완료합니다.
ALLOW_PARTIAL_READS 요청 버퍼의 크기가 최대 엔드포인트 패킷 크기의 배수인 경우 디바이스는 요청된 것보다 더 많은 데이터를 보낼 수 있습니다.

애플리케이션에서 몇 바이트를 읽어 읽을 총 바이트 수를 확인하려는 경우에 사용합니다.
  • 사용 안 함(정책 매개 변수 값이 FALSE 또는 0)이고 디바이스가 요청된 것보다 더 많은 데이터를 반환하는 경우 WinUSB는 오류와 함께 요청을 완료합니다.
  • 사용하도록 설정(정책 매개 변수 값이 TRUE 또는 0이 아닌 경우)이고 디바이스가 요청된 것보다 많은 데이터를 반환하는 경우 WinUSB는 (AUTO_FLUSH 설정에 따라) 읽기 요청의 초과 데이터를 다음 읽기 요청의 시작 부분에 추가하거나 초과 데이터를 삭제할 수 있습니다.

    사용하도록 설정된 경우 WinUSB는 0바이트에 대한 읽기 요청을 즉시 완료하고 스택 아래로 요청을 보내지 않습니다.
AUTO_FLUSH ALLOW_PARTIAL_READS 정책을 사용할 수 있습니다.

디바이스는 요청된 것보다 더 많은 데이터를 보낼 수 있으며 애플리케이션에는 다른 데이터가 필요하지 않습니다. 요청 버퍼의 크기가 최대 엔드포인트 패킷 크기의 배수인 경우 가능합니다.
AUTO_FLUSH ALLOW_PARTIAL_READS 사용하도록 설정된 경우 WinUSB의 동작을 정의합니다. ALLOW_PARTIAL_READS 사용하지 않도록 설정하면 winUSB에서 AUTO_FLUSH 값이 무시됩니다.

WinUSB는 나머지 데이터를 삭제하거나 호출자의 다음 읽기 요청과 함께 보낼 수 있습니다.

  • 사용하도록 설정된 경우(정책 매개 변수 값이 TRUE 또는 0이 아닌 경우) WinUSB는 오류 코드 없이 추가 바이트를 삭제합니다.
  • 사용하지 않도록 설정된 경우(정책 매개 변수 값이 FALSE 또는 0인 경우) WinUSB는 추가 바이트를 저장하고 호출자의 다음 읽기 요청 시작 부분에 추가한 다음, 다음 읽기 작업에서 호출자에게 데이터를 보냅니다.
RAW_IO 성능은 우선 순위이며 애플리케이션은 동일한 엔드포인트에 동시 읽기 요청을 제출합니다.

RAW_IO WinUsb_ReadPipe 호출자가 전달하는 버퍼에 특정 제한을 적용합니다.

  • 버퍼 길이는 최대 엔드포인트 패킷 크기의 배수여야 합니다.
  • 길이는 WinUsb_GetPipePolicy 검색한 MAXIMUM_TRANSFER_SIZE 값보다 작거나 같아야 합니다.
사용하도록 설정된 경우 전송은 큐 및 오류 처리를 바이패스하여 여러 읽기 요청에 대한 성능을 향상시킵니다. WinUSB는 다음과 같이 읽기 요청을 처리합니다.

  • 최대 엔드포인트 패킷 크기의 배수가 아닌 요청이 실패합니다.
  • WinUSB에서 지원하는 최대 전송 크기보다 큰 요청이 실패합니다.
  • 올바른 형식의 모든 요청은 호스트 컨트롤러에서 예약되도록 USB 코어 스택으로 즉시 전송됩니다.


이 설정을 사용하면 한 전송의 마지막 패킷과 다음 전송의 첫 번째 패킷 사이의 지연 시간을 줄여 여러 읽기 요청의 성능을 크게 향상시킵니다.
RESET_PIPE_ON_RESUME 디바이스는 일시 중단 시 데이터 토글 상태를 유지하지 않습니다. 일시 중단에서 다시 시작할 때 WinUSB는 호출자가 엔드포인트에 새 요청을 보낼 수 있도록 하기 전에 엔드포인트를 다시 설정합니다.