HPNX 로 확인해본 결과, 제대로 나오는 것이었다. 각각의 다른 POD 마다 가장 처음 나오는 튜플이 달랐다. 전혀 이상한 것이 아니었다. 또한 호스트가 인식하는 것은 Config 튜플이었기 때문에, 앞에야 어찌되었던 중요한 값만 제대로 나오면 되는 것이었다.
POLL_TASK 의 카드가 들어왔을 때 메세지 큐를 보내는 부분에서 TASK_DELAY 를 156*3 만큼 주지 않으면, 버퍼 네고에서 리셋이 되어 버린다. 이유는 정확히 모르겠다.
우선 그만큼의 시간을 주었다.
→ '이 문제는 윗단에서의 Link Layer 에서의 문제였다. 또한 Cis read 를 체크하는 Printf 문 때문에, 시간이 길어져서 타임아웃이 되버리는 것이었다.'
버퍼 네고 후에 POD 카드를 뺐을 때 POD_EN 이 닫혀야 한다. High 로 올리는 함수를 Ts_Change 함수 다음에 추가했다.
문제는 중간에 버퍼 네고나 CIS READ 시에 리셋이나 CI_END 함수가 호출되어야 한다.
그때 바로 해주어야 하는 것이 바로, 현재 DVB_CI 모드의 호스트를 예전 Attribute 모드로 바꾸어 주어야 한다는 점이다.
바로 아래의 루틴을 아래와 같이 수정해 준다.
/* =========================================================================
Required Function Decription
========================================================================= */
void ciEnd( U8 ciEndCause )
{
TsInputChange(FALSE);
ciApiGpioWrite_zero(POD_EN); // ts out off
if(kill == 1)
{
podAppClose(); //pys_edit --- POD application close
//-----------------------------------------------POD lower layer task close
podLayerClose();
}
kill = 0;
switch( ciEndCause )
{
case CI_EVENT_CDINTERRUPT: // 카드가 빠졌을 때
case CI_PCMCIA_RESET_EVENT: // PCMCIA 카드가 리셋되었을 때
{
ciStatusFlag = 0;
reset_mode();
// ciApiHWinit();
}
break;
case CI_POD_RESET_EVENT: // POD 가 리셋 되었을 때
{
;
}
break;
}
clearTimer((void(*)())sendToResetTask);
}
이번에는 가장 중요한 함수라고 할 수 있는 reset_mode() 함수를 살펴보자!!
void reset_mode()
{
TsInputChange(FALSE); // TS2 를 TS1 으로 바꾼다.
ciApiGpioWrite_zero(POD_EN); // TS_OUT 을 닫는다.
*((U32*)(0x20010000+0x28)) = 0x1803F; // 어트리뷰트 모드로 세팅
*((U32*)(0x202001c0)) = 0x04000E99; // oe : read and write bank3
*((U32*)(0x20200200)) = 0x04000E99; //oe : reaed and write bank4
}
156 으로 되어 있는 값을 정의 되어 있는 값으로 수정했다.