Bulkloop 네번째 - TD_Init() 완전정복
진도 나가기 전에 행자들에게 확인하고 싶은 게 있다.
Cypress에서 Development Kit을 다운받아 설치할 때,
같이 설치한 Keil Compiler를 가지고 우리가 지금 보고 있는
Bulkloop 예제가 컴파일 되는지 함 확인해 보시라.

같이 깔린 Trial Version Keil Compiler는
컴파일 가능한 코드의 용량에 제한이 있는 것으로 알고 있는데,
본좌는 Trial 버전으로 컴파일을 안 해봐서 되는지 안 되는지 잘 모르겠다.
만약 컴파일이 안 된다면,
어떡하냐고 본좌에게 물어도 소용없다.
본좌 해줄 말이 없으니,


가만히 눈을 들어 저 어둠 속을 조용히 응시할 수 밖에…


오늘은 Endpoint Config Register들이 어떻게 세팅되느냐를 먼저 살펴보자.
우선 Endpoint 1
EP1OUTCFG = 0xA0;
EP1INCFG = 0xA0;
T.R.M을 뒤적여 보면(Page 15-26 )
Endpoint 1을 Bulk 타입의 엔드포인트로 쓰겠다.
라고 세팅한 것을 알 수 있다.

옛날 옛적 한 옛날에 우리가 desc.a51파일의 Endpoint Descriptor를 뒤비고 있을 때,
엔드포인트 디스크립터를 살짜쿵 들여다 봤었다.
분명 거기에는 Endpoint 1에 대한 Descriptor가 없었다.
(Endpoint 2, 4, 6, 8 Desc. 만 있었다.)
어찌된 걸까?

이 예제를 쓴 넘이 돌았었나 보다. @.@
하나 확실한 것은 Endpoint Config Register에다가 VALID bit을 천만번 세팅하더라도
Endpoint Descriptor에 해당 디스크립터가 없다면
호스트는 결코 그 Endpoint로 데이터를 보내거나, 받지 않을 거라는 거다.

우리가 여기서 알고 넘어가야 할 것은
FX2의 Endpoint 1은 IN 버퍼와 OUT버퍼가 분리되어 있다는 것과
이 버퍼들은 오직 FX2의 8051 코어에서만 접근할 수 있다는 것이다.
Endpoint 0 ( Default Control Endpoint )는 양방향 버퍼를 가지고,
나머지 Endpoint( 2, 4, 6, 8)의 버퍼들은 외부에서 접근할 수 있는
단 방향 버퍼를 쓴다는 것이 다르다.
밑줄 쫙 치고 외울 필요는 없다.
펌웨어를 짜다 보면 저절로 체득 될 것이다.

EPxCFG ( x = 2, 4, 6, 8 )의 나머지 bit들은 행자들이 보면
열나 쉽게 알 수 있을 것이고,
본좌는 bit 3과 bit1:0만 설명하고 넘어가고자 한다.

( Page 1-23의 )
요 그림이 Endpoint Buffer가 어떻게 세팅될 수 있는지 보여주는 그림이닷.
앞으로 행자들이 뭘 좀 해볼려고 하면
이 그림부터 들여다보고 시작해야 할 꺼시다.
그러니 지금 모니터가 뚫어지도록 보아주자.

본좌는 EP2만 예로 들어 설명한다.
왼짝부터 오른짝으로 EP2가 어찌 설정되는 거인지 자근자근 보면…
Buffer size 512 byte, Double buffering
Buffer size 512 byte, Quad buffering
Buffer size 1024 byte, Double buffering
Buffer size 512 byte, Triple buffering
Buffer size 1024 byte, Triple buffering
Buffer size 1024 byte, Quad buffering
요러케 가지가지로 세팅할 수 있다.
맘에 드는 걸로 골라 잡으시라.

Buffering depth가 깊을수록, bursty Traffic에 효율적으로 대응할 수 있을 것이고,
버퍼 사이즈가 클수록 한번에 보낼 수 있는 데이터 양이 늘어날 것이다.
버뜨, 과유불급이라.
벌크모드로 전송하면서 1024 byte 사이즈의 버퍼를 사용할 필요는 없을 것이다.
왜냐면 High Speed USB에서 Bulk Mode의 최대 패킷 사이즈는 512byte이기 때문이다.
Bulk Mode에서 1024 byte 사이즈의 버퍼를 사용해도 상관은 없지만서두.
512 byte의 데이터가 채워지고 남는 521byte의 공간은
고스란히 낭비될 거시다.
그러고 싶은거야? 그런거야?


고 다음 코드

SYNCDELAY;
EP2BCL = 0x80;
SYNCDELAY;
EP2BCL = 0x80;
SYNCDELAY;
EP4BCL = 0x80;
SYNCDELAY;
EP4BCL = 0x80;

EP2BCL에 아무 숫자나( 0x80 ) 두 번 써주고,
EP4BCL에 아무 숫자나( 0x80 ) 또 두 번 써주고 있다.

왠지 낯이 익지 않나?
Bingo!.

















몇 회 전에 봤던 거시다.
IN Endpoint의 버퍼를 장전하기 위한 코드가 되겠다.
바로 앞에서
EP2와 EP4가 Double Buffering을 사용한다고 세팅한 것은 다 아시겠고,
따라서 각각 두 개의 버퍼쌍을 가지므로
(EPxBCL = 0x80; ) X 2
해준 거시다.

만약 Quad Buffering을 사용한다면
당근빠따 (EPxBCL = 0x80; ) X 4 해죠야 한다.

왜 초기화 루틴에서 이딴짓을 해 주냐 하면
그냥.






물론 안 해줘도 된다.
대신 뒷감당은 행자들이 해 줘라. ㅋㅋㅋ

AUTOPTRSETUP |= 0x01;
T.R.M.Page 15-8에 가서 휙 둘러보고 오시라.
따로 설명은 안 하겠다.
Autopointer를 사용할 때 Side effect에 대한 것도 잘 읽어보고 말이다.
by 바람처럼날다 | 2005/04/14 23:54 | FX2 펌웨어 강좌 | 트랙백 | 핑백(1) | 덧글(1)
트랙백 주소 : http://muosys.egloos.com/tb/81469
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Linked at Bulk Endpoint로 데.. at 2008/03/31 23:32

... http://muosys.egloos.com/81469</a>를 참조하시라. TD_Poll()의 마지막에 추가한 if문은 이전에 Bulkloop를 분석할 때 본 거를 쬐끔 변형한 것이므로 생각이 안 나면 http://muosys.egloos.com/75316를 다시 함 보시든지, 병원 가서 치매 치료를 받아보시라. 소스 설명은 끝이고…아래의 회로를 꾸미시라.Host에서 날라오는 데이터 대로 LED가 점등되도록 함 해보자. 어떻게 테스트를 하냐 하면 펌 ... more

Commented by 감사~ㅋ at 2009/06/26 15:38
EP2CFG = 0xA2;
SYNCDELAY;
EP4CFG = 0xA0;
SYNCDELAY;
EP6CFG = 0xE2;
SYNCDELAY;
EP8CFG = 0xE0;
보면 EP2는 double buffer인데 EP4는 quad buffer 되는거 아닌가요?ㅠ

:         :

:

비공개 덧글

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