다음을 통해 공유


_URB_ISOCH_TRANSFER 구조체(usb.h)

_URB_ISOCH_TRANSFER 구조는 USB 클라이언트 드라이버가 동시 전송 파이프로 데이터를 보내거나 데이터를 검색하는 데 사용됩니다.

구문

struct _URB_ISOCH_TRANSFER {
  struct _URB_HEADER         Hdr;
  USBD_PIPE_HANDLE           PipeHandle;
  ULONG                      TransferFlags;
  ULONG                      TransferBufferLength;
  PVOID                      TransferBuffer;
  PMDL                       TransferBufferMDL;
  struct _URB                *UrbLink;
  struct _URB_HCD_AREA       hca;
  ULONG                      StartFrame;
  ULONG                      NumberOfPackets;
  ULONG                      ErrorCount;
  USBD_ISO_PACKET_DESCRIPTOR IsoPacket[1];
};

멤버

Hdr

URB 헤더 정보를 지정하는 _URB_HEADER 구조체에 대한 포인터입니다. Hdr.Function 은 URB_FUNCTION_ISOCH_TRANSFER 있어야 하며 Hdr.Length 는 이 가변 길이 데이터 구조의 크기여야 합니다.

PipeHandle

등시 파이프에 대한 불투명 핸들을 지정합니다. 호스트 컨트롤러 드라이버는 클라이언트 드라이버가 URB_FUNCTION_SELECT_CONFIGURATION 형식의 URB를 사용하여 디바이스 구성을 선택하거나 클라이언트 드라이버가 URB_FUNCTION_SELECT_INTERFACE 형식의 URB를 사용하는 인터페이스에 대한 설정을 변경할 때 이 핸들을 반환합니다.

TransferFlags

다음 플래그의 0, 1 또는 조합을 지정합니다.

의미
USBD_TRANSFER_DIRECTION_IN
디바이스에서 데이터를 요청하도록 설정됩니다. 디바이스로 데이터를 전송하려면 이 플래그가 명확해야 합니다.
USBD_SHORT_TRANSFER_OK
엔드포인트의 최대 패킷 크기보다 짧은 디바이스에서 패킷을 수신할 때 호스트 컨트롤러가 오류를 반환하지 않도록 지시하도록 설정됩니다. 버스 드라이버가 등시 파이프에서 짧은 패킷을 수신할 때 오류를 반환하지 않으므로 이 플래그는 등시 파이프에 영향을 주지 않습니다.
USBD_START_ISO_TRANSFER_ASAP
파이프를 연 이후 또는 마지막으로 다시 설정한 후 파이프에 전송이 제출되지 않은 경우 다음 프레임에서 전송이 시작됩니다. 그렇지 않으면 파이프에 대해 현재 큐에 대기 중인 모든 요청을 따르는 첫 번째 프레임에서 전송이 시작됩니다. 전송이 시작되는 실제 프레임은 호스트 컨트롤러 드라이버에 의해 버스 대기 시간에 맞게 조정됩니다.

TransferBufferLength

TransferBuffer에 지정되거나 TransferBufferMDL 설명된 버퍼의 길이(바이트)를 지정합니다. 호스트 컨트롤러 드라이버는 이 멤버의 파이프로 보내거나 파이프에서 읽은 바이트 수를 반환합니다.

TransferBuffer

TransferBufferMDL에서 MDL을 제공하는 경우 전송에 대한 상주 버퍼에 대한 포인터는 NULL입니다. 이 버퍼의 내용은 TransferFlags 값에 따라 달라집니다. USBD_TRANSFER_DIRECTION_IN 지정한 경우 이 버퍼에는 호스트 컨트롤러 드라이버에서 반환할 때 디바이스에서 읽은 데이터가 포함됩니다. 그렇지 않으면 이 버퍼에는 디바이스로 전송하기 위해 드라이버 제공 데이터가 포함됩니다.

TransferBufferMDL

TransferBuffer에서 버퍼를 제공하는 경우 상주 버퍼를 설명하는 MDL에 대한 포인터는 NULL입니다. 버퍼의 내용은 TransferFlags 값에 따라 달라집니다. USBD_TRANSFER_DIRECTION_IN 지정한 경우 설명된 버퍼에는 호스트 컨트롤러 드라이버에서 반환할 때 디바이스에서 읽은 데이터가 포함됩니다. 그렇지 않으면 버퍼에 디바이스로 전송하기 위해 드라이버 제공 데이터가 포함됩니다. 이 MDL은 페이지가 없는 풀에서 할당해야 합니다.

