Search

'USB'에 해당되는 글 2건

  1. 2012.10.04 USB.02
  2. 2012.09.28 USB.01 (2)

USB.02

Protocol 2012.10.04 12:08 Posted by Dwarp

USB를 해 봅시다.

Original USB

   다들 즐거운 명절 보내셨으리라 생각됩니다. 엔지니어 분들은 당분 섭취를 송편으로 많이 하셨을테고 ㅋㅋㅋ 대다수의

 

엔지니어 분들이 머리회전을 위해 단 음식을 많이 먹어서 비만과 싸움중인 것으로 알고 있습니다. 당분이 없으면 흡사 좀비와

 

같은 모양새를 면치 못하죠. ㅋㅋ 전 단 것을 별로 좋아하지 않아서 과자같은 건 거의 먹지 않습니다. 그래서 하루에 다방커피를

 

12잔씩...... 스트레스로 인한 담배를 두갑씩...... 일주일에 3일 정도 폭음을...... 으...... 하지만 저세상가기 전에 조금이나마

 

우리나라 엔지니어들을 위한 글을 조금 더 쓰고 가도록 하겠습니다. ㅋㅋ 주절거리다 보니 쓸데없는 내용이 한문단이네요;;;

 

 

   자 USB 두 번째입니다. 첫 번째는 USB 프로토콜에 대해 대략적으로 알아보았는데요. 요약하자면

 

1. USB 통신은 보통 3단계로 이루어진다.

 

a. Token -> Data -> Handshake

 

 

2. Device는 EndPoint라는 것을 여러개 가지고 있다.

 

a. EP0는 Configuration or Control Packet을 위해 사용된다.

b. Host와 EP의 연결모델을 Pipe라 부른다.

c. Pipe는 4가지 타입이 있으며 한가지로만 사용가능하다.

d. 한개의 Device는 여러개의 Pipe를 가질 수 있다.

 

   이정도 입니다. 이번 시간에는 프로토콜 측면에서 더 자세히 살펴보려고 합니다. USB 통신은 보통 3단계로 이루어진다고

 

말씀드렸습니다. Token, Data 그리고 Handshake입니다. 그럼 실제 각 Packet의 구조는 어떻게 되어 있을까요?

 

   아래 표와 같습니다. 순서대로 Token, Data, Handshake입니다.

 

 

 

 

 

 

   모두 시작은 8bit의 PID(Packet ID)로 시작하는 군요. PID는 현재 패킷의 종류를 나타내는 필드입니다. 이 패킷이 Token인지

 

Data인지 아니며 Handshake 패킷인지 나타내주는 것이죠. 아래 표를 보시면 타입과 설명이 나와 있습니다만 위 표와 다르게

 

4bit입니다. 그 이유는 에러를 체크하기 위해 0 ~ 3번 bit까지는 아래와 같은 bit를 적용시키고 4 ~ 7번 bit에는 보수를 넣기

 

때문입니다. 만약 Token 중 OUT 패킷이라면 11100001b 가 되는 것이죠. PID Types 다음 표에 나와 있습니다. 마지막에 있는

 

Special Packet은 Split이나 High speed 관련 내용으로 USB 허브에 관련된 내용이므로 과감히 생략하겠습니다.

 

(USB 2.0은 Full speed를 지원하지만 Hub만은 High speed를 지원합니다.)

 

 

 

 

   이제 어느정도 윤곽이 보이는 군요. 여러분도 보이시나요? ㅎㅎ 전에도 말씀드렸다시피 Token Packet은 호스트만

 

전송할 수 있습니다. Data와 Handshake는 Token Packet에 따라 틀려집니다. Host -> Device가 될 수도 있고

 

Device -> Host가 될 수도 있으니까요.

 

 

   Token Packet부터 자세히 살펴봅시다. Token Packet으로 정의된 PID는 OUT / IN / SOF /SETUP 총 4가지 입니다.

 

USB에서 데이터의 이동 방향을 나타내는 OUT은 Host -> Device를 의미하고 IN은 Device -> Host를 의미합니다. 그리고

 

SOF는 Start of frame의 약어인데 USB2.0 표준문서의 205 Page를 보시면 다음과 같이 나와있습니다.

 

Full-speed devices that have no particular need for bus timing information may ignore the SOF packet.

