앞의 문서 POD 와 7020 의 공존하기 에 이어지는 내용으로 구성되어 있다. POD 만 실행되어진다면, 별문제가 없겠지만 7020 과 함께 실행되어지기 때문에 불가피하게 기존의 POD 프로그램의 수정이 필요하다.
들어가기에 앞서
기존의 POD Physical 프로그램은 3 개의 태스크를 Create 해서 실행되는 형태였다. 하지만, 여러가지 오류 루틴(잘못된 PCMCIA 카드 삽입시)에 적절히 대응하지 못하는 관계로 태스크를 Init 하는 방법으로 수정했다. 또한 오류 루틴이 실행될 때마다, 기존의 태스크를 Kill → Delete → Init 하는 방법으로 재시작한다.
다시한번 언급하지만, 'POD 와 7020 의 공존하기' 에서 표시한 내용을 수정했다는 가정하에 설명하도록 하겠다.
발생된 문제
앞의 문서대로 세팅했지만, 몇가지 문제들이 발생했다. POD 를 꼽고, Buffernego 를 하면 A/V 가 끊기는 현상이 나타났다. 또한 얼마 못가서 뻗어버렸다. 또, POD 를 수행도중에 빼면 시스템이 뻗어버리는 문제가 발생했다. 그리고, POD 가 아닌 일반 PCMCIA 카드를 넣고나서, 다른 카드를 넣으면 인식이 안되고 시스템이 뻗어버리는 문제가 발생했다.
해결 방법
앞에서 제기된 문제점들을 하나씩 해결해보자!!
POD 카드 삽입시 A/V 가 끊기고, 나중에는 뻗어버리는 문제
처음에는 SMPS 를 의심했었다. 하지만 문제는 다른 곳에 있었다. 일반적인 POD 동작의 경우 초기화가 되면, 스트림의 경로를 TS1 에서 TS2 로 변경한다. 이유는 튜너에서 5517 로 바로 가는 것이 아니라 POD 를 중간에 거쳐간다는 것이다. 이러한 경우는 CA 를 테스트할 필요한 동작이다.
하지만 현재 실험환경에서는 CA 테스트는 불가능하다.(※ POD 에 CA 카드가 없다!) 그래서 현재 POD 프로그램에서 TS 경로를 바꾸는 루틴을 주석처리해 줄 필요가 있다. 현재 소스에서는 POD 를 초기화 할 때와 빠질 때, 이 루틴이 수행된다.
if( !ciApiCisAnalysis() ) { return( 0 ); } // ciApiReadCis(); //ciApiReadFlash(); //-----------------------------------------------CiMAX transfer to POD Interface // REG8(0x70000000)=0x41; //ciApiVppOn(); //TsInputChange(TRUE); ---->>> 이 부분을 주석처리!! task_delay(156*5); ciApiPersonalityChange(); --->>> 함수 안에 ciApiGpioClean_zero(POD_EN); 역시 주석처리한다!! //ciApiReadCis(); return( 1 ); }
void reset_mode() { // TsInputChange(FALSE); ------->>> 이 부분을 주석처리!! // ciApiGpioWrite_zero(POD_EN); // ts out off --------->>> 주석처리!! *((U32*)(0x20010000+0x28)) = 0x21803F; *((U32*)(0x202001c0)) = 0x04000E99; // oe : read and write bank3 *((U32*)(0x20200200)) = 0x04000E99; //oe : reaed and write bank4 }
두 부분을 주석처리 했더니, POD 를 넣어도 A/V 가 끊기지 않았다.
수행도중에 POD 를 빼면 시스템이 뻗는 문제
이 문제의 경우 같은 소스코드를 SD 보드에 돌리면 발생하지 않았다. 역시 문제는 7020 이다.
7020 과 연동해서 수행될 경우, 항상 'CONFIG_CONTROL_E' 레지스터의 'EMI_ADDRESS_EXPANSION' 를 반드시 1 로 세팅해야 한다.
POD 가 빠질때 실행되는 reset_mode() 함수를 아래와 같이 수정한다.
void reset_mode() { // TsInputChange(FALSE); // ciApiGpioWrite_zero(POD_EN); // ts out off *((U32*)(0x20010000+0x28)) = 0x21803F; ---->>> 값을 다음과 같이 수정!! *((U32*)(0x202001c0)) = 0x04000E99; // oe : read and write bank3 *((U32*)(0x20200200)) = 0x04000E99; //oe : reaed and write bank4 }
수정후에 POD 가 중간에 빠져나와도, 시스템이 뻗지 않았다.
일반 PCMCIA 카드 삽입시 시스템 뻗는 문제
이 문제는 앞의 ②번 문제와 같은 원인이었다. POD 가 아닌 다른 일반의 PCMCIA 카드를 넣었을 경우, 기존의 태스크를 재시작하도록 되어 있다.
이때, reset_mode() 함수가 실행되는 데, 역시 레지스터 세팅이 잘못되어서 시스템이 뻗어버리는 문제였다.
FLASH HEX 파일 생성시
initfunc.c 파일을 아래와 같이 수정해주어야 제대로 된 동작을 보장받을 수 있다.
void EMIpokes5514(void) { volatile int config_E_val; #ifdef M58LW032 /* ## Reconfigure bank 3 top address (0x70000000-0x7f7 */ /* ## Reconfigure bank 4 top address (0x7f800000-0x7fbfffff) */ STSYS_WriteRegDev32(0x202ff830,0xfd); STSYS_WriteRegDev32(0x202ff830,0xFD); STSYS_WriteRegDev32(0x202ff840,0xFE); #endif /* ## Bank 0 ## configured for 32Mb sdram (non-subdecoded) */ /* ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /* ## Parameters:-strobeonfalling 0 -busreleasetime 3 -subbanks 1 -subbanksize 256 -shiftamount 9 -portsize 16 */ /* ## -rasbits 0x1fffc -prechargetime 3 -modesetdelay 3 -refreshtime 9 -activatetoread 3 */ /* ## -activatetowrite 3 -caslatency 3 -drambanks 1 -writerecoverytime 2 -sdrammodereg 0x32 */ /* ## -latencymode 3 -bursttype 0 -burstlength 2 */ /* ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ STSYS_WriteRegDev32(0x20200100,0x00004352); STSYS_WriteRegDev32(0x20200108,0x000FFFFC); STSYS_WriteRegDev32(0x20200110,0x00000020); STSYS_WriteRegDev32(0x20200118,0x00010929); -------------->>> 수정할 것!! /* Bank 1 ## STEM0. Configured as 16-bit peripheral */ /* ## Original STEM config edited out by MGB 9/4/02 */ STSYS_WriteRegDev32(0x20200140,0x002006f1); STSYS_WriteRegDev32(0x20200148,0x1f200044); STSYS_WriteRegDev32(0x20200150,0x1f220000); STSYS_WriteRegDev32(0x20200158,0x0000000a); /* ## Bank 2 - STEM1 Configured as 16-bit peripheral */ STSYS_WriteRegDev32(0x20200180,0x001116f1); STSYS_WriteRegDev32(0x20200188,0x06210000); STSYS_WriteRegDev32(0x20200190,0x06210000); STSYS_WriteRegDev32(0x20200198,0x0000000a); /* ## !!! Note - Commented out. These are extra safe slow timings for debug only !!! */ /* ## Bank 3 - ATAPI/DVB-CI. Configured as 16-bit peripheral */ /* ## Amended by AL 30/4/02 for ATA Register mode 0 timings */ /* STSYS_WriteRegDev32(0x202001c0,0x010f8791); */ /* STSYS_WriteRegDev32(0x202001c8,0xbe028f21); */ /* STSYS_WriteRegDev32(0x202001d0,0xbe028f22); */ /* STSYS_WriteRegDev32(0x202001d8,0x0000000a); */ /* ## !!! Note - These are faster timings to support up to PIO mode 4. !!! */ /* ## Bank 3 - ATAPI/DVB-CI. Configured as 16-bit peripheral */ /* ## Amended by AL 17/5/02 for ATA PIO mode 4 timings */ STSYS_WriteRegDev32(0x202001c0,0x04000e99); -------------->>> 전체 수정할 것!! STSYS_WriteRegDev32(0x202001c8,0x1800d500); STSYS_WriteRegDev32(0x202001d0,0x1774c400); STSYS_WriteRegDev32(0x202001d8,0x00000040); /* ## Bank 4 - Configured as 16-bit flash normal */ STSYS_WriteRegDev32(0x20200200,0x04000f99); -------------->>> 전체 수정할 것!! STSYS_WriteRegDev32(0x20200208,0x1800d500); STSYS_WriteRegDev32(0x20200210,0x1774c400); STSYS_WriteRegDev32(0x20200218,0x00000040); /* ## Bank 5 - Configured as 16-bit flash normal */ STSYS_WriteRegDev32(0x20200240,0x00000e91); STSYS_WriteRegDev32(0x20200248,0x10004000); STSYS_WriteRegDev32(0x20200250,0x10220000); STSYS_WriteRegDev32(0x20200258,0x00000040); /* PS:24/06/03 Old Bank 5 version taken out */ /* STSYS_WriteRegDev32(0x20200240,0x001016f1); */ /* STSYS_WriteRegDev32(0x20200248,0x9d200000); */ /* STSYS_WriteRegDev32(0x20200250,0x9d220000); */ /* STSYS_WriteRegDev32(0x20200258,0x00000000); */ /* ## EMI4.LOCK */ STSYS_WriteRegDev32(0x20200020,0x00000000); /* Set bit 17 of GenConfig E for dvb logic enable. Use RmW type operation. */ /* Set Bank 5 subbank size to 64Mbit */ /* 주석처리 시작!!! config_E_val = STSYS_ReadRegDev32(0x20010028); config_E_val |= EMI_CONFIG_VAL; STSYS_WriteRegDev32(0x20010028, config_E_val); */ 여기까지 주석처리!!! STSYS_WriteRegDev32(0x20200028,0x000007c1); STSYS_WriteRegDev32(0x20200038,0x00320032); STSYS_WriteRegDev32(0x20200048,0x00000fff); STSYS_WriteRegDev32(0x20200050,0x00000000); STSYS_WriteRegDev32(0x20200058,0x00000000); STSYS_WriteRegDev32(0x20200060,0x00000000); STSYS_WriteRegDev32(0x20200068,0x00000001); /* ## EMI4.SDRAMINIT */ STSYS_WriteRegDev32(0x20200040,0x00000001); }
ARENA_Print 출력하기
기존의 DACS1000 에서 사용하던 src/pod, src/si 디렉토리를 그대로 포팅해서 했다. POD 의 application_info 정보를 보기위해서는 ARENA_Print 함수가 실행되어 출력되어야 볼 수 있다. 그런데 ARENA_Print 함수가 실행되지 않았다. 문제는 ARENA_Print 가 define 문으로 막혀 있는 것이다. include/arena_inc/arenaDefine.h 파일에서 아래의 구문의 주석을 풀어주면 된다.
#define ARENA_Print(x) printf x
주의 할 점
현재 10 월 12 일 현재, 기존의 DAC5000 에서 TA5000K 로 프로그램 이름이 바뀌었다. 또한 컴파일 환경변수도 바뀌게 되었는데, 반드시 Makefile 을 확인해야 한다.
예를 들면, TA5000K 를 컴파일을 하려고 gmake 를 실행했는 데, DAC5000 소스가 컴파일 되는 수가 있다.