UniHigh v1.0 테스트
UniHigh을 포트에 꼽고 EZ-USB Control Panel을 실행시킨 후,
“Get Pipes” 버튼을 눌러주면 다음과 같이 리스트 박스에 파이프( Endpoint ) 정보가 뜬다.


Pipe를 “0 : Endpoint 2 OUT”으로 선택하고,
“Hex xxx”에 “0 1 2 3 4 5 6 7 8 9”를 입력한 후 ( 따옴표는 제외 )
Bulk/Int 버튼을 눌러보자.
그러면 Endpoint 2로 위의 숫자 배열이 전송될 것이다.

계속해서
“1 2 3 4 5 6 7 8 9”,
“2 3 4 5 6 7 8 9”,
“3 4 5 6 7 8 9”을 전송해 보자.

여기까지는 아무 문제 없이 전송이 될 것이다.

그러나 한번 더
“4 5 6 7 8 9”를 전송하면,
잠깐 동안 Control Panel이 응답이 없다가
먼젓번과는 다르게 “Write IOCTL passed”라는 메시지가 안 나올 것이다.

왜 그럴까?
Bulkloop 펌웨어 프로젝트를 열어서 bulkloop.c의 TD_Poll()을 다시 보자.
바로

if(!(EP2468STAT & bmEP6FULL))

여기서 걸려서 if 문 안으로 들어가지 못하기 때문에
이전 네 번의 transfer와는 달리 아무 동작도 하지 않는다.

EP2의 버퍼에는 펌웨어가 처리해야 할 데이터 “4 5 6 7 8 9”가 도착 했는데,
EP6의 버퍼는 꽉 차버려서
EP2BCL = 0x80; // re(arm) EP2OUT
를 호출하지 못하고 계속 TD_Poll()을 헛도는 것이다.
바꿔 말하면
호스트는 데이터를 보냈는데 디바이스로부터 ACK를 받지 못하고 있는 상태이다.
헉! ACK가 뭐냥? 하시는 행자들은 뒤쪽으로 빽 하셔서 요기를 보시라.

계속해서
Pipe를 “2 : Endpoint 6 IN”으로 선택하고,
Length에 “10”을 입력한 후, Bulk/Int 버튼을 눌러보자.

위와 같이 IN transaction이 일어나자 마자 ( IN 버퍼에 쓸 자리가 생기므로 )
Pending되어 있던 OUT transaction이 완료되는 것을 볼 수 있을 것이다.

이제
Pipe를 “2 : Endpoint 6 IN”를 유지한 상태에서,
Length에 “9”을 입력한 후, Bulk/Int 버튼을 누르면
당근 성공적으로 IN transcation이 일어날 것이다.

그러나 우리는 9 대신에 8을 입력한 후, Bulk/Int 버튼을 누질러 보자.
“Read IOCTL failed
시스템에 부착된 장치가 작동하지 않습니다.”
라는 메시지가 뜰 것이다.

다시 9를 입력한 후, Bulk/Int 버튼을 누질러 보자.
성공적으로
“Read IOCTL passed
0000 01 02 03 04 05 06 07 08 09”
라는 메시지가 출력될 것이다.

무슨 일이 일어난 걸까?
FX2의 EP6 버퍼에는 나가기를 기다리고 있는 9 byte의 데이터가 있는데,
호스트에서 8 byte를 요청하면
FX2는 8 byte를 보내는 것이 아니라, 뭔가 에러가 있음을 호스트에 알린다.
그래서
“Read IOCTL failed
시스템에 부착된 장치가 작동하지 않습니다.”
라는 메시지가 뜬 것이다.

계속 해서 9를 입력한 후, Bulk/Int 버튼을 누질러 보자.
버튼을 한번 더 누르자.
이번에는 두 번 다 성공적으로 IN transaction이 일어난다.
EP6 버퍼에 남아 있는 데이터는 각각 8, 7 byte였는데,
호스트에서 9byte를 요구하여도 자기가 가지고 있는 데이터만큼만을 주고서
Transaction을 끝낸다.

정리하면 FX2는
전송할 데이터보다 작은 데이터를 호스트가 요구하면 에러를 리턴하고,
큰 데이터를 요구하면 가지고 있는 데이터 만큼만 주고 Transaction을 성공적으로 마무리한다.

요기까지가 쓸데 없는 사설 이었다.
하지만 이 쓸데 없는 사설이 여러 행자덜이 스스로 디바이스를 개발하면서
언젠가는 부딪치게 될 문제가 될 것이다.


오늘은 Default Control Endpoint를 통해 디바이스에 명령을 주는 연습을 해 보자.
본좌가 Bulkloop예제를 변형하여
UniHigh v1.0 펌웨어 소스를 만들어 아래에 첨부하니
다운받아서 C:CypressUSBExamplesFX2폴더에 풀어 넣기 바란다.
UniHigh1.0.zip

자세한 설명은 내일로 넘기기로 하고,
오늘은 예제를 작동시키는 법을 설명한다.
행자들은 bulkloop예제와 달라진 점이 뭔지 한번 살펴보기 바란다.
(desc.a51파일과 bulkloop.c파일을 주로 건드렸고.
프로젝트 폴더에 UniHigh.h 파일을 새로 포함시켰다.)


UniHigh v1.0 펌웨어는
Default Control Endpoint로 Vender Request “0xD0”와 “0xD1”을 받아들인다.
(Dir는 "0 OUT"으로 하고, Hex~~~는 비워라.)


전자는 PortA.7에 연결된 LED를 켜라는 명령이고,
후자는 끄라는 명령이다.
“Download” 버튼을 이용해서 펌웨어를 UniHigh 보드로 다운로드 한 후
LED를 키고 꺼 보자.

회로는 아래와 같다.

(이 회로는 잘못된 회로도이다. http://muosys.egloos.com/96567를 참조하시라)




by 바람처럼날다 | 2005/04/19 22:36 | FX2 펌웨어 강좌 | 트랙백 | 핑백(1) | 덧글(3)
트랙백 주소 : http://muosys.egloos.com/tb/91449
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Linked at UniHigh 2.0 펌웨어,.. at 2008/04/01 00:55

... 이전 강좌</a>의 펌웨어 예제 UniHigh v1.0을 본좌가 만든 WDM USB 드라이버인 unihigh.sys를 써서 우리가 만들 어플리케이션에서 동작시키는 연습을 해 보자. 우선 기존의 펌웨어 예제를 살짝 바꿔주어야 한다.바꿀 부분은 디바이스 디스크립터의 Vendor ID와 Product ID이다.USB 디바이스가 포트에 꽂히면 운영체제(USB 호스트)는 디바이스 디스크립터 중에 Vendor ID와 Product ID를 읽어, 그에 해당하는 드라 ... more

Commented by 김산 at 2005/04/20 15:56
강좌 잘보고 있습니다. ^^
제가 가지고있던 USB보드가 있어 칩을 확인해보니 UniHigh와 같은 CY7C68013-56PVC 이더군요.
기쁜마음으로 PC에 연결을하고 보드만든회사에서 제공하는 드랑이버로 드라이버를 잡았습니다.
그리곤 USB Control Panel을 실행하니 Device를 못검색하더라구요.
그래서 기존의 드라이버를 지우고 C:CypressUSBDriversezusbdrvlibi386free에 있는
ezusb.sys로 드라이버를 잡았습니다. Control Panel에서 Device를 잘 잡았습니다.
강좌의 내용대로 FX2/bulkloop/bulkloop.hex를 다운로드를하고
"Get Dev","Get Pipes"를 했는데

Pipe : 0 Type : BLK Endpoint : 2 IN MaxPktSize : 0x400으로 나옵니다.
파이프가 왜 하나도 없는건지 모르겠습니다. ㅜ.ㅜ
Commented by 바람처럼날다 at 2005/04/20 16:20
Pipe : 0 Type : BLK Endpoint : 2 IN MaxPktSize : 0x400
맞게 받아 적으신 건가요? 맞다면
1. 파이프가 하나 잡히네요. 0번 파이프.
2. 지금 잡히는 장치는 bulkloop가 아닙니다.
(bulkloop의 Endpoint 2 Descriptor를 보면 MaxPacketSize는 512byte로 되어 있죠. 물론 파이프 갯수도 4고.)
-> EEPROM을 빼고 다시 해보시죠
Commented by 김산 at 2005/04/20 17:54
ㅎㅎ E2PROM을 끼우고 해서 문제였습니다.
빼고하니깐 잘됩니다.
고맙습니다. ^^

:         :

:

비공개 덧글

< 이전페이지 다음페이지 >