컨텐츠 바로가기


board

기획전

이전다음  멈춤재생

고객 상담 안내

  • tel031-429-0845
  • fax031-429-0847
  • time09:00 ~ 18:00

현재 위치

  1. 게시판
  2. 강좌-USB기타

강좌-USB기타

USB및 기타자료입니다.

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

이전 까지는 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의 일부이니 내부적 동작은 우리가 신경 쓸 바는 아니다.

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

 


첨부파일
비밀번호 삭제하려면 비밀번호를 입력하세요.

목록

삭제 수정 답변

댓글 수정

비밀번호

수정 취소

/ byte

댓글 입력

이름 비밀번호 관리자답변보기

확인

/ byte


* 왼쪽의 문자를 공백없이 입력하세요.(대소문자구분)

회원에게만 댓글 작성 권한이 있습니다.