로그인 | 회원가입
   이용안내    장바구니    주문조회    마이쇼핑    게시판
상품검색 검색 
아이디  
비밀번호
보안접속 보안접속
회원가입
  아이디찾기
  비밀번호찾기
상품목록
  ARM
  PIC
  AVR
  DSP
  MAXQ
  MSP430
  OTHER
게시판
공지사항
자유게시판
강좌-USB기타
자료실
샘플 기획전
전화: 031-429-0845
팩스: 031-477-1407
운영시간
  09:00 ~ 18:00
 
현재위치: > 게시판 > 강좌-USB기타
강좌-USB기타
USB및 기타자료입니다.


찾기
제목 isr.c 2편 0  추천하기
작성자 글쓴이 작성일 2014-10-29 16:22:33 조회수 384
   
   오늘은 isr.c의 ep0_rxdone() 함수와 ep0_txdone() 함수가 어떤 동작을 하는지 대충 살펴보자.

이 부분을 설명하는 이유는 Endpoint 0를 이용한 USB 통신이

어떤 방식으로 이루어지는지 살펴보기 위해서 이다.

이 함수들은 어떤 USB 장치를 만들든지 간에 수정해야 할 일이 없기 때문에

코드를 따라가면서까지 자세히 설명하지는 않겠다.

 

 

호스트가 Endpoint 0 ( Default Control Endpoint )를 통해 디바이스에게 어떤 명령을 내릴 때

그 명령은 기본적으로 세 개의 Stage로 나뉘어서 전송된다.

바로

SETUP Stage,

DATA Stage,

STATUS Stage

이다.

 

이중에 DATA Stage는 있을 수도 있고 없을 수도 있다.

즉, 호스트가 보내는 명령에 따라

SETUP - STATUS 요런 형식이 될 수도 있고,

SETUP - DATA – STATUS 이런 형식이 될 수도 있다.

 

DATA Stage는 전송할 데이터의 크기에 따라 하나 이상이 될 수도 있다.

그리고 그 전송 방향이 IN 또는 OUT이 될 수도 있다.

예를 들자면

SETUP - STATUS

SETUP - DATA(OUT) – STATUS

SETUP - DATA(OUT) -… -DATA(OUT) - STATUS

SETUP - DATA(IN) - STATUS

SETUP - DATA(IN) -… -DATA(IN) - STATUS

요런 형식들로 전송이 가능하다는 말쌈이닷.

 

맨 마지막 STATUS Stage에서는

실제로 의미있는 데이터가 전송되지는 않고,

단지 호스트와 디바이스 사이의 handshake를 위한 것이다.

( 정확히 이야기 하자면 SETUP – (DATA –) STATUS를 포함하는 “전체적인” Control Transfer에 대해

디바이스가 호스트에게 “알아들었다 오바!”(ACK) 또는 “나 지금 바뻐. 좀 있다 얘기하자”(NAK)

라는 의사표시를 할 기회를 제공하기 위한 Stage이다. )

 

SETUP Stage에는 전송 프로토콜을 위한 overhead를 제외하면

실제로는 8 Byte의 의미 있는 데이터가

호스트 → 디바이스로 전송되는데,

이 8 Byte 만으로 내리고자 하는 명령을 다 담을 수 있다면

앞에서 설명한 대로 SETUP – STATUS stage 만으로

Control Transfer가 이루어 진다.

 

이 8 Byte의 데이터는 관습적으로(?) 2 Byte씩 나뉘어서 이름이 붙여 졌는데,

각각 첫 번째 Word 부터( 2 Byte 니까) Request, Value, Index, Length 라고 부른다.

unifull.h에 보면 이 8 Byte의 데이터를 담기 위해 다음과 같은 구조체가 선언되어 있는 것을 볼 수 있다.

typedef struct _DEVICE_REQUEST

{

    unsigned char bmRequestType;

    unsigned char bRequest;

    unsigned short wValue;

    unsigned short wIndex;

    unsigned short wLength;

} DEVICE_REQUEST;

