UCX는 엔드포인트 개체 만들기를 관리하고 호스트 컨트롤러에 엔드포인트를 프로그래밍하거나 USB 호스트 컨트롤러로 프로그래밍 해제하도록 알깁니다.
엔드포인트는 프로그래밍되지만 UCX에서도 관리됩니다. 디바이스가 연결되고 버스에서 연결을 끊고, 일시 중단 및 재설정과 같은 전원 이벤트를 경험하고, 대체 설정 변경과 같은 새 엔드포인트 생성을 거치면서 엔드포인트 상태가 변경됩니다.
엔드포인트 구성
UCX는 호스트 컨트롤러 드라이버에서 구현한 콜백 함수를 호출하여 엔드포인트가 USB 호스트 컨트롤러로 프로그래밍되거나 해제되어야 하는 경우 드라이버에 알립니다. EVT_UCX_USBDEVICE_ENABLE 호출되면 드라이버는 디바이스의 기본 엔드포인트로 전송을 수행하기 위해 컨트롤러를 준비합니다. 컨트롤러 준비에는 기본 엔드포인트 프로그래밍이 포함됩니다. EVT_UCX_USBDEVICE_DISABLE 호출되면 드라이버는 기본 엔드포인트의 프로그램을 해제하고 디바이스와 연결된 다른 컨트롤러 리소스를 해제합니다. EVT_UCX_USBDEVICE_ENDPOINTS_CONFIGURE 호출되면 드라이버에 컨트롤러로 프로그래밍할 기본이 아닌 엔드포인트 목록이 지정되고 컨트롤러에서 제거할 기본이 아닌 엔드포인트의 다른 목록이 제공됩니다. 그런 다음 호스트 컨트롤러 드라이버는 지정된 기본이 아닌 엔드포인트를 컨트롤러에 프로그래밍하고 컨트롤러에서 기본이 아닌 엔드포인트(다른 목록에 지정됨)도 제거합니다.
큐 상태 관리
UCX는 호스트 컨트롤러 드라이버에서 구현한 콜백 함수를 호출하여 엔드포인트 큐 상태를 변경합니다. 그런 다음 드라이버는 UCX에 지정된 엔드포인트 큐 및 드라이버 내에서 유지 관리되는 두 번째 수준 큐에서 해당 작업을 수행합니다. 엔드포인트 큐는 다음 시나리오에서 중단되거나 제거됩니다.
- USB 디바이스 클라이언트 드라이버는 URB_FUNCTION_ABORT_PIPE 요청을 보냅니다.
- 일시 중단 중.
- 디바이스가 연결된 허브가 디바이스 연결 끊김을 감지합니다.
- 선택 인터페이스 설정 요청 중.
호스트 컨트롤러 드라이버에 큐 중단 또는 제거에 대해 알리기 위해 UCX는 EVT_UCX_ENDPOINT_ABORT 또는 EVT_UCX_ENDPOINT_PURGE 호출합니다. 나중에 UCX에서 엔드포인트 큐가 필요한 경우 UCX는 EVT_UCX_ENDPOINT_START 콜백을 호출하여 드라이버에 큐를 시작하도록 알립니다.
전송 취소
호스트 컨트롤러 드라이버가 GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL을 선언한 컨트롤러의 경우, 드라이버는 UcxEndpointNeedToCancelTransfers를 호출하고 TT(Transaction Translator) 허브 뒤에 있는 USB 전체 속도 또는 저속 디바이스로 비동기(즉, 대량 또는 제어) USB 전송을 취소하기 위해 EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS를 구현해야 합니다. 다른 모든 경우에서 드라이버는 필요에 따라 UcxEndpointNeedToCancelTransfers 를 호출하여 이 엔드포인트에서 전송 취소가 허용되고 드라이버가 전송을 취소할 수 있음을 나타내는 EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS 알림을 받을 수 있습니다. 또는 드라이버는 UcxEndpointNeedToCancelTransfers를 호출하지 않고 직접 전송을 취소할 수 있습니다.
호스트 컨트롤러 드라이버가 항상 이 GUID에 대한 요청에 실패하는 경우 이러한 두 함수 호출을 완전히 무시할 수 있습니다.
드라이버가 UcxEndpointNeedToCancelTransfers를 호출하지 않으면 드라이버의 EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS 콜백이 호출되지 않으며 콜백 등록 중에 NULL일 수 있습니다.
드라이버가 UcxEndpointNeedToCancelTransfers를 사용하려는 경우 드라이버는 전송이 컨트롤러로 프로그래밍된 후 취소된 후 완료되기 전에 EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS 대기할 때 메서드를 호출해야 합니다.