POD 의 Physical 구체적인 수행 동작에 대해서 최대한 자세하게 기술하였다.
GPIO 동작 이해
POD 는 특히 초기 부분은 모두 GPIO 로 이루어져 있다고 봐도 무방하다.
총 10 개 내외의 GPIO 핀들이 어떻게 동작하는지 이해한다면, POD 를 이해할 수 있다.
POD 루틴에서 가장 먼저 수행되는 것이 바로 GPIO 핀을 초기화 시키는 부분이다.
가장 먼저 수행하는 것이 ciApiHWinit() 함수이다. 여기서는 각 핀 별로 알아볼 것이다.
POD_EN
각 GPIO 핀을 열고(open) 나서, 가장 먼저 해주는 것이 바로 POD_EN 핀을 High 로 만드는 일이다.
이 핀은 POD 동작의 핵심인 244, 245 게이트를 콘트롤 하는 중요한 역할을 한다.
ciApiGpioWrite_zero(POD_EN);
회로도를 보면 알겠지만, CPU 에서 부터 나오는 신호는 #POD_EN 이다. 그리고 중간에 NOT 게이트를 거쳐 POD_EN 신호가 된다. 매우 중요한 부분이기 때문에 확실히 잘 따라가야 한다.
수행되었을 때의 상황
- 244 의 경우, 총 3 개를 쓰고 있는 데, 모두 POD_EN 이 연결되어 있다. 이 신호를 High 로 만들면, 244 게이트를 모두 High 임피던스로 만든다.
- 255 의 경우, 몇 개만(U1303, U1401) POD_EN 가 연결되어 있다. 신호를 High 로 만들면, U1303 의 경우는 NOT 게이트를 거쳐 들어가기 때문에, Low 신호가 들어간다. U1401 에는 바로 High 가 들어간다. 그래서 U1303 은 A → B 로 나가고, U1401 은 High 임피던스가 된다.
번호 | 상태 |
U1305 | High 임피던스 |
U1306 | High 임피던스 |
U1307 | High 임피던스 |
U1303 | A → B |
U1401 | High 임피던스 |
CARD_EN
이 핀 역시, POD_EN 과 마찬 가지로 245 게이트를 콘트롤 하는 역할을 한다.
ciApiGpioClean_one(CARD_EN);
수행되었을 때의 상황
- 245 의 경우, CARD_EN 에 연결되어 있는 데 Low 신호를 내보내면, B → A 로 내보낸다.
- U1302 는 A → B 를 내보낸다.
번호 | 상태 |
U1302 | A → B |
U1403 | B → A |
U1402 | B → A |
POD_RST
이 핀은 POD 를 리셋하기 위한 핀이다. PCMCIA 를 초기화 하기 위해, High 신호를 내보낸다.
ciApiGpioWrite_rst(POD_RST);
PCMCIA 입장에서는 호스트로 부터의 High → Low 가 되는 시점을 리셋으로 인식한다. 현재는 신호가 계속 High 신호로 되어 있기 때문에 리셋 준비를 하고 있다고 보면 된다.
여기까지가 POD 루틴을 본격적으로 시작하기 위한 준비작업이다.
이제 부터는 각 태스크 별로 어떻게 GPIO 를 어떻게 콘트롤 하는 지 알아보기로 하겠다.
ci_PollTask
여기서는 POD 카드가 삽입되었는지 여부를 무한 루프를 돌면서 체크한다.
cdHigh = pioRead_six();
POD_CARD_CHK 핀을 통해서 값을 읽어들이는 데, 카드를 넣기 전에는 0x40 을 읽지만 카드가 들어가면 0x0 값이 찍힌다.
ci_ReseTask
리셋 태스크는 중간에 에러가 발생했을 때, 에러의 원인을 찾아 리셋해주는 일을 한다. 앞에서 살펴본 ciApiHWinit() 을 다시 실행시킨다.
ci_MainTask
메인 태스크가 실행되었다는 얘기는 POD 카드가 삽입되었다는 가정하에서이다.
가장 먼저 수행되는 것은 POD_VS1_CHK 핀을 읽어들여서 VCC 를 읽어들이는 과정이다.
if( ciApiVS1Check() ) { printf("\nVCC Check Error!! \n"); sendToResetTask(VS1_CHECK); task_suspend(0); }
카드가 빠져 있을 때는 0x10 을 반환했고, 꼽혀 있을 때는 0x0 를 변환했다. 실험결과 POD 는 0x0 를 반환했지만, 다른 PCMCIA 카드의 경우에는 그대로 0x10 을 반환하는 것도 있었다.
VS1Check 가 성공적으로 수행하면, POD 를 리셋 시킨다.
void ciApiPODVccOnReset(void) { ciApiGpioClean_two(POD_VCC_EN); // 이 함수가 실행되므로 해서, MIC2562 를 동작시킨다. task_delay (3*TICKS_100MS); ciApiGpioWrite_rst(POD_RST); task_delay (156); ciApiGpioClean_rst(POD_RST); task_delay (10*156);//CAUTION : wait for pod tool 20021221 }
MIC 2562 데이터 시트를 참고하면 알겠지만, POD_VCC_EN 핀을 LOW 로 내보냄으로서 VPP, VCC 모두 3.3 V 가 출력된다.
그 후에 POD_RST 핀을 High → LOW 로 내보냄으로서 리셋 시킨다.
다음은 READY 신호를 체크할 차례다.
while( ReadySignal ) { ReadySignal = ciApiReadyCheck(); task_delay (2*TICKS_10MS); }
POD_REDAY_CHK 를 체크해서 일정한 시간내에 신호가 오지 않으면, 에러 루틴으로 빠지게끔 되어있다.
ciApiReadyCheck() 실행결과, POD 카드가 없을 때나 있을 때나 모두 0x40 값을 읽었다.