USB HID 디스크립터를 빌드하기위한 값을 어디에서 찾아 볼 수 있습니까?


10

나는 시도하고 싶은 PIC32 USB 프로젝트를 위해 C에서 USB HID 디스크립터를 만드는 것에 대해 조금 교육하려고합니다.

http://www.usb.org/developers/hidpage/ 에서 HID Usage Tables 문서를 다운로드 했으며 HID 설명 자의 다른 요소에 대한 실제 값이 표시되는 위치를 파악하려고했습니다.

내가보고있는 샘플에서 발췌하여 설명하겠습니다.

ROM struct{BYTE report[HID_RPT01_SIZE];}hid_rpt01={{
  0x05,0x01,        // USAGE_PAGE (Generic Desktop)
  0x09,0x05,        // USAGE (Game Pad)
  0xA1,0x01,        // COLLECTION (Application)
  0x15,0x00,        //   LOGICAL_MINIMUM(0)
  0x25,0x01,        //   LOGICAL_MAXIMUM(1)
  0x35,0x00,        //   PHYSICAL_MINIMUM(0)
  0x45,0x01,        //   PHYSICAL_MAXIMUM(1)
  // ...

위의 예에서 BYTE 배열이 키 / 값 쌍으로 구성되어 있음을 알 수 있습니다. 예를 들어 두 번째 줄 : 0x05,0x01 은 키 0x05 ( 사용 페이지 )를 나타내고 0x01은 일반 데스크탑을 나타내는 값을 나타냅니다.

이 값이 HID Usage Table PDF 문서에서 어디에 표시되는지 알아 내려고합니다. 예를 들어, 나는 참조를 찾을 수 없습니다

USAGE_PAGE == 0x05

예를 들어

COLLECTION == 0xA1

0xA1에 대한 PDF를 검색했지만 결과가 없습니다. 값이 무엇인지 알 수있는 유일한 방법은 예제의 주석을 보거나 위의 링크에서 USB 디스크립터 도구 를 사용하는 것 입니다.

궁금한 점이 있습니다.이 키 / 값 참조 문서가 누락되어 완전히 멍청합니까?

http://www.frank-zhao.com/cache/hid_tutorial_1.php 와 같이 온라인에는 많은 예제가 있습니다 .

그러나 이것조차도 END_COLLECTION == 0xc0 과 같은 많은 문자열 값을 참조합니다.

이 값에 대한 참조는 어디에서 찾을 수 있습니까? 내가 무엇을 놓치고 있습니까?


HID 디스크립터를 빌드하려면 USB 디스크립터 도구를 사용해야 할 것 같습니다. :)
josef.van.niekerk

답변:


20

USB 문서는 꽤 끔찍합니다. 과도한 일반화로 인해 문서를 특정 응용 프로그램으로 가져 오기가 어려울 정도로 모든 것을 너무 일반적이고 일반적으로 만들려고합니다.

디스크립터 형식은 제공하는 usb.org 링크의 " HID에 대한 디바이스 클래스 정의 "문서에 있습니다.

누락 된 중요한 점은 다양한 세그먼트 (예 : 0x05) 가 접두사 0x로 문서화되어 있지 않다는 것입니다 . 사실, 그들은 일반적으로 그들을 설명 원시 이진법 .

예를 들어 0xA1과 관련하여 : 여기에 이미지 설명을 입력하십시오

당신은 것을 볼 수 있습니다 이진 접두어 1010_00nn모음입니다, 그리고 접미사가 표시 nnnn_nn01는 1 바이트 길이 나타냅니다. 그런 다음 후속 바이트는 콜렉션 유형 (이 경우 Application 유형)으로 해석됩니다. 그러면 HID 디스크립터 파서가 다른 콜렉션 태그 또는 엔드 콜렉션 마커를 볼 때까지 추가 바이트가 해석되는 컨텍스트를 설정합니다.

당신은이 볼 수 END COLLECTION로 지정 0b1100_00nn하여, nn무시. 이것은 어디에서 0xC0오는가입니다.

다른 인수가 어떻게 구성되는지 확인할 수도 있습니다. 예를 들어 LOGICAL MINIMUMis 0x25또는 0b0010_0101입니다. 그에서, 우리는 우리가 데이터 길이 있다고 볼 수있다 0bnnnn_nn01, 또는 1 바이트 등에 대한 지정 LOGICAL MINIMUMIS를0b0010_01nn

여기에 이미지 설명을 입력하십시오

USAGE PAGE디스크립터 의 구조 는 동일합니다. 사용 페이지를 선택하는 명령은 0000_01nn, 그리고 nnnn_nn01은 1 바이트 길이 나타냅니다. 설명서에는 사용법 페이지가 32 비트라고 명시되어 있으므로 상위 비트는 0으로 간주되거나 설명서의 다른 부분에서 추론됩니다. 나는 그들이 어떻게 지정되었는지 실제로 모른다.

다양한 HID 상수의 좋은 페이지가 있습니다. .

그리고 BSD 소스에서 최신 버전 여기에 (감사합니다, @crazysim!) (최신 HEAD는 지난되지 않을 수 있습니다).


내가 필요한 것만 깊이있는 답변에 감사드립니다. 정말 많은 도움이됩니다! ;)
josef.van.niekerk

1
@ josef.van.niekerk-문제 없습니다. USB 표준을 파고 들기까지는 오랜 시간이 걸렸으며, 내가 기억했던 것처럼 불투명합니다.
코너 울프

나는 gradigging에 대해 사과하지만 USB.org에 대한 링크는 더 이상 작동하지 않습니다.
Rob van der Veer

1
@RobvanderVeer가 수정되었습니다.
hoosierEE

1
"다양한 HID 상수의 좋은 페이지"를 FreeBSD 소스에서 해당 파일의 이후 버전 으로 변경해야 합니까? ?
crazysim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.