(버스 타이밍 정보가 필요하지 않는 Full-speed devices는 SOF packet을 무시할 수 있습니다.)

 

따라서 SOF는 무시하도록 하며, 마지막으로 Setup은 Host가 Device의 사이의 Pipe를 Setup하기 위한 Token Packet입니다.

 

 

   Data Packet은 말 그대로 Data 전송용 Packet입니다. Data packet으로 정의된 PID는 DATA0 / DATA1 / DATA2 / MDATA

 

입니다. DATA2와 MDATA는 High-speed에 사용되므로 필요하지 않으며 DATA0 / DATA1만 Full-speed DATA 전송에

 

핍요합니다. DATA2와 MDATA는 그렇다치더라도 DATA0와 DATA1이 왜 필요한지 의문점이 드느데요. 그 이유는 연속된

 

데이터를 보낼 때 데이터의 유효성을 확보하기 위해 Synchronization하기 때문입니다. 데이터 Synchronization은 트렌시버와

 

리시버가 PID를 토글하는 것으로 이루어집니다. Receiver는 데이터를 받을 수 있는 상태이고 data PID가 정확할 때만 PID를

 

토글하고 Tranceiver는 유효한 ACK Handshake를 받았을 때에만 PID<0>를 토글하는 것이죠. 그러니깐 연속 데이터를 보낼때

 

PID의 첫 번째 비트가 계속 토글되어야 합니다. 즉, DATA0 <-> DATA1가 교대로 전송되어야 하는 것입니다.

 

 

   Handshake Packet딱 1 byte 입니다. PID만 보내면 되는데 이것도 종류가 4가지 있습니다. ACK / NAK / STALL /

 

NYET입니다. ACK와 NAK는 다들 아시겠지만 긍정과 부정입니다. 데이터를 잘 받았으면 ACK, 못받거나 에러가 있으면 NAK를

 

전송하는 것이죠. STALL은 지연을 뜻하는데요. Device의 Endpoint가 Halt되어 있거나 Control Pipe 요청을 지원하지 않는

 

경우를 나타냅니다. NYET은 위에도 설명되어 있듯이 아직 응답이 없는 상태를 나타내는 것인데 디바이스가 응답을 안하는

 

것이므로 디바이스의 것이 아닙니다. 허브에서 사용됩니다. 당연히 High-speed 전용이므로 신경을 끕시다.

 

 

   어떠신가요? 어려우신가요? 저는 대략적으로 머리속에 그림이 그려지기 시작합니다. 내일은 USB를 통해 데이터가 왔다

 

갔다하는 과정을 한개씩 한개씩 나열해 볼텐데요. 그리고나면 더 선명하게 알 수 있으리라 기대합니다. 그리고 시간이 되면

 

USB에 필요한 구조체와 함수를 정의해 보려고 합니다.

 

 

   추가로 말씀드로고 싶은 것은 저는 지금 현재 USB에 관련되어 미리 작성된 어떤 레퍼런스 코드도 보고 있지 않으며 오로지

 

표준 문서와 데이터 시트에만 의존하여 프로그래밍을 하려고 합니다. 왜 이런 수고스런 과정을 거치냐고 하시는 분들이 있을지

 

모르겠습니다만 프로토콜 뿐만 아니라 모든 기술은 발전합니다. 어떤 기술이 새로 나왔을 때, 여러분들은 누군가가 레퍼런스

 

코드를 작성하기를 기다리실 건가요? ^^ 여러분들은 이미 대답을 알고 계십니다. 엔지니어 여러분들 모두 힘내시고 혹시

 

제 글에 오류나 의문점이 있으시면 주저마시고 글을 남겨 주시면 감사하겠습니다.

 

   내일 또 만나요~  - Dwarp -

저작자 표시
신고

'Protocol' 카테고리의 다른 글

USB.04  (4) 2012.10.10
USB.03  (0) 2012.10.05
USB.02  (0) 2012.10.04
USB.01  (2) 2012.09.28
DMX-3  (1) 2012.09.10
DMX512-2  (0) 2012.08.31

USB.01

Protocol 2012.09.28 11:28 Posted by Dwarp

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
USB.01  (2) 2012.09.28
DMX-3  (1) 2012.09.10
DMX512-2  (0) 2012.08.31
DMX512  (0) 2012.08.29