안경잡이개발자

728x90
반응형

USB(Universal Serial Bus)란?

  USB는 어떠한 주변기기(Device)라도 우리의 PC에 쉽게 붙여서 동작하도록 지원해주는 규격이다. 예를 들어 마우스, 키보드, 이어폰 등은 일반적으로 공통적으로 USB 프로토콜을 쓰고 있다.  또한 스토리지(Storage), 스마트 폰 등도 USB 규격을 이용해서 연결하도록 제공이 되는 것을 생각해보면 된다.

  USB 2.0 버전 이상에서는 초당 수십 MB 단위의 데이터를 송수신할 수 있으며, 하나의 PC에 매우 많은 USB 디바이스를 연결해도 문제가 없다. 우리는 흔히 컴퓨터를 이용할 때, PC에 마우스, 키보드, 이어폰을 모두 연결하여 사용하곤 한다. 그럼에도 불구하고 전혀 문제는 점을 떠올리면 된다.

  심지어 각 기기에 전원을 공급할 필요도 없다. USB를 꽂기만 하면, PC에서 마우스나 키보드에 전원도 공급해주기 때문이다. 또한 PC에 USB 포트의 개수가 적다고 하더라도, USB 허브를 별도로 구매해서 포트의 개수를 늘리면 그만이다. 이러한 장점들이 있기 때문에 USB는 두루 쓰이고 있는 것이다.

USB의 전원 공급

  앞서 USB는 꽂기만 해도 PC에서 USB 장치에 전원을 공급한다고 했는데, 이것이 가능한 이유는 USB에는 4가지 선이 있기때문이다. 2개의 선(D+, D-)은 호스트와 디바이스 간의 데이터를 주고 받기 위해 사용하고, 2개의 선(Vbus, GND)은 전원을 공급하기 위해 사용한다.

디바이스 클래스(Device Class)

  USB 디바이스를 식별할 때는 벤더(Vendor) ID와 프로덕트(Product) ID를 가지고 식별한다. 하지만, 별도로 클래스로 묶어서 이를 처리하는 경우가 대부분이다. 예를 들어 마우스, 키보드 등의 디바이스를 개발할 때는 처음부터 디바이스 드라이버를 다 작성할 필요는 없고, 이미 존재하는 HID (Human Interface Device) 클래스의 기능을 그대로 이용하면 된다.

  예를 들어서 Arduino나 Teensy 등을 이용해서 자체제작 키보드를 만들거나 할 수 있는데, 이 경우 HID 클래스의 기능을 그대로 이용해서 개발하는 것이 편할 것이다.

기본 용어 정리

  ▶ 패킷(Packet): 호스트와 디바이스간의 통신에서 가장 작은 통신 데이터 단위
  ▶ 트랜잭션(Transaction): 패킷들의 모임을 의미한다. SETUP 패킷, DATA 패킷, HANDSHAKE 패킷 세가지의 종류가 있다. 이렇게 3가지를 모두 묶어서 한 번씩 데이터가 오가는데, 이러한 패킷 묶음을 트랜잭션이라고 한다.

  ▶ 전송(Transfer): 트랜잭션의 모임을 의미한다. 예를 들어 Bulk Transfer는 한 번의 트랜잭션으로 끝날 수 없고, 여러 번 트랜잭션을 반복해야 한다. 이 경우 보내야 할 데이터가 크기 때문에 여러 프레임(Frame)으로 나누어서 전송하거나 할 수 있다.

