2009-06-12 7 views

답변

2

글쎄, 설치 API (SetupDiXXX 함수)를 사용하여 시스템의 USB 장치를 열거하고 각 컴퓨터에서 WinUsb_ResetPipe를 호출 할 수는 있습니다.하지만 그게 당신이 찾고있는 것인지 확실하지 않습니다. USB 장치로 작업 한 이후로 시간이 지났지 만 기기를 재설정 (즉, 전원 끄기/전원 켜기 사이클 시뮬레이션) 할 수있는 표준 방법은 없습니다. 특정 장치에 대해 가능한 경우 적절한 IOCTL (DeviceIOControl 사용)을 드라이버에 보내야합니다. IOCTL은 제조업체마다 다를 수 있습니다.

0

내가 아는 한,이 작업을 수행 할 방법이 없습니다. PnP 재검색 새 장치 용 버스 재검색 명령을 실행할 수는 있지만 버스 재설정을 실행하는 것과는 다릅니다.

하드웨어 관점에서 버스 리셋을 발행한다고해서 Windows가 허브의 자식을 나타내는 PDO를 제거하고 다시 검색한다는 의미는 아닙니다. USB 버스 드라이버는 내가 묘사 한대로 할 수 있으며 (즉, 장치 트리를 방해하지 않고 하드웨어 버스 재설정을 실행 함) 장치가 응답하지 않으면 후에 장치가 응답하지 않고 놀람 제거를 실행하고 트리에서 뺍니다 . 커널 모드에서

10

:가 빠졌하고 PDO에 IOCTL_INTERNAL_USB_CYCLE_PORT을 보내, 다시 다시 플러그 인 것처럼 당신은, 다시 접속하는 특정 USB 장치를 강제 할 수 있습니다. 이는 커널 모드 (예 : 도우미 드라이버를 통해서만 수행 할 수 있습니다).이 '주기'작업으로 인해 USB 재설정이 발생하고 장치가 다시 열거됩니다. 예를 들어, 장치가 다른 USB 장치 설명자로 돌아 오면 다른 드라이버가이 장치와 일치 할 수 있습니다.

사용자 모드에서 : CfgMgr API를 통해 장치를 배출하면됩니다. 예를 들어, 모든 USB 허브를 가서 모든 장치를 추출하려면,

  1. SetupDiGetClassDevs(... DIGCF_DEVICEINTERFACE)와 장치 인터페이스 GUID_DEVINTERFACE_USB_HUB을 가진 모든 장치를 찾습니다.
  2. 반환 된 장치 정보 집합 (SetupDiEnumDeviceInfo)을 열거합니다.
  3. 각 장치의 경우, DevInst 회원 수 :
    1. 호출 CM_Get_Child(DevInst)을 다음 CM_Get_Sibling 반복적으로 허브 (즉 USB 장치)의 모든 자식 노드를 통해 이동합니다.
    2. 각 자식 노드에 대해 CM_Request_Device_Eject을 호출하십시오.
2

그것은 순환 장치뿐만 아니라, 부착 된 USB 허브 상위 포트 가능하다. 이것이 발생하면 풍선 팝업이 표시되므로 다른 것들 중에서도 apparrent unplug/replug 액션이 발생합니다.

이 내용의 대부분은 문서화가 잘되어 있지 않으며 솔직히 실제로 잘 이해하고있는 소수의 사람들이 있다는 인상을 받았습니다.앞으로 디자인 할 디바이스에 대한 디자인 결정은 디바이스 측 풀 리셋 기능뿐만 아니라 양쪽에 워치 독 기능을 포함시키려는 것입니다. 그렇게하면 장치가 혼란스러워 진다면 혼란스럽지 만 잠시 동안 자체 전원을 차단하고 완전히 재설정 할 수 있습니다. 호스트가 통신 할 수 없으면 동일한 작업을 수행 할 수 있으며 장치가 모든 것이 있다고 생각하면 좋지만 호스트가 더 잘 알고 있으면 호스트가 재설정하도록 명령 할 수 있습니다.

이 문제를 조사 할 가치가있는 API는 세 가지입니다 : 설치 API, 구성 관리자 API 및 다양한 WMI 확장. 그러나 임베디드 XP 대상을 사용하려는 경우 WMI로 다이빙하는 것에 대해 신중해야합니다. 그렇지 않으면 필요하지 않은 OS 이미지에 많은 것을 포함시켜야하기 때문입니다.

관련 문제