2018년 10월 18일 목요일

WinUSB Tryout

WinUSB 장치 Descriptor 설정


선행조건

  • Windows 7+
    • WinUSB 장치 설정은 Windows 7 부터 지원이 가능하다. (참고)
    • 다만 Windows 10에서와 같이 driver 설치 없이 사용하지 못할 수도 있다. 그렇다고 하더라도 기존과 같이 driver(inf 파일만 필요) 를 작성하여 쓸 수 있으니 걱정할 필요는 없다.
  • USB 2.1+
    • USB 2.1을 지원하지 않는 환경에서는 사용에 제한이 발생할 수 있다.
      • USB 2.0의 경우 MS OS Descriptor v1.0을 사용해 장치를 설치할 수는 있으나, 알수 없는 장치로 표시된다.
      • 장치 클레스를 인식할 수 있도록 도와주는 BOS (Binary Object Store) Descriptor는 USB 2.1 이후에서 지원되기 때문이다.

개발 방법 (Cypress EZ-USB 기준)

  • EZ-USB FX2LP를 사용해 구현이 가능하므로 이를 이용해 개발환경을 만들어보자.
  • 준비물
    • EZ-USB Suite (EZ-USB FX3 SDK에 포함됨 - 링크)
    • SDCC compiler (링크)
      • SDCC 버전이 호환성에 영향을 줄 수 있다. FX2LP 칩셋에서 테스트에 성공한 버전은 3.0.0이다. 오래된 버전들은 32bit 버전만 있으므로 참고.
    • Cygwin
      • 사실상 필수요소는 아니지만 Makefile 작성 및 빌드 시에 발생하는 자질구레한 문제들을 피할 수 있는 가장 쉬운 방법이다.
    • Cypress EVK 또는 호환 보드
  • Workflow (USB enumeration) 의 이해
    • USB 장치가 연결되면 통상 다음과 같은 절차를 거쳐 장치가 인식된다.
      1. Get Device Descriptor (80 06 00 01 00 00 FF 00)
      2. Set Address (00 05 25 00 00 00 00 00)
      3. Get Device Descriptor (80 06 00 01 00 00 {length} 00)
      4. Get Configuration Descriptor (80 06 00 02 00 00 FF 00)
      5. Get String Descriptor (80 06 EE 03 00 00 12 00): "MSFT100"
      6. Get String Descriptor(s) (80 06 {index} 03 00 00 FF 00): [0] = language, [1~], Device Descriptor 또는 interface descriptor에서 참조하고 있는 string index만큼
      7. Set Configuration (00 09 01 00 00 00 00 00)
    • Device Descriptor에서 USB 2.1을 지원한다고 보고하게 되면 4번 단계에서 'Get BOS Descriptor'를 수행한다.
      • 1~3
      • Get BOS Descriptor (80 06 00 0F 00 00 FF 00)
      • 5~7
      • Get MS Extended Compat ID OS Feature Descriptor(C0 21 00 00 04 00 10 00): header를 읽어옴
      • Get MS Extended Compat ID OS Feature Descriptor(C0 21 00 00 04 00 {length} 00)
      • Get String Descriptor(s) [1~]
      • Get Device Status
    • 참고: 
  • Enumeration 단계에서 알 수 있듯, BOS 및 MS Extended Compat ID Feature Descriptor 등은 USB 2.1 연결에서만 획득할 수 있다.
    • BOS (Binary Object Store) Descriptor
      • 여러가지 기능을 구현하는데 사용할 수 있겠지만, 여기에서 관심있는 것은 device capability 항목이다.
      • Device capability는 연결된 장치에서 어떤 일을 할 수 있는지를 알아내기 위한 것인데, Windows XP SP2에서부터 사용되어 왔다.
      • 5 가지 capability가 정의되어 있는데 다음과 같다.
        1. Wireless
        2. USB 2.0
        3. Super speed (3.0)
        4. Container ID
        5. Microsoft OS 2.0 descriptor (Windows 8.1 이상에서만 지원)
      • Container ID 및 MS OS 2.0 descriptor를 이용해 연결된 장치에 사용될 드라이버를 Windows에서 결정하도록 할 수 있다.
        • Windows 개발자 센터(링크)에서도 간단히 설명이 되어있지만, 큰 기대는 하지 말자.
        • Microsoft OS Descriptors Overview(링크) 문서에 더 자세한 내용이 나와있지만, USB Complete 5th edition과 같은 참고자료가 훨씬 도움이 된다.
        • Microsoft OS descriptor는 driver (.inf) 파일에 정의되어 있는 내용들을 장치에서 직접 제공할 수 있도록 고안된 표준이다. 1.0에서 다소 제한적이었던 것을 2.0에서 개선하여 composit device의 경우에도 별도 설치 과정이 완전히 제거되도록 했다.
    • Extended Compat ID
      • 장치가 어떤 인터페이스로 연결 가능한지를 정의한다. 예를 들어 WinUSB의 GUID는 (.inf ClassGuid 항목과 같음)  {88BAE032-5A81-49f0-BC3D-A4FF138216D6}로 정해져 있는데, BOS descriptor 내의 Platform Capability descriptor에 정의해 WinUSB 드라이버가 자동으로 선택되도록 할 수 있다.
      • USB 2.0의 경우 Container ID (bDevCapability = 4)에 같은 값을 입력해도 비슷한 효과를 볼 수 있는데, 알수 없는 장치로 표시된다. (확인 필요)
    • Microsoft OS 2.0 Descriptor
      • 다중 인터페이스 환경에서 장치의 인터페이스를 획득하는데 사용할 수 있는 "DeviceInterfaceGUIDs" 항목을 포함하는 복잡한 구성도 가능하지만 (arduino WebUSB project 참조), 아래와 같은 단순한 구성도 가능하다. (사실, MS OS 2.0 descriptor 대부분의 내용이 UniCode 문자열로 구성되어 있어 프로그램 용량이 지나치게 커지는 문제가 있다)
    MSExtDscr:
    ; Microsoft OS 2.0 compatible ID descriptor (table 13)
    .db 0x28, 0x00, 0x00, 0x00 ; dwLength: 40
    .db 0x00, 0x01 ; bcdVersion: 0x0100 (Version 1.0)
    .db 0x04, 0x00 ; wIndex: 4 (Extended compat ID descriptor)
    .db 0x01 ; bCount
    .db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ; reserved
    .db 0x00 ; bFirstInterfaceNumber
    .db 0x00 ; reserved
    .db 0x57, 0x49, 0x4E, 0x55, 0x53, 0x42, 0x00, 0x00 ; "WINUSB"
    .db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    .db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    MSExtDscr_End:
    

댓글 없음:

댓글 쓰기

[Scrap] Zero to Hero: Guide to Object Detection using Deep Learning: Faster R-CNN,YOLO,SSD

Zero to Hero: Guide to Object Detection using Deep Learning: Faster R-CNN,YOLO,SSD https://cv-tricks.com/object-detection/faster-r-cnn-yo...