이 구조체에서는 첫 Word 즉 “Request”를 더 세분화 해서 RequestType과 Request로 나눠 놓았다.

 

 

만약 SETUP Stage의 8 Byte 만으로는 디바이스로 명령을 다 내려 보낼 수가 없다면

DATA Stage를 활용하면 된다.

이때 Data Stage의 길이는 SETUP Stage의 Length Field에 주어진다.

 

그리고 디바이스에 주어지는 명령이 호스트로 어떤 데이터를 전송해야 하는 명령이라면

이때도 DATA Stage에 데이터를 실어 보내면 된다.

물론 Data Stage의 방향은 위와는 반대로 IN이 될 것이다.

 

 

ep0_rxdone()을 살펴보면

①의 경우가 SETUP Stage의 Packet이 수신되었을 때 이를 처리할 Code이고,

②의 경우가 DATA Stage가 도착했을 때를 위한 Code이고,

③이 STATUS Stage를 위한 코드이다.

 

ep0_txdone()는

Endpoint 0를 통해 호스트가 디바이스에게 어떤 데이터를 요구했을 때

DATA Stage에 이 데이터를 실어 보내게 되는데,

하나의 DATA Stage를 다 보냈을 때 D12는 인터럽트를 발생시키고 결국 이 ep0_txdone()함수로 들어온다.

 

①의 경우가 전송할 데이터가 아직 더 있을 때,

②의 경우가 하나의 DATA Stage만 더 보내면 전송할 데이터를 다 보낼 수 있을 때,

③이 STATUS Stage를 위한 코드이다.

 

 

이제 avr.c와 isr.c에 대한 설명이 다 끝났다.

 

main.c는 isr.c를 설명하면서 조금 언급했으므로 행자들이 각자 살펴보기 바란다.

특별히 이해하기 어려운 부분은 없을 것이라 생각된다.

 

그리고 d12ci.c와 chap_9.c에 대해서는 따로 설명하지 않겠다.

이 행자들이 USB 장치를 만들면서 이 두 파일을 건드릴 일은 아마 없을 것이다.

본좌도 8051을 위해 작성된 소스를 AVR로 포팅 할 때 외에는 크게 눈여겨 살펴보지 않았었다.

 

USB 프로토콜에 대해 설명하고 싶은 부분이 더 있지만

이제까지 소스코드 설명한 것처럼 파일 잡고 하나하나 자세히 설명하기에는

그 양이 너무 많아서 행자들 머리 속도 뒤죽박죽 복잡해 질 것 같고,

진도도 너무 늘어질 것 같아서 이만 접기로 하겠다.

 

본좌가 설명을 안 한 부분은 Hardware Specific 한 부분이거나

행자들이 건드릴 필요가 없는 부분이므로

더 깊이 공부할 행자들은 스스로 공부하면서 Q&A 게시판을 이용하고,

그럴 생각 없는 나른한 행자들은 본좌의 강좌를 그대로 따라오기 바란다.

 

댓글달기 회원에게만 댓글 작성 권한이 있습니다. 회원가입하여 정보공유를 하면 좋겠습니다.
첨부파일
답변
  스팸신고 스팸해제
글쓰기
 
다음글 USB 디바이스와 통신하기 위한 어플리케이션 작성 1/2
 
 
| 회사소개 | 이용약관 | 개인정보취급방침 | 이용안내
Copyright ⓒ 2010 KitKorea All rights reserved.
전화 : 031-429-0845 FAX : 031-477-1407
Contact open@kitkorea.com for more information.
법인명(상호):인터전자 주식회사 주소:14120 경기도 안양시 동안구 흥안대로 112-1 (호계동)
사업자 등록번호 안내 [138-81-28277] / 통신판매업 신고 제 안양 1753호 [사업자정보확인]
개인정보보호책임자 :홍성호(open@kitkorea.com) / 대표자(성명):홍성호
cafe24