Don't think! Just do it!

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

임베디드 소프트웨어/Protocol

USB.02

방피터 2012. 10. 4. 12:08

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