UrbLink

예약되어 있습니다. 사용하지 마십시오.

hca

예약되어 있습니다. 사용하지 마십시오.

StartFrame

전송을 시작해야 하는 프레임 번호를 지정합니다. 이 변수는 현재 프레임의 시스템 정의 범위 내에 있어야 합니다. 범위는 상수 USBD_ISO_START_FRAME_RANGE 지정됩니다.

START_ISO_TRANSFER_ASAP TransferFlags에서 설정된 경우 이 멤버는 호스트 컨트롤러 드라이버에서 요청을 반환할 때 전송이 시작된 프레임 번호를 포함합니다. 그렇지 않으면 이 멤버는 이 전송이 시작되는 프레임 번호를 포함해야 합니다.

NumberOfPackets

가변 길이 배열 멤버 IsoPacket에서 설명하는 패킷 수를 지정합니다.

ErrorCount

호스트 컨트롤러 드라이버에서 반환할 때 오류 조건으로 완료된 패킷 수를 포함합니다.

IsoPacket[1]

USB 버스에서 전송할 등시 전송 패킷을 설명하는 USBD_ISO_PACKET_DESCRIPTOR 구조체의 가변 길이 배열을 포함합니다. 이 멤버에 대한 자세한 내용은 설명 섹션을 참조하세요.

설명

전송의 모든 패킷이 오류를 생성하거나 요청이 잘 형성되지 않고 전혀 실행할 수 없는 한 USB 버스 드라이버는 항상 hdr.Status에서 USBD_STATUS_SUCCESS 값을 반환합니다. 다음 표에는 Hdr.Status에서 반환되는 가능한 오류 코드가 포함되어 있습니다.

오류 값 의미
USBD_STATUS_ISOCH_REQUEST_FAILED 등시 요청의 모든 패킷이 오류와 함께 완료되었음을 나타냅니다.
USBD_STATUS_BAD_START_FRAME 요청된 시작 프레임이 현재 USB 프레임의 USBD_ISO_START_FRAME_RANGE 내에 있지 않음을 나타냅니다.
USBD_ISO_NOT_ACCESSED_LATE 요청된 시작 프레임에 따라 패킷을 보내기에 너무 늦게 모든 패킷이 제출되었음을 나타냅니다.
USBD_STATUS_INVALID_PARAMETER URB 매개 변수 중 하나가 잘못되었음을 나타냅니다.
 

호스트 컨트롤러가 USB 디바이스에 등시 요청을 보내기 전에 데이터를 보내거나 받아야 하는 디바이스의 엔드포인트에 대한 정보가 필요합니다. 이 정보는 선택한 구성 설명자에서 검색되는 엔드포인트 설명자(USB_ENDPOINT_DESCRIPTOR)에 저장됩니다. 버스 드라이버는 엔드포인트 설명자를 가져오면 등시 전송 파이프를 만들어 데이터 전송을 설정합니다. 파이프의 특성은 USBD_PIPE_INFORMATION 구조에 저장됩니다. 등시 전송의 경우 멤버는 다음과 같이 설정됩니다.

  • PipeType 멤버는 전송 유형을 지정하고 UsbdPipeTypeIsochronous로 설정됩니다.
  • MaximumPacketSize 멤버는 하나의 패킷을 구성하는 데이터 양(바이트)을 지정합니다. 등시 전송의 경우 패킷 크기는 고정되며 0-1024의 값일 수 있습니다. 패킷 크기가 같거나 엔드포인트 설명자의 wMaxPacketSize 값보다 작습니다.
  • Interval 멤버는 엔드포인트 설명자의 bInterval 값에서 파생됩니다. 이 값은 버스에서 데이터가 전송되는 빈도를 나타내는 폴링 기간을 계산하는 데 사용됩니다. 전속 디바이스의 경우 기간은 1밀리초 프레임 단위로 측정됩니다. 고속 디바이스의 경우 마침표는 마이크로프레임으로 측정됩니다.
또한 호스트 컨트롤러는 디바이스 유형에 따라 프레임 또는 마이크로프레임 내에서 전송할 수 있는 데이터의 양을 결정합니다. 이 정보는 엔드포인트 설명자에서 wMaxPacketSize의 비트 12.. 11에서 사용할 수 있습니다.

