_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 또는 조합을 지정합니다.
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밀리초 프레임 단위로 측정됩니다. 고속 디바이스의 경우 마침표는 마이크로프레임으로 측정됩니다.
전속 디바이스의 경우 프레임 내에서 하나의 패킷만 전송할 수 있습니다. bits 12.. 11 은 예약되어 있으며 0으로 설정됩니다.
고속 디바이스의 경우 데이터를 단일 패킷으로 전송하거나 마이크로프레임 내에서 여러 패킷에 걸쳐 있을 수 있습니다.
비트 12.. 11 이 n으로 설정된 경우 마이크로프레임당 바이트를 전송 (n+1)*MaximumPacketSize
할 수 있습니다. 비트 12.. 11 을 0으로 설정하면 하나의 패킷만 마이크로프레임으로 전송할 수 있음을 나타냅니다. 비트 12.. 11 이 1로 설정된 경우 호스트 컨트롤러는 마이크로프레임에서 두 패킷을 전송할 수 있습니다.
_URB_ISOCH_TRANSFERIsoPacket 멤버는 전송 버퍼 레이아웃을 설명하는 USBD_ISO_PACKET_DESCRIPTOR 배열입니다. 배열의 각 요소는 하나의 마이크로프레임에서 전송되는 데이터와 상관 관계가 있습니다. IsoPacket에 n 요소가 있는 경우 호스트 컨트롤러 전송은 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 포함) |