[Driver] USB Driver 개발하기

USB Driver

책을 읽으면서 중요한 개념은 먼저 정리하려고 한다.

기본 개요

  • USB는 Host와 Device의 통신 프로토콜이다. Host에는 컨트롤러가 Root Hub와 연결되어 있으며, 컨트롤러가 Device에게 송신과 수신을 지시하는 방식으로 통신한다.

  • 장치에 있는 포트가 UpstreamPort, 컨트롤러쪽에 있는 포트가 DownstreamPort 로 불린다. 허브의 경우 컨트롤러 입장에서는 장치일 뿐이고, 장치 입장에서는 컨트롤러로 인식한다.

  • 호스트가 여러 USB와 통신하기 위해서는 대역폭을 나눠서 사용하게 되고, 드라이버가 적절히 분배해서 사용자가 불편하지 않도록 해야한다.

  • 프로토콜은 트랜잭션이라 불리며 데이터패킷, 토큰패킷, 상태패킷으로 나뉜다. 토큰을 먼저 호스트가 USB장치에 보내면서 어떤 종류의 데이터를 받을지가 정해지는 것이다.

    • SETUP 트랜잭션: 설정값 GET, SET을 위한 트랜잭션
    • IN/OUT 트랜잭션: IN은 호스트가 데이터를 받는것, OUT은 호스트가 보내는것 주체는 호스트이다.
    • SOF 토큰: 프레임단위 타이밍을 알려주는 용도로 호스트가 주기마다 토큰만 뿌린다.
  • 버전이 높을수록 최대 전송속도 규격이 추가된다. USB 컨트롤러가 SS+(10Gbps)를 지원한다 하더라도 USB 장치가 LS(1.5Mbps)를 사용하면 LS 속도로 데이터가 전송된다.(키보드)
    USB 2.0에서는 HS(480Mbps), 3.0은 SS(5Gbps)가 최대 전송속도이다.

  • 디바이스의 종류에 따라 신뢰성, 우선순위, 전송데이터 크기, 용도가 다르기 때문에 거기에 맞춰서 대역폭을 잘 스케줄링 해야한다.

구현해야하는 소프트웨어

7b8e23ec-9652-4cc6-a476-a1c487180027
7b8e23ec-9652-4cc6-a476-a1c487180027

호스트

  • 클래스 드라이버 : HID, MassStorage, Audio, UVC 같은 표준 USB 클래스 규격을 구현한 드라이버이다. 앱에서는 “USB"가 아니라 키보드/디스크/시리얼/카메라 같은 형태로 보이게 해준다.
  • 시스템 소프트웨어 : USB core, bus driver, hub driver 를 뭉뚱그린 계층. USB 스택의 공통 계층이다.
  • xHCI 인터페이스 : bus driver가 던진 전송 요청을 하드웨어 동작으로 변환해준다. 이벤트링, 도어벨, TRB 구현한 xHCI 드라이버이다.

디바이스

  • 펑션 디바이스 드라이버 : 디바이스 측면에서 어떤 장치처럼 보일지 결정하는 계층이다. DESCRIPTOR를 구성해서 전달할 값들을 세팅하고, 데이터 흐름(HID장치라면 Interrupt IN report를 주기적으로)을 구현해야한다. 가상장치를 구현한다고 생각하면 이해하기 편하다.
  • 컨트롤러 디바이스 드라이버 : 디바이스쪽 하드웨어를 제어하는 드라이버

MinOS에서 구현할 범위

USB 디바이스와 하드웨어로 통신해야 하기 때문에 xHCI 인터페이스(TRB, 슬롯, 이벤트링 등)가 필요하다.
그리고 운영체제가 데이터를 받을 수 있도록 Interrupt IN 을 세팅하는 코드를 작성해두고,
운영체제가 xHCI를 통해 전달받은 버퍼(HID report)를 읽어서 데이터를 해석하는 HID 드라이버까지만 간단하게 구현하면 될것같다.

ESC
Type to search...