4장

이벤트와 리퀘스트

 허브는 주기적으로 하향 포트에 연결된 디바이스의 장착과 탈착을 감지. 주기적으로 폴링을 하거나 인핸스드 슈퍼스피드 패킷을 수신하여 디바이스의 장/탈착을 감지한다.

 과정
 1. 호스트는 새 디바이스에 대한 정보를 얻기 위해 디바이스 허브로 리퀘스트
 2. 허브는 디바이스와 호스트 간에 통신 경로를 설정
 3. 호스트는 통신 경로에 제어 전송(표준 USB 리퀘스트 포함)을 보내어 디바이스 열거 시도
 4. 디바이스는 각 리퀘스트에 해당하는 정보로 응답하거나 요청된 기타 동작 수행
* 모든 USB 디바이스는 제어 전송, 표준 리퀘스트, 엔드포인트 0을 지원해야 함

 

설정 상태 얻기

 

디바이스의 상태 (USB 2.0 기준)

  • 전원 공급됨 (Powered)
  • 기본 (Default)
  • 주소 (Address)
  • 설정됨 (Configured)
  • 장착됨 (Attached)
    : 허브가 디바이스의 VBUS 선에 전원을 공급하지 않은 상태. VBUS에 전원이 없으면 호스트와 디바이스가 통신을 할 수 없기 때문에 디바이스가 연결되지 않은 것과 마찬가지.
  • 서스펜드 (Suspend)
    : 최소 3ms 동안 SOF 마커를 포함한 버스 활동이 없는 상태

 

일반적인 USB 2.0 순서

  1. 시스템이 새 디바이스를 갖는다.
    : 사용자가 USB 포트에 디바이스를 장착하거나 디바이스를 장착한 상태에서 시스템 전원을 넣음.
     허브가 포트에 전원을 공급하면 디바이스는 Powerd 상태가 됨 (디바이스는 버르소부터 100mA까지 전류를 얻을 수 있음)
  2. 허브가 디바이스를 감지한다.
    : 허브는 각 포트의 신호선(D+와 D-) 전압을 감시한다. 허브의 각 신호선은 14.25~24.8kΩ의 풀다운 저항이 있다. 디바이스는 풀스프드 디바이스에서는 D+에, 로우스피드 디바이스에서는 D-에 900~1575 Ω 의 풀업 저항이 있다. 디바이스는 VBUS가 0.8V 이상인 것을 검출한 이후 1초 내에 연결돼야 하는데, 전력이 약하거나 모두 소모된 배터리를 상요하는 디바이스는 제외
  3. 호스트가 새 디바이스 정보를 얻는다.
    : 각 허브는 인터럽트 엔드포인트를 이용해 발생한 이벤트가 허브인지 포트인지 보고.
     호스트는 발생한 이벤트에 대해 자세히 알아내기 위해 Get Port Status 리퀘스트를 허브로 전송
     허브는 호스트로부터 반환된 정보를 통해 새 디바이스를 호스트에 장착했음을 감지
  4. 허브는 디바이스가 풀스피드인지 로우스피드인지 감지
    : 신호선 전압을 검사해 디바이스가 로우스피드인지 풀스피드인지 판단
  5. 허브가 디바이스를 리셋
    : 호스트가 새 디바이스 장착을 알아채면 Set Port Feature 리퀘스트를 허브로 보내 포트 리셋을 요청
  6. 호스트는 풀스피드 디바이스가 하이스피드도 지원하는지 확인
  7. 허브는 디바이스와 버스 사이의 신호 경로를 설정
  8. 호스트는 Get Descriptor 리퀘스트를 보내 기본 파이프의 최대 패킷 크기를 알아낸다.
  9. 호스트가 주소를 할당한다.
    : Set Address 리퀘스트
  10. 호스트는 디바이스 기능에 관한 정보를 읽어온다.
    : Get Descriptor 리퀘스트
  11. 호스트가 디바이스에 추가 정보를 요청
  12. 호스트가 디바이스 드라이버를 할당하고 메모리로 가져온다.
    : 윈도우 호스트는 INF 파일을 이용해 최적의 드라이버를 식별. INF 파일은 USB 클래스용 시스템 파일 또는 제조자 제공 파일이다. 이 안에는 디바이스 Vendor ID, Product ID가 들어있다.
  13. 호스트 디바이스 드라이버가 컨피규레이션을 선정
    : Set Configuration 리퀘스트 전송. 디바이스가 요청 받은 Configuration을 수신하면 요청받은 컨피규레이션을 활성화. 디바이스는 설정됨 (Configured) 상태로 전환되고 인터페이스 활성화

*OS나 OS 버전에 달라질 수 있음

 

 

디바이스 제거

사용자가 버스에서 디바이스를 제거하면 허브는 디바이스를 장착했던 포트를 비활성화한다. 그 후 허브가 호스트에게 이벤트가 발생했음을 알리고, 호스트가 디바이스 제거를 알아챈 후 Get Port Status 리퀘스트를 보내 어떤 이벤트가 발생했는지 확인. 이제 디바이스가 장치 관리자에서 사라진다.

 

 

성공적인 열거를 위한 팁

열거를 성공하지 못하면 디바이스와 호스트는 통신 작업을 수행할 수 없다. 칩 제조사는 대부분 예제 코드를 제공한다. 

  • 이벤트는 정해진 순서로 발생하지 않을 수 도 있다.
  • 제어 전송은 재빠르게 이루어져야 하며 유사시에는 신속하게 포기해야한다.
  • 호스트가 요청한 데이터보다 많이 보내면 안된다.
  • 필요하면 ZLP(zero-length data packet)를 보낸다.
  • 지원하지 않는 리퀘스트는 STALL로 응답
  • 주소를 너무 빨리 지정하면 안된다.
  • 서스펜드 상태에 대한 준비를 해야한다.
  • 다른 호스트 컨트롤러 환경에서도 테스트해야 한다.

 

 

 

2 디스크립터

2-1 디스크립터 유형

2-2 디바이스

2-3 디바이스 한정자

2-4 컨피규레이션

2-5 다른 속도 컨피규레이션

2-6 인터페이스 연관 디스크립터

2-7 인터페이스 디스크립터

2-8 엔드포인트

2-9 슈퍼스피드 엔드포인트 짝

2-10 슈퍼스피드 플러스 등시성 엔드포인트 짝

2-11 문자열

2-12 바이너리 오브젝트 스토어와 디바이스 기능

2-13 OTG 디스크립터

2-14 마이크로소프트 OS 디스크립터

2-15 USB 2.0용 디스크립터로 업데이트

2-16 USB 3.1용 디스크립터로 업데이트

 

 

 

 

'USB' 카테고리의 다른 글

[USB] USB 장치  (0) 2020.11.01
[USB] Window USB Descriptor  (0) 2020.11.01

+ Recent posts