전속 디바이스의 경우 프레임 내에서 하나의 패킷만 전송할 수 있습니다. bits 12.. 11 은 예약되어 있으며 0으로 설정됩니다.

고속 디바이스의 경우 데이터를 단일 패킷으로 전송하거나 마이크로프레임 내에서 여러 패킷에 걸쳐 있을 수 있습니다. 비트 12.. 11n으로 설정된 경우 마이크로프레임당 바이트를 전송 (n+1)*MaximumPacketSize 할 수 있습니다. 비트 12.. 11 을 0으로 설정하면 하나의 패킷만 마이크로프레임으로 전송할 수 있음을 나타냅니다. 비트 12.. 11 이 1로 설정된 경우 호스트 컨트롤러는 마이크로프레임에서 두 패킷을 전송할 수 있습니다.

_URB_ISOCH_TRANSFERIsoPacket 멤버는 전송 버퍼 레이아웃을 설명하는 USBD_ISO_PACKET_DESCRIPTOR 배열입니다. 배열의 각 요소는 하나의 마이크로프레임에서 전송되는 데이터와 상관 관계가 있습니다. IsoPacketn 요소가 있는 경우 호스트 컨트롤러 전송은 n 프레임(최고 속도 디바이스용) 또는 마이크로프레임(고속 디바이스용)을 사용하여 데이터를 전송합니다. IsoPacket[i]. 오프셋 멤버는 보내거나 받을 데이터의 양을 추적하는 데 사용됩니다. 이 작업은 요청에 대한 전체 전송 버퍼의 시작부터 바이트 오프셋을 설정하여 수행됩니다.

예를 들어 1024바이트 크기의 패킷을 전송하는 데 사용할 수 있는 5개의 마이크로프레임이 있습니다.

비트 12.. 11 이 0으로 설정된 경우(마이크로프레임 전송당 단일 패킷을 나타낸) IsoPacket 에는 다음 항목이 포함됩니다.

마이크로프레임 1 IsoPacket.Element[0].Offset = 0 (시작 주소)

마이크로프레임 2 IsoPacket.Element[1].Offset = 1024

마이크로프레임 3 IsoPacket.Element[2].Offset = 2048

마이크로프레임 4 IsoPacket.Element[3].Offset = 3072

마이크로프레임 5 IsoPacket.Element[4].Offset = 4096

비트 12.. 11 이 1로 설정된 경우(마이크로프레임당 두 패킷을 나타낸) IsoPacket 에는 다음 항목이 포함됩니다.

마이크로프레임 1 IsoPacket.Element[0].Offset = 0 (시작 주소)

마이크로프레임 2 IsoPacket.Element[1].Offset = 2048

마이크로프레임 3 IsoPacket.Element[2].Offset = 4096

마이크로프레임 4 IsoPacket.Element[3].Offset = 6144

마이크로프레임 5 IsoPacket.Element[4].Offset = 8192

참고 여러 패킷의 경우 오프셋 값은 마이크로프레임 내의 모든 패킷 크기를 나타냅니다.

IsoPacket[i]. 길이 멤버는 등시 IN 전송을 위해 디바이스에서 수신된 실제 바이트 수를 나타내기 위해 호스트 컨트롤러에 의해 업데이트됩니다. IsoPacket[i]. 길이 는 등시 OUT 전송에 사용되지 않습니다.

드라이버는 GET_ISO_URB_SIZE 매크로를 사용하여 전체 URB를 보유하는 데 필요한 크기를 결정할 수 있습니다. 길이가 너무 작아서 이 패킷에 대해 설정된 공간을 채우지 못하면 버스 드라이버는 검색된 데이터의 끝에서 다음 패킷의 오프셋까지 간격을 남깁니다. 버스 드라이버는 버퍼 공간 낭비를 방지하기 위해 오프셋을 조정하지 않습니다.

TransferBuffer 또는 TransferBufferMDL 멤버는 사실상 연속 버퍼를 지정해야 합니다.

이 구조의 일부이지만 여기에 설명되지 않은 다른 멤버를 불투명으로 처리합니다. 시스템 사용을 위해 예약되어 있습니다.

요구 사항

요구 사항
헤더 usb.h(Usb.h 포함)

추가 정보

USB 등시 엔드포인트로 데이터를 전송하는 방법

Urb

USB 구조체

USBD_ISO_PACKET_DESCRIPTOR

USBD_IsochUrbAllocate

_URB_HEADER