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


찾기
제목 Endpoint 0를 통해 디바이스에서 데이터 가져오기 0  추천하기
작성자 글쓴이 작성일 2014-10-29 16:22:33 조회수 437
   
   

이전 까지는 Endpoint 0를 통해 호스트에서 디바이스로 데이터를 내려 보내는 연습을 해보았다.

이번에는 Endpoint 0를 통해 디바이스에서 데이터를 가져오는 연습을 해 보자.

전 강좌에서는 Data Phase를 이용해 디바이스로 데이터를 전송했는데,

이번엔 Data Phase를 이용해 호스트로 데이터를 전송한다.

즉, Data Phase의 방향이 반대이다.

 

예제에서는

어플리케이션에서 Setup Phase에 두 개의 숫자를 실어 보내면

디바이스에서 그 두 숫자를 곱해 그 결과를 어플리케이션으로 리턴 하도록 만들었다.

 

사실 Endpoint 0를 통해 디바이스에서 데이터를 가져오는 것은

우리가 다루는 펌웨어 Framework에 좋은 예가 있다.

바로 chap_9c에 있는 함수들 중에 get_...()이라는 이름이 붙은 함수들이 그 예들이다.

이 함수들은 장치가 USB포트에 처음 꽂혀졌을 때, (즉, Enumeration과정 중에)

호스트가 디바이스에게 필요한 정보를 얻기 위해 디바이스에게 보내는 명령들이다.

( 물론 그 때 이외에도 호스트는 필요한 경우 그 명령들을 디바이스에게 보낼 수 있다. )

 

바로 이 get_...() 함수들이

호스트에서 Setup Phase의 Data Packet에 “Get Descriptor” 같은 명령을 실어 보내면

디바이스에서 Data Phase의 Data packet에 호스트에서 원하는 디스크립터를 실어 보내는

좋은 예이다.

 

 

어플리케이션을 살펴보면

두 Edit 박스에 숫자를 입력하고 “Calculate”버튼을 누르면

UniFullDlg.cpp의 OnButtonMultiply() 함수로 분기해 들어온다.

 

이 함수 안에서는 CONTROL_REQUST 구조체의

usValue와 usIndex 필드에 두 개의 숫자를 저장하여

DeviceIoControl를 호출하면 된다.

 

저번까지의 예제와는 다르게 이번엔 결과를 리턴 받아야 하므로

DeviceIoControl함수를 호출할 때 리턴 받을 결과를 저장할 버퍼를 지정해 주어야 한다.

구체적으로는 다섯 번째와 여섯 번째 인자에 각각 미리 할당해 놓은 버퍼의 주소와, 버퍼 크기를 명시해 놓아야 한다.

DeviceIoControl에 대해서는  MSDN을 참조하시라.

 

 

펌웨어에서는

multiply() 함수에서 어플리케이션에서 보낸 두 개의 숫자를

DeviceRequest 구조체 변수에서 꺼내서 이를 곱하여

그 결과를 dataBuffer라는 버퍼에 넣고

single_transmit( 버퍼주소, 데이터 크기 )를 써서 호스트로 날린다.

( 결과를 꼭 dataBuffer에 저장할 필요는 없다. 그냥 편의상 이미 있는 버퍼를 썼을 뿐이다.)

 

이번 경우엔 보낼 데이터의 크기가 EP0_PACKET_SIZE( 16 )보다 작아서

single_transmit() 함수를 이용했지만,

데이터의 크기가 클 때에는 code_transmit() 함수를 이용해 데이터를 날려야 한다.

( chap_9c에 있는 함수들 중에 get_descriptor()에 그 사용 예가 있다.  )

그 함수의 동작은 single_transmit()과 다르지만 사용법은 동일한다.

두 함수 다 FrameWork의 일부이니 내부적 동작은 우리가 신경 쓸 바는 아니다.

다만 보낼 데이터의 크기에 타라 두 개의 함수 중 하나를 골라 써야 한다는 사실만 기억하자.

 


댓글달기 회원에게만 댓글 작성 권한이 있습니다. 회원가입하여 정보공유를 하면 좋겠습니다.
첨부파일
답변
  스팸신고 스팸해제
글쓰기
 
이전글 Control Transfer에서 Data Stage를 활용한 데이터 전송
다음글 USB 프로토콜과 PDIUSBD12 맛보기
 
 
| 회사소개 | 이용약관 | 개인정보취급방침 | 이용안내
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