====== POD Physical 수행 동작의 이해 ====== 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 값을 읽었다. ---- {{indexmenu>:#1|skipns=/^(wiki|etc|diary|playground)$/ skipfile=/^(todays|about|guestbook)$/ nsort rsort}} ----