Don't think! Just do it!

종합 IT 기술 정체성 카오스 블로그! 이... 이곳은 어디지?

임베디드 소프트웨어/Protocol

USB.01

방피터 2012. 9. 28. 11:28

USB를 해 봅시다.

Original USB

 

   DMX에서 갑자기 USB로 점프하려니 ㅋ 뭔가 언벨런스한 면이 있지만... 그래도 제가 실제로 진행하는 것을 올리는 것이

 

저에게도 여러 엔지니어 분들에게도 도움이 되지 않을까 싶어서 글을 작성합니다. 목표는 USB MSD를 표준 문서에만

 

의존해 구현하는 것입니다. 성공과 실패는 의미가 없으니 마음에 두지 않겠습니다.

 

 

 

   USB 참 많이 쓰이죠. 하지만 임베디드에서 접근하기가 상당히 까다로웠습니다. USB 전용 IC가 많이 나와 있기도 했지만

 

이미 윈도우 드라이버가 있거나 아니면 USB to RS232 아니면 MSD(Mass storage device)처럼 표준을 사용하는 IC정도였죠.

 

관련 서적도 국내에서는 턱없이 부족합니다. 물론 표준 문서는 사이트에서 얼마든지 구할 수 있습니다. 다만 영문이라는

 

사소한 압박이 있죠? 그리고 표준 문서는 양도 방대합니다. 현재 USB 2.0 표준 문서는 650페이지입니다. 이게 어느 정도냐면

 

우리가 사용하는 사무실용 A4지 묶음 중에 사전 처럼 두꺼운 것이 500매 입니다. 단면으로는 그 A4지 한권을 다해도 출력이

 

힘듭니다. 뿐만아니라 MCU 사이드에서도 따로 공부해야 하는 것들이 있구요. (단지 MCU의 USB 기능을 사용하기 위한)

 

또 있습니다. USB 클래스라는 것인데 MSD나 HID(Human interface device: 마우스, 키보드 등)도 따로 공부를 할 필요가

 

있습니다. 일단 시작은 USB 2.0 표준 문서를 정독!하는 것으로 정했습니다. 제가 여러분들에게 그 과정을 전부 보일 만큼

 

잔인하지는 않습니다. 핵심만 추리고 추려서 ^^ 저도 공부하고 여러분들께도 알려드리도록 하겠습니다.

 

 

USB 표준 문서 링크: http://www.usb.org/developers/docs/usb_20_071012.zip

 

 

   USB는 아시겠지만 HostDevice로 이루어져 있습니다. USB 시스템 내에서는 단 하나의 HOST의 존재만 가능합니다.

 

예를 들면 노트북과 데스크탑의 USB를 연결해도 서로 인식 못한다는 것이죠. 그리고 흔히 USB라고 부르는 MSD 두개를

 

서로 이어도 마찬가지죠. Host는 대부분 PC고 Device는 아시는대로 정말 많죠?

 

 

   규격도 많은데요. USB 2.0 이 있다는 것은 1.0도 있었다는 소리겠고 또 현재는 3.0, OTG와 같은 규격도 나와 있습니다.

 

하지만 제가 사용하는 IC가 2.0만 지원하므로 2.0에 집중하도록 하겠습니다. USB2.0은 Full-speed를 지원합니다.

 

Full speed가 얼만데? 넹 12Mb/s 입니다. Low speed도 지원하는데 낮은 bandwith를 가진 기기들을 위한 용도로

 

USB 버스의 속도저하를 막기위한 용도입니다. 또 BUS의 형태니깐 터미네이션도 필요합니다만 이건 신경 안쓰셔도

 

될 것 같습니다. 케이블 종단에 설치되게 되어 있다고 표준에 나오네요. DMX에도 언급을 했습니다만 터미네이션은

 

데이터 반사를 막기 위해 케이블 종단에 설치되는 저항입니다. 그리고 4개의 라인이 필요하고 5V 500mA도 공급하죠.

 

 

프로토콜

 

   위는 대략적인 내용입니다. 너무 일반적인 내용이므로 다들 알고 계시리라 생각됩니다. 자, 이제는 프로토콜

 

대해서 간략적으로 살펴봅시다. 표준 문서에서는 USB의 데이터 교환을 Bus transaction 이라고 부릅니다. 각 transaction

 

의 Host가 USB packet을 보내는 것으로 시작됩니다. 그 Packet의 내용은 transaction의 방향, Device 주소, 그리고

 

Endpoint의 숫자입니다. Token packet이라고 부르는 이 내용은 On a scheduled basis 해서 보낸다고 되어 있는데

 

저는 주기적으로 쏜다는 의미로 받아들였습니다. 자 그럼 정리를 해 봅시다. 정리는 역시 그림이 짱!!!

 

 

   ㅎㅎㅎ 역시 그림이 짱!이여! ㅋㅋㅋ But!  제가 보는 페이지는 46/650... ㅠㅠ 자 계속 보도록 합시다. 이렇게 전송된 패킷은

 

디바이스들에게 전송되는데 주소가 셋팅된 디바이스들은 해당 페킷을 받아드리고 트렌젝션 방향에 따라 호스트 -> 디바이스,

 

디바이스 -> 호스트로 통신을 하게 되는 것이죠. 이 데이터 방향에 따라 전송하는 놈은 데이터를 보내거나 데이터가 없다고

 

받는 놈한테 알려줍니다. 받는 놈은 해당 패킷의 전송이 성공했는지 안했는지 전송하는 놈에게 알려주죠. 이걸 Handskake

 

라고 부릅니다. 그럼 다시 그림으로 표시해 봅시다.

 

 

 

 

 

PIPE

 

   위와 같이 3단계를 거쳐 통신을 합니다. 여기서 Endpoint는 뭐죠? 자 신경쓰지 맙시다. 저도 아직 완벽히 이해한게 아니라

 

섣불리 말씀드리기는 뭐하지만 디바이스입장에서 보면 단순히 메모리입니다. 호스트와 EP(줄여 부르겠습니다.) 사이의

 

전송 모델을 Pipe라고 부릅니다. 그리고 이 Pipe는 Stream과 Message 2종류가 있는데 차이는 Stream은 딱히 구조가 없고

 

Message는 있습니다. 디바이스는 이 Pipe를 여러개 가질 수 있어서 한개는 Input으로 한개는 Output으로도 사용할 수 있습

 

니다.

 

 

 

 

 

   USB에는 기본적인 통신 방식 타입이 4가지가 있습니다. 한 개의 Pipe는 아래 통신 타입 중에 단 한 개의 타입만 지원합니다.

 

1. Control Transfers : 디바이스를 호스트에 연결했을 때 설정 하는 곳에 사용됩니다. 모든 디바이스에게 공통 사항이며

EP0를 사용해야 합니다. 이게 없으면 USB가 아니여~

 

2. Bulk Data Transfers : 대량의 데이터를 전송할 때 사용됩니다. MSD나 프린터 아니면 스캐너 등에 사용됩니다. 이 때 전송

    대역폭은 USB 버스 상태에 따라 변화됩니다.

 

3. Interrupt Data Transfers : 음... 알맞은 때에 신뢰할 만한 데이터를 보낼 때 사용합니다. 예를 들면 마우스 같은 것이죠.

   마우스가 늦게 움직이면 컴퓨터를 뽀샤버리고 싶죠....

 

4. Isochronous Data Transfer : 주기적으로 전송되는 데이터에 사용됩니다. 전송 지연과 대역폭이 미리 설정됩니다.

  이 말은 음악 전송과 같이 실시간으로 스트리밍하는 곳에 쓰인다는 소리입니다.

 

   모든 디바이스는 자신이 뭐하는 놈인지, 모델명이 뭔지, 누가 만들었는지 등등등을 호스트에 알려야 합니다. 이 정보는

 

호스트와 EP0 사이에 형성된 파이프를 통해서만 이루어 집니다.

 

 

   휴... 힘드네요. 이 정도가 USB 임베디드 프로그램 시작입니다. 10%? 20%? 아닙니다. 0% 진행된 것이죠. ㅎㅎ 이정도는

 

사전 조사에 불과합니다. 저야 MCU side에서도 봤으니 어느 정도 몽글몽글하게 머릿속에 이미지가 있지만 USB에 대해서

 

처음 접하시는 분들은 거의 뜬구름 잡는 소리랄까? 사실 위 글은 링크 걸어둔 표준 문서의 서론을 해석한 것에 불과합니다.

 

이제 시작이니까 너무 열내지 마시고 대강 느낌만 살짝.. 아주 사알짝 느끼는 정도면 됩니다. 후~ 다음 시간부터 힘들겠네요.

 

아무튼 오늘부터 추석 연휴잖아요? 여러분 모두 추석 잘 보내시고 푹 쉬시고 충전하시길 바라겠습니다. ^^

 

쉴때는 개처럼~ Dwarp

반응형

'임베디드 소프트웨어 > Protocol' 카테고리의 다른 글

USB.03  (0) 2012.10.05
USB.02  (0) 2012.10.04
DMX-3  (1) 2012.09.10
DMX512-2  (0) 2012.08.31
DMX512  (0) 2012.08.29