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


찾기
제목 Control Transfer에서 Data Stage를 활용한 데이터 전송 0  추천하기
작성자 글쓴이 작성일 2014-10-29 16:22:33 조회수 359
   
   

바로 전 강좌에 업데이트한 unifull_driver_v1.1에 버그가 발견되어,

unifull_driver_v1.2로 새로 업데이트시켜 놓았으니

진작에 업데이트 해버린 행자들은 얼렁 돌아가서 새로 업데이트 하시라. -.-;;;

 

오늘 해볼 내용은 Data Stage를 활용한 데이터 전송이다.

이전까지는 Setup Stage의 Data packet에만 데이터를 실어 보내려다 보니

한번에 보낼 수 있는 데이터의 크기가 8 Byte로 제한 되었었다.

그 중에 사실상 우리가 이용할 수 있는 것은 5 Byte뿐이 안된다.

( bRequest(1), wValue(2), wIndex(2) : “Setup Data 활용하기”의 중간부분 표 참조 )

 

한번에 5 Byte밖에 보내지 못한다 하면 200% 부족하지 않은가?

따라서 Control Transfer에서 Data Stage를 활용해서 한번에 많은(?) 데이터를 보내 보자.

이 때 왔다리 갔다리 하는 패킷들을 살펴보면 다음과 같다.

 

어플리케이션 입장에서는 어떻게 추가된 Data Stage에 데이터를 실어 보내는고 하니,

Unifullusr.h에 선언되어 있는 CONTROL_REQUST 구조체에

 

①번에는 Data packet에 실어 보낼 데이터의 크기를 넣어주고

②번에는 그 데이터가 들어있는 버퍼의 주소를 적어 준 후에

 

bRet = DeviceIoControl( hFile,

            IOCTL_UNIFULL_DATA_DISPLAY,

            pstCtlRequest,  // 입력버퍼의 시작번지

            ulBufferSize,   // 입력버퍼의 크기

            NULL,       // 출력버퍼의 시작번지

            0,      // 출력버퍼의 크기

            &dwBytesReturned,

            NULL );

요렇게 CONTROL_REQUST 구조체의

주소 ( pstCtlRequest ) 와

크기 ( CONTROL_REQUST 구조체 크기 + Data Packet에 실어 보낼 데이터 버퍼의 크기 ) 를

인자(parameter)로 해서 DeviceIoControl을 호출해 주면 된다.

 

실제 구현은 어플리케이션의 UniFullDlg.cpp의 OnButtonDataDisplaySend() 함수에 있으니 참조하시라.

여러 가지 예외처리 코드가 섞여있어서 복잡하게 보이지만 골격은 위에 설명한 것처럼 간단하다.

 

 

이 어플리케이션 예제에서는

두 자리 16진수 숫자들을 입력 받아서 이를 1 Byte 데이터들로 변환한 뒤

이를 UniFull보드로 전송해서

이 데이터대로 UniFull보드의 Port B에 연결된 LED들을 깜빡이게 만드는 것이다.

깜빡임의 간격은 wValue( CONTROL_REQUST 구조체의 필드 )에 지정해 주면 된다.

 

 

UniFull 보드에는 다음과 같은 외부회로를 꾸며주시라.

 

 

펌웨어를 잠깐 살펴보자.

isr.c의 ep0_rxdone() 함수에서

주황색으로 표시된 부분이 Default Control Transfer에서 Data Stage가 딸린 경우에 분기하는 곳이고,

( 이 앞부분에서는 Setup Stage의 Data Packet을 읽고 처리하는 일을 한다. )

녹색으로 표시된 곳이 Data Stage의 Data Packet이 도착할 때마다 이곳으로 분기하는 곳이다.

이 부분은 D12 펌웨어의 Framework의 일부이므로 우리가 건드릴 필요가 없지만,

그냥 적어본다. -.-;;;

 

위의 설명은 사족이고,

간단하게 unifull 펌웨어를 설명하자면

어플리케이션에서 IOCTL_UNIFULL_DATA_DISPLAY 를 날리면

펌웨어에서는

Setup Stage의 data는 DeviceRequest라는 구조체 변수에 담아 놓고,

Data Stage의 data는 dataBuffer라는 행렬 변수에 담아

unifull.c의 data_display() 함수를 호출하는 것이다.

 

그 데이터를 가지고 지지고 볶는 일은

main 함수의 while loop안에서 하고 있다.

뭐 별거 있나?

타이머를 이용해서 딜레이를 주고, dataBuffer변수에 저장된 데이터들을 하나씩 꺼내와서

LED로 표시하는 게 전부다.

댓글달기 회원에게만 댓글 작성 권한이 있습니다. 회원가입하여 정보공유를 하면 좋겠습니다.
첨부파일
답변
  스팸신고 스팸해제
글쓰기
 
이전글 UniFull 펌웨어 소스 정정 및 드라이버 업데이트
다음글 Endpoint 0를 통해 디바이스에서 데이터 가져오기
 
 
| 회사소개 | 이용약관 | 개인정보취급방침 | 이용안내
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