티스토리 뷰

출처 : http://muosys.egloos.com/196351

 

오늘은 Bulk Out Endpoint를 통해 호스트로부터 데이터를 디바이스로 전송하는 것을 연습해 볼 차례이다.

Bulk Endpoint로 데이터 날리기를 참조하여 회로를 꾸미고, 아래의 소스들을 다운로드 받아 설치하자.
참고적으로 다가 얘기하자면 이미 구성되어 있는 회로(Port A.7의 LED, Port A.6의 버튼 )는 떼어내지 말고, 그대로 두고서 Port B에 8개의 LED를 추가로 설치하길 바란다.

Array

UniHigh Firmware v2.5
UniHigh Application v2.5
data.bin <- 전송할 데이터를 담고 있는 파일(이전의 파일과 동일한 파일)

만약 버튼(Port A.6)을 떼어내고 실험하고자 한다면, 펌웨어의 TD_Poll()함수에서 다음의 부분을 주석처리 해줘야 한다.
if(PA6 == 1 && !bButtonMask)

이전 강좌들과 마찬가지로 펌웨어는 unihigh.sys 드라이버와 붙도록 VID, PID만 바꾼 것이다.

UniHigh Application v2.5를 살펴보면 Bulk Out transfer를 위해 버튼 두 개와 에디트 박스 하나를 리소스에 추가 했다.

“File Select” 버튼은 디바이스로 전송할 파일을 선택 하기 위한 대화상자를 열기 위한 버튼이며, 눌렸을 때는 OnButtonSelectFile() 멤버함수가 호출된다.

에디트 박스는 선택된 파일의 경로와 이름을 나타내기 위한 것이며,

“Transfer” 버튼은 앞서 “File Select” 버튼에 의해 선택된 파일을 디바이스로 전송하기 위한 버튼이다.
이 버튼이 눌리면 OnButtonBulkOutTranfer() 멤버함수가 호출된다.
우리가 중점적으로 들여다 보아야 할 곳이 바로 여기다.

이전에는 디바이스와 통신하기 위해 DeviceIoControl을 사용했는데,
여기서는 WriteFile을 사용하고 있다.

hFile = OpenFile( BULKOUT_PIPE );
if( INVALID_HANDLE_VALUE != hFile )
{
    bRet = WriteFile( hFile, pcBuffer, m_dwTransferLength, &dwBytesReturned, NULL );
    CloseHandle( hFile );
}

OpenFile(CreateFile())로 디바이스의 핸들을 얻고, WriteFile로 디바이스로 데이터를 전송하며, CloseFile로 핸들을 반환한다.

DeviceIoControl이 WriteFile로 바뀐 것 밖에 없다.

앞서 강의에서도 언급했듯이 보통 DeviceIoControl은 적은 양의 데이터를 읽거나 쓸 때, 특히 한번에 읽고 쓰려고 할 때 사용되고, ReadFile, WriteFile은 많은 양의 데이터를 한 방향으로 전송할 때 사용된다.

일반적으로 그렇게들 쓴다는 얘기이고, 어떤 함수를 언제 어떻게 사용하느냐는 어플리케이션 개발자와 WDM 드라이버 개발자가 상의해서 정하기 나름이다.

이제 그만.

Array