USB는 Universal Serial Bus의 약자로 여러가지 통신 기법 중의 하나입니다. 호환성이 좋고 기존의 통신들에 비해 빠른 속도 등으로 인해 차세대 통신 기법중에 가장 각광받는 통신기법입니다.
이 세상에는 수많은 USB장치들이 있습니다. USB메모리, 데이터 케이블, 마우스, 키보드, 심지어 선풍기, 다운로더 등 USB 하나만을 가지고도 굉장히 많은 응용장치를 개발할 수가 있습니다. 그렇다면 PC에서는 USB 포트에 장치가 꼳히면 어떻게 장치를 구분하는 것일까요?
맨 처음에 USB 포트에 장치가 꽂히면 PC가 이를 감지합니다. 그런 후에 PC에서 장치로 신호를 보내게 되죠. '넌 뭐하는 넘이냐(Who are you?)'라는 신호를 보냅니다. 그리고 장치에서는 이 신호를 받아 '나는 뭐뭐 하는 놈입니다(I'm a...)'라는 신호를 보내죠. 상호간의 이 신호를 PC(Host)에서 보내는 신호는 요구, 요청이라 하여 Request라고 하며, 장치에서 자신의 정보에 대한 내용을 수록한 신호는 서술자(정보를 분류하는 용도)라고 하여 Descriptor라고 칭하게 됩니다.
이 때 PC와 디바이스의 용도를 나누면 위와 같습니다. PC인 Host는 디바이스 감지, 데이터 흐름 관리, 에러 확인, 전원 공급, 주변 기기와 데이터 교환등의 역할을 가지게 됩니다. 또한 Device는 칩으로 오는 통신 감지, Host에서 보내는 표준 리퀘스트(Request의 분류를 표준화 하여 지정해 놓은 것)에 응답, 에러 확인, 전원 관리, 호스트와 데이터 교환등의 역할을 가지게 됩니다.
그렇다면 USB장치를 개발하기 위해 필요한 구성요소는 무엇일까요. USB 통신이 가능하도록 인터페이스 컨트롤러를 내장한 칩이 필요합니다. 물론 일반 마이크로컨트롤러를 사용해서도 USB장치를 개발하는 것이 가능하지만, 그렇게 되면, 펌웨어 소스 코드가 복잡해 지고, 또한 USB 통신의 표준 규약에 관한 사항들을 모두 소스로 구현해야 하는 불편함이 있기 때문에, 소스 코드가 복잡해 지고 개발이 매우 어려워 지게 됩니다. 그런 후에 내부 프로그램 코드, USB를 지원하는 호스트, 주변기기와 통신이 가능한 디바이스 드라이버가 필요합니다.
개발을 위한 도구로는 디바이스 펌웨어 소스 작성, 수정, 작업, 컴파일 등이 가능한 '컴파일러'와 펌웨어 코드를 메모리에 저장할 수 있는 '프로그래머' 혹은 '개발키트', 호스트에서 USB장치를 감지하고 OS와 통신할 수 있게 해주는 소프트웨어, 디바이스 어플리케이션 등의 호스트용 '프로그래밍 언어'와 '개발환경' 그리고 기타로는 모니터 프로그램, USB 내부 프로토콜을 해석해서 GUI적으로 보여주는 애널라이저 등이 있습니다.
USB프로젝트 개발을 위한 전체적인 과정을 살펴보도록 하겠습니다. 가장 처음으로 USB포트에 장치를 꼳았을 경우 윈도우가 이 디바이스를 감지하는 과정을 '초기결정'이라고 합니다. 그런 후에 호스트(Host PC)는 장치가 무슨 역할을 하는 장치인지, 장치가 가지고 있는 고유의 정보(Descriptor)를 요구하게 됩니다. 이 때 Host와 Device는 서로 Request(요청)와 Descriptor(서술자, 정보)를 주기적으로 교환하게 되며 이 과정을 열거(enumeration)이라고 합니다. 열거가 끝나고 나면 Host에서는 장치를 감지하고 이를 USB장치로 등록하게 됩니다. 등록이 완료되면, 실제로 USB장치는 자신의 본래의 기능을 수행하도록, 본 목적의 데이터를 교환하게 됩니다. 각 과정의 보다 자세한 설명은 아래를 참고하시기 바랍니다.
USB장치 개발을 위한 host와 Device의 Application을 살펴보면, USB장치에게 요청 및 열거 등이 가능하도록 Host에서는 표준 윈도우 API함수를 사용하게 됩니다.
Device는 컨트롤러 칩 내부에서 제공해주는 버퍼에, 데이터를 쓰고 읽어 그에 맞게 활용하도록 소스 코드를 작성해야 합니다.
이 때, 데이터를 쓰거나 읽도록 버퍼로 사용하는 장소를 '엔드포인트'라고 합니다. 엔드포인트는 데이터를 저장할 수 있는 버퍼로서 메모리 블록 혹은 레지스터를 사용하게 됩니다. 이 때, 엔드포인트를 크게 2개로 분류하게 되는데, IN과 OUT입니다. 각 분류는 호스트 관점에서 그 고유의 이름이 정의되며, 호스트로 들어오는 방향을 IN, 호스트에서 보내는 방향을 OUT이라고 하여 IN엔드포인트, OUT엔드포인트로 분류됩니다. 즉, IN엔드포인트(버퍼)에는 호스트로 보낼 데이터를 저장하고, OUT엔드포인트(버퍼)에는 호스트로부터 수신한 데이터를 저장하여 읽기위해 사용하게 되는 것입니다. 이렇게 저장
된 데이터는 패킷화 되어 여러가지 정보들이 데이터를 중심으로 쌓여지게 되는데, 이 것을 트랙잭션이라고 합니다.
USB에는 다양한 장치로 응용할 수 있는 만큼, 사용가능한 용도를 분류하였는데 이렇게 분류된 용도를 Class(클래스)라고 합니다. 이 중 HID클래스는 Human Interface Device(HID)라고 하여, Host에서 인간이 인터페이스(상호작용)할 수 있도록 도와주는 장치는 HID로 분류됩니다. 대표적으로 마우스, 키보드, 조이스틱 등이 이 HID장치로 분류됩니다. HID 클래스 디바이스는 리포트(report: 보고서)를 구조체 형식으로 지정하여, 실제 본래 목적으로 교환할 데이터를 보고서 형태로 구성되어 있습니다. 또한 호스트로 보낼 데이터 IN엔드포인트는 '인터럽트'형식으로 구동되게끔 되어있습니다.
앞 서 디스크립터에 대해서도 설명했지만, 디스크립터는 USB장치가 무슨 역할을 하는지에 대한 정보를 가지고 있는 자료구조 입니다. 따라서 USB포트에 장치를 꼳으면, 가장먼저 Host PC와 이 데이터를 주고 받게 되고, 이 과정이 열거(enumeration)과정이라고 하였습니다. 디스크립터에는 크게 4가지 타입이 있는데, 디바이스의 기본 정보를 가지고 있는 디바이스 디스크립터, 보다 세부정보를 가지고 있는 컨피규레이션 디스크립터, 인터페이스 방식을 정의하는 인터페이스 디스크립터, 엔드포인트 사용 방식을 정의하는 엔드포인트 디스크립터로 나눌 수 있습니다.
보다 자세한 내용은, 다음에 작성할 게시글에 자세하고 알기 쉽게 설명해 드리도록 하겠습니다. 위는 실제 descriptor가 분류되어있는 도식표로서, USB specification Document 내부에 수록되어 있는 자료입니다.
주요 키워드 : request, descriptor, enumeration, endpoint, HID(Human interface Device), HID Class
Writteh by. Min Ae Oh
출처: http://blog.naver.com/herster79/50077020226