USB 디스크립터(Descriptor)

  USB 디바이스(Device)에 대한 기본적인 정보는 디스크립터(Descriptor)가 가지고 있다. USB를 PC에 꽂으면, 설정(Configuration) 정보를 주고 받는데, 이 때 Descriptor 정보를 보내게 되는 것이다. 이로써 호스트는 연결된 디바이스의 종류를 알게 되고, 디바이스의 특성에 맞게 데이터의 전송 양이나 폴링 주기를 설정하게 된다.

  디스크립터(Descriptor)에는 여러 종류가 있다. USB 정보를 호스트 PC에 디스크립터 정보를 보내는 데에, 왜 이렇게 많은 종류가 필요한지 궁금할 수 있다. 이것은 USB가 다양한 기능을 지원할 수 있다는 점에서 기인한다. 실제로 하나의 USB 장치는 동시에 마우스이면서, 동시에 키보드이면서, 동시에 조이스틱이 될 수도 있다.

 

  Device Descriptor, Configuration Descriptor, Interface Descriptor, Endpoint Descriptor 이렇게 네 가지 종류가 있다고 보면 된다. 아래 그림과 같이 트리(Tree) 구조로 되어 있다. Device Descriptor는 오직 하나만 존재하고, 이는 여러 개의 Interface Descriptor (마우스, Stroage, 키보드 등)를 가질 수 있다. 또한 하나의 Interface는 여러 개의 Endpoint (데이터를 주고 받는 통로)를 가지게 된다.

 

 

  ▶ 디바이스 디스크립터(Device Descriptor): 디바이스에 대한 가장 기본적인 정보를 담고 있음

    * USB 디바이스는 하나의 Device Descriptor를 가진다.
    * ProductID와 VenderID 정보가 담겨 있다. 
    * 얼마나 많은 Configuration을 가지고 있는지에 대한 정보가 담겨 있다.
    * 클래스(Class) 정보가 담겨 있다.

 

  ▶ 환경설정 디스크립터(Configuration Descriptor): 환경 설정 관련 정보를 가지고 있음

 

    * USB 디바이스는 여러 개의 Configuration Descriptor를 가질 수 있다.

    * 인터페이스(Interface)의 개수, 전력 소비 정보 등의 정보가 담겨 있다.

    * 하나의 USB 디바이스는 일반적으로 하나의 Configuration을 가지고 있다.

    * 여러 개의 전원 공급망을 가진 특별한 USB 디바이스의 경우 여러 개의 Configuration이 존재하는 경우가 있다.

 

  ▶ 인터페이스 디스크립터(Interface Descriptor): 한 가지 기능에 대한 정보를 가지고 있음

 

    * 하나의 USB 디바이스는 여러 개의 기능을 제공할 수 있다. (마우스 + 키보드 + 스캐너)

    * 각 기능마다 하나의 인터페이스(Interface)를 할당한다.

    * 인터페이스 번호, 엔드포인트의 개수 등의 정보가 담겨 있다.

    * 하나의 인터페이스는 여러 개의 엔드포인트(Endpoint)를 가질 수 있다.

    * 예를 들어 마우스이면서 Mass Storage의 기능을 제공하려면 Interface는 2개가 될 것이다.

  ▶ 엔드포인트 디스크립터(Endpoint Descriptor): 하나의 엔드포인트에 대한 정보를 가지고 있음

 

    * 실제로 호스트와 디바이스간의 통신이 이루어지는 통로 (소켓과 유사함)

    * 통로라는 의미에서 파이프(Pipe)라고 말하기도 한다.

    * 엔드포인트(Endpoint)의 번호, 전송 타입(Transfer Type), 방향성 등의 정보가 담겨 있다.

    * 엔드포인트의 전송 타입: Control, Interrupt, Isochronous or Bulk와 같은 타입이 있다.

    * 기본적으로 엔드포인트 0번은 디폴트로 Control 타입으로 사용된다.

USB Enumeration

  USB Enumeration이란 새로운 디바이스(Device)가 Bus에 연결이 되었는지 감지한 뒤에 그 디바이스를 인식하고, 적절한 드라이버를 로드하는 작업을 의미한다. 이를 위해 당연히 적절한 USB Driver를 Host 쪽에서 가지고 있어야 한다.

 

  USB Device가 PC에 꽂히게 되면, Host Controller는 Device의 0번 엔드포인트에게 정보를 요청한다. (이 때는 임시 Address를 이용한다.) 이 때 호스트는 디바이스 디스크립터(Device Descriptor) 정보를 받게 된다. 이후에 해당 Device에게 적절한 Address를 할당하고, 그 Address를 이용하여 나머지 Descriptor 정보를 요청한다. 결과적으로 모든 Descriptor 정보를 받고 나면 Enumeration 과정이 종료된다.

728x90
반응형

Comment +0