2013-07-16 2 views
4

설명 : Windows 8 시스템에 연결될 때 WinUSB를 드라이버로 자동으로 사용하도록 USB 장치를 설정하려고합니다 (here).장치 펌웨어에서 WinUSB 지원

은 말한다 : 장치가 확장 된 기능 설명을 지원하는지 알 수있는 USB 드라이버 스택 위해서는

이 장치가 문자열 인덱스 0xEE에 저장되어있는 OS 문자열 설명을 정의해야합니다.

나는 메모리 위치 0xEE에서 설명자를 포함하는 구조체를 만들어야 함을 의미합니다. C 언어로 어떻게 설명 할 수 있습니까?

// The struct definition 
typedef struct { 
    uint8_t bLength; 
    uint8_t bDescriptorType; 
    uint8_t qwSignature[14]; 
    uint8_t bMS_VendorCode; 
    uint8_t bPad; 
} usb_os_str_desc_t; 

// Create a pointer to a struct located at 0xEE 
volatile usb_os_str_desc_t* const extended_feature_support = (usb_os_str_desc_t*) 0xEE; 

// Create a new struct at the location specified in "extended_feature_support" 
(*extended_feature_support) = { 
    .bLength = 0x12, 
    .bDescriptorType = 0x03, 
    .qwSignature = "MSFT100", 
    .bMS_VendorCode = 0x04, 
    .bPad = 0x00 
}; 

그러나 컴파일러는 데이터 정의가 어떤 유형이 없다고 불평이 마음에 들지 않습니다

는 여기에 내가 뭘하려합니다. C에서이 작업을 수행 할 수있는 방법이 있습니까? 기사를 올바르게 이해하고 있습니까?

도움이 필요합니다.

답변

3

전혀 말하지 않습니다. 임베디드 시스템 메모리의 특정 위치에 구조를 배치하지 말고 USB 요청에 응답해야합니다.

Windows는 처음 VID : PID : Serial을 볼 때 OS 문자열 설명자를 색인 0xee에 요청합니다. 장치는 사용자가 표시 한 구조 형식과 일치하는 데이터 패킷으로 응답해야합니다. 리턴 된 디스크립터의 모든 것이 옳다면 (예를 들어 좋아 보인다), Windows는 문자열 설명자 응답에서 제공 한 bReq를 MS_VendorCode (예제에서는 0x04)로 설정 한 장치 공급 업체 요청을 발행합니다.

장치가 올바른 OS 기능 설명자로 응답하면 마법이 발생합니다. 사람들이 일반적으로 원하는 마술은 장치가 .inf 파일을 제공하지 않고 winusb 드라이버를 사용하는 것입니다.

이 요청은 한 번만 발생합니다. 장치를 개발하는 경우 일반적으로 여러 번 이렇게하고 싶습니다. 이를 수행하려면 장치 관리자에서 장치를 제거한 다음 regedit에서 VIDPIDRELEASE가 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags 아래인지 확인하고 삭제하십시오. 이제 장치를 다시 연결하면이 OS 문자열 설명자 요청을 다시 수행합니다.

자세한 내용은 https://github.com/pbatard/libwdi/wiki/WCID-Devices을 참조하십시오. MS가 제공 한 문서보다 훨씬 명확합니다.

+0

github 링크는 내가 본 것과 같습니다. 감사! –