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 신호가 된다. 매우 중요한 부분이기 때문에 확실히 잘 따라가야 한다.

  1. 244 의 경우, 총 3 개를 쓰고 있는 데, 모두 POD_EN 이 연결되어 있다. 이 신호를 High 로 만들면, 244 게이트를 모두 High 임피던스로 만든다.
  2. 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);
  1. 245 의 경우, CARD_EN 에 연결되어 있는 데 Low 신호를 내보내면, B → A 로 내보낸다.
  2. 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 값을 읽었다.

  • computer/digitalarena/pod_physical_수행_동작의_이해.txt
  • Last modified: 3 years ago
  • by likewind