IEEE 1394 디바이스에 대한 등시 전송 설정

드라이버가 디바이스를 시작하려면 다음 단계를 수행해야 합니다.

1단계. 전송 속도를 선택합니다.

IEEE 1394 버스는 하드웨어에서 허용하는 속도에 따라 여러 가지 속도를 지원할 수 있습니다. 특정 디바이스가 특정 속도를 지원하더라도 더 낮은 속도만 지원하는 다른 디바이스에 연결될 수 있습니다. 드라이버는 런타임에 디바이스와 컴퓨터 간의 전송 속도를 결정해야 합니다. REQUEST_GET_SPEED_BETWEEN_DEVICES 요청으로 버스 드라이버를 쿼리하여 버스의 두 디바이스 또는 디바이스와 호스트 컴퓨터 간에 가능한 최대 속도를 결정합니다.

2단계. 대역폭을 할당합니다.

동시 데이터 전송을 수행하려면 먼저 드라이버가 버스에서 대역폭을 예약해야 합니다. 버스는 고정된 양에 도달할 때까지 할당된 대역폭의 양을 추적합니다(IEEEE 1394-1995 사양에 따라 전송할 수 있는 최대 대역폭은 125나노초인 1 버스 주기의 80%입니다.) 그러면 현재 할당된 대역폭 중 일부가 해제될 때까지 다른 디바이스에서 대역폭을 획득할 수 없습니다. 드라이버는 대역폭을 예약하기 위해 버스 드라이버에 REQUEST_ISOCH_ALLOCATE_BANDWIDTH 요청을 제출합니다.

요청이 성공하면 버스 드라이버는 대역폭 핸들을 반환합니다. 드라이버는 버스 드라이버에 대한 향후 대역폭 관련 요청에서 이 핸들을 사용합니다. 예를 들어 드라이버는 핸들에서 REQUEST_ISOCH_SET_CHANNEL_BANDWIDTH 사용하여 할당된 대역폭의 양을 조정할 수 있습니다. 드라이버가 할당된 대역폭으로 완료되면 버스의 다른 디바이스에서 사용할 수 있도록 REQUEST_ISOCH_FREE_BANDWIDTH 사용하여 대역폭을 해제해야 합니다.

요청이 실패하면 드라이버는 데이터 전송을 시도해서는 안됩니다. 대역폭을 할당하지 못하는 드라이버는 후속 시도에서 할당할 수 있으므로 적절한 경우 나중에 대역폭을 할당할 수 있는 상태로 유지해야 합니다. 버스 재설정 후 대역폭을 할당하려는 시도는 성공할 가능성이 높습니다. 시스템이 버스 재설정 후 이전에 할당한 모든 대역폭 및 채널을 자동으로 해제하기 때문입니다.

대역폭 할당에 성공한 드라이버는 방금 언급한 이유로 버스 재설정 후 대역폭 및 채널을 재할당해야 합니다. 또한 다시 설정된 후 대역폭 핸들이 부실해지고 IRB_FLAG_ALLOW_REMOTE_FREE 플래그 집합으로 대역폭을 할당하지 않는 한 REQUEST_ISOCH_FREE_BANDWIDTH 호출하여 해제해야 합니다.

3단계. 채널을 할당합니다.

대역폭 할당 요청이 성공하면 드라이버는 데이터를 쓸 등시 채널을 요청합니다. 여러 디바이스는 하나의 등시 채널에서 패킷을 읽을 수 있지만 하나의 디바이스만 채널에 쓸 수 있습니다. 등시 패킷을 받는 디바이스는 그 대가로 승인 패킷을 보내지 않습니다.

드라이버는 버스 드라이버에 REQUEST_ISOCH_ALLOCATE_CHANNEL 요청을 전송하여 채널을 요청합니다. 드라이버는 특정 채널을 요청하거나 무료 채널을 할당하도록 ISOCH_ANY_CHANNEL 수 있습니다. 성공하면 버스 드라이버는 할당된 채널을 반환합니다. 버스 드라이버가 오류 코드를 반환하는 경우 드라이버는 데이터 전송을 시도해서는 안 되며 2단계에서 할당한 대역폭의 할당을 취소해야 합니다.

드라이버는 채널을 현재 사용할 수 없으므로 절대 사용할 수 없다고 가정해서는 안 됩니다. 채널은 언제든지 무료가 될 수 있으므로 드라이버는 적절한 경우 나중에 채널을 할당하려고 시도할 수 있는 상태로 두어야 합니다.

4단계. 리소스 핸들을 할당합니다.

드라이버가 채널을 할당하면 해당 채널에 대한 리소스 핸들을 할당합니다. 모든 후속 단계에서 드라이버는 리소스 핸들을 사용하여 채널을 지정합니다.

드라이버는 버스 드라이버에 REQUEST_ISOCH_ALLOCATE_RESOURCES 요청을 제출하여 채널에 대한 리소스 핸들을 할당합니다.

드라이버가 리소스 핸들을 할당할 때 핸들에 연결된 버퍼를 사용하는 방법을 나타내는 플래그도 지정합니다.

  • 드라이버가 채널을 사용하여 디바이스( REQUEST_ISOCH_LISTEN 작업)에서 데이터를 읽는 경우 RESOURCE_USED_IN_LISTENING 플래그를 설정합니다. 드라이버가 채널을 사용하여 디바이스에 데이터를 쓰는 경우( REQUEST_ISOCH_TALK 작업) RESOURCE_USED_IN_TALKING 플래그를 설정합니다.

  • 드라이버는 핸들을 사용하여 트랜잭션에 대한 데이터 버퍼를 제공합니다. 자세한 내용은 5단계를 참조하세요. 버스 드라이버는 버퍼가 다 떨어질 때까지 버퍼를 사용한 다음 디바이스 드라이버가 더 많은 버퍼를 연결할 때까지 작업을 일시 중지합니다. 자세한 내용은 IEEE 1394 디바이스에 대한 등시 DMA 전송 버퍼링을 참조하세요 .

  • 드라이버는 작업이 등시 주기 클록의 특정 값에 동기화되도록 지정할 수 있습니다. 자세한 내용은 IEEE 1394 디바이스에 대한 등시 동기화 옵션을 참조하세요 .

  • 드라이버는 등시 수신 대기에 대한 옵션을 설정할 수 있습니다. 드라이버는 등시 패킷 헤더가 데이터 패킷에서 제거되었는지 여부를 나타낼 수 있습니다. 또한 드라이버는 도착하는 데이터를 대기 중인 데이터 버퍼에 복사해야 하는지, 버퍼당 하나의 패킷으로 복사해야 하는지 또는 각 버퍼를 데이터로 채워야 하는지 여부를 나타낼 수도 있습니다. 자세한 내용은 IEEE 1394 디바이스에 대한 등시 수신 대기 옵션을 참조하세요 .

이 요청이 실패하면 드라이버는 이전 단계에서 할당한 모든 등시 리소스의 할당을 취소해야 합니다.

5단계. 리소스 핸들에 버퍼를 연결합니다.

드라이버가 리소스 핸들을 할당하면 버퍼를 핸들에 연결합니다. 호스트 DMA 컨트롤러는 에서 데이터를 읽거나 연결된 버퍼에 데이터를 씁니다.

각 버퍼에서 드라이버는 버퍼가 사용되는 방법을 설명하는 ISOCH_DESCRIPTOR 구조를 전달합니다. 버퍼의 ISOCH_DESCRIPTOR 구조에서 드라이버는 다음 정보를 지정할 수 있습니다.

작업이 시작되면 드라이버는 더 이상 필요하지 않은 버퍼를 분리할 수 있으며 추가 버퍼를 연결할 수 있습니다. 드라이버는 ISOCH_DESCRIPTOR 식별된 콜백 루틴을 사용하여 버스 드라이버가 연결된 마지막 버퍼 처리를 완료했을 때 자체 신호를 보낼 수 있습니다. IEEE 1394 디바이스에 대한 DMA 버퍼링에 대한 설명은 IEEE 1394 디바이스에 대한 등시 DMA 전송 버퍼링을 참조하세요.

6단계. 데이터 전송 시작

디바이스에서 읽기 위해 드라이버는 REQUEST_ISOCH_LISTEN 요청을 발급합니다. 디바이스에 쓰기 위해 드라이버는 REQUEST_ISOCH_TALK 요청을 발급합니다. 그런 다음 드라이버는 적절한 디바이스별 방식으로 읽기 또는 쓰기를 위해 디바이스를 활성화할 수 있습니다.