왜 필요한가

현재 개발하고 있는 STB 가 나중에는 대량생산 방식으로 옮겨지게 되면, 지금의 일일이 사람의 손으로 땜질을 하는 방법은 더 이상 불가능하다.
예를 들어 10 대를 만드는 데, 1 대가 불량이라고 한다면, 10 만대를 만든다면, 만대가 불량이라는 뜻이 된다. 나중에는 생산 공장에서 기계가 자동으로 납땜을 하기 때문에, 그 중에서 어떤 것이 불량이고, 정상인지를 판별해낼 수 있는 어떤 특정한 테스트 루틴이 필요하다.
테스트 루틴은

  1. 초기에 알아낼 수록
  2. 간단하게 알아낼 수록
  3. 빠르게 알아낼 수록

좋다. 지난 번 회의를 통해, 대강의 테스트 루틴의 순서를 정했다. 각 단계마다의 구체적인 테스트 방법등은 차후에 논의될 것이다.

대강의 테스트 루틴

순서 테스트할 것들 세부 테스트 방법
1 전원, Bore Board PCB 접지 테스트, 5517 주변 회로 조립(저항, Regulator)
2 5517 BGA DCU 를 통한 메세지를 통해, 정상여부를 판단
3 SDRAM, FLASH, EEPROM SMI, EMI, I2C 디바이스 정상여부 판단(각 영역 R/W 테스트)
4 POD GPIO 를 통한 CIS Read 테스트
5 7020 7020 INIT 루틴 수행 테스트
6 DDR DDR 영역 R/W 테스트
7 AV 조립 내부 스트림을 이용해서 AV 출력 테스트
8 NIM 튜너 튜너 OK? 3125 OK? LOCK 여부?

각 세부적인 테스트 루틴

가장 먼저, 테스터기를 이용해서 접지 테스트를 하고 난 후에 5517 관련 저항와 칩을 납땜한다.

PCB 에 5517 만 BGA 된 상태에서 DCU 를 이용해서 소스프로그램을 실행시켜본다. 기본적으로 .cfg 파일안에 5517 의 특정 주소를 W/R 하는 루틴이 있기 때문에 메세지를 보면서 테스트가 가능하다.

Setup5517
 
proc setup_clock_gen
Clock_gen setup procedure for programmed PLL mode...
Device has booted in DEFAULT mode.
Switching back to X1 mode
Programming FS PLL with 540 MHz
C200  = 180 MHz
SMI   = 135 MHz
SMI/2 = 67 MHz
SMI/4 = 33 MHz
Audio = 54 MHz
COMMS = 54 MHz
STBUS = 90 MHz
FLASH = 90 MHz
SDRAM = 90 MHz
transitioning
CLOCKGEN Successfully setup
 
EMIpokes5517
5517 ok!!

위의 루틴까지 수행이 되었다면, 5517 은 정상이라고 판단한다.

위의 디바이스들은 모두 메모리이기 때문에, 테스트는 R/W 로 해볼 수 있다.
SDRAM 의 경우, DCU 초기화 루틴에 포함되어 있기 때문에 따로 특별히 추가해줄 필요는 없다.
아래는 config/sti5516sd.cfg 파일에 추가한 모습이다.

w_value = 0
r_value = 0
ok_value = 0
 
while(w_value < 0x00001000 ){
 
poke (0xC0300000 + (w_value)) 1 -d
## peek (0xC0300000 + (w_value)) -q
r_value = peek (0xC0500000 + (w_value)) -d -q
 
 
if(1 == r_value){
}else{
ok_value = 1
}
 
if(w_value == 0x00000100){write 8%}
if(w_value == 0x00000200){write 16%}
if(w_value == 0x00000300){write 24%}
if(w_value == 0x00000400){write 32%}
if(w_value == 0x00000500){write 40%}
if(w_value == 0x00000600){write 48%}
if(w_value == 0x00000700){write 56%}
if(w_value == 0x00000900){write 64%}
if(w_value == 0x00000a00){write 72%}
if(w_value == 0x00000b00){write 80%}
if(w_value == 0x00000c00){write 88%}
if(w_value == 0x00000d00){write 96%}
 
w_value++;
} 
 
if(ok_value == 0){
write SDRAM TEST OK!!
}else{
write SDRAM TEST ERROR!!
}
 
#######################################################
 
if ( locked == 1 ) {
  write SDRAM ok!!
}
 
if ( locked == 0 ) {
  write SMI SDRAM init has failed
}
 
 
 
}

FLASH 의 경우는, 특정 주소를 R/W 해서 Chip ID 와 제조회사 ID 를 체크하는 루틴을 추가했다.

void ciApiReadFlash()
{
    U16 *pRegisterAdd1,*pRegisterAdd2,*pRegisterAdd3,*pRegisterAdd4;
    U16 regVal1,regVal2,regVal3,regVal4;
    U16 regVal32_1,regVal32_2,regVal32_3,regVal32_4;
    U16 *pRegisterAdd32_1, *pRegisterAdd32_2,*pRegisterAdd32_3,*pRegisterAdd32_4;
 
    U16    *InitAddr08;
    U16    *InitAddr16,      *pRegisterAdd32_5;
 
           InitAddr08    = (U16*)(0x7fe00000) + 0x00000555	;  //address
           *InitAddr08   = 0xAA & 0xff;   //data
 
                  /* Cycle 2 - CodeSd cycle 2 */
                   InitAddr08    = (U16*)(0x7fe00000) + 0x000002AA;
                  *InitAddr08   = 0x55 & 0xff;
                    /* Cycle 3 - Auto Select Command */
                  InitAddr08    = (U16*)(0x7fe00000) + 0x00000555;
                 *InitAddr08   = 0x90 & 0xff;
 
            pRegisterAdd32_1 = (U16*)(0x7fe00000+0x00000000);  
	   regVal32_1 = *pRegisterAdd32_1;
 
    pRegisterAdd32_2 = (U16*)(0x7fe00000+0x00000001);  
 
   regVal32_2 = *pRegisterAdd32_2;
   pRegisterAdd32_3 = (U16*)(0x7fe00000+0x00000002);
   regVal32_3 = *pRegisterAdd32_3;
 
 regVal32_4 = *pRegisterAdd32_4;
 
if((regVal32_1 == 0x20) && (regVal32_3 ==  0x22C4))
{
	printf("\nflash ok!!\n");
}else{
	printf("\nflash error!!\n");
}
}

EEPROM 은 특정주소에 지정된 값을 R/W 해서 일치하는지 확인하는 루틴을 추가했다.

void Test()
{
	U8 data[66],data2[66],*data3,i,j,o,ops[3];
	U32 pos;
	U32 uWritePos=0,uSize,uWriteLen;
	U8 ok_val=0;
 
	U8 datax[20]={"oooooiiiiieeeeewwwww"};
 
	data[0]='a';
	data[1]='b';
	data[2]='c';
	data[3]='d';
	data[4]='e';
	data[5]='f';
	data[6]='y';
	data[7]='6';
	data[8]='i';
	data[9]='j';
	data[10]='8';
	data[11]='7';
 
	ops[0]=0;
	ops[1]=0;
	ops[2]=0;
 
//	STI2C_Write( h24C32, (U8 *)data, 2, STI2C_TIMEOUT_INFINITY, &uWriteLen);
//WaitMicroseconds(10000);
 
//	memset(data,'q',66);
 
	i=0;
 
	o=10;
 
	writeEprom(0,0,data,20);
 
 
//		writeEprom(EEPROM,i*o,data,o);
//
		readEprom(EEPROM,0,data2,10);
		pos=i*o;
		printf("Adress : %d \n",pos);	
 
		printf("Read data : ");
 
		for(j=0;j<o;j++)
			{
			if(data[j] == data2[j])
				{
		//	printf("%c ",data2[j]);	
			ok_val++;
			continue;
				}else{
			break;
					}
			}
 
if(ok_val == 10)
{
	printf("\neeprom ok!!\n");
}else{
	printf("\neeprom error!!\n");
}
		printf("\n");		
 
 
}

아래는 위의 실행결과 정상이라고 판단될 때의 출력이다.

EMIpokes5517
5517 ok!!
alt settings
Testing Phase & lock
0xffff1234
0x56781234
0x12345678
SDRAM locked on phase 2
SDRAM ok!!
Sucess open eprom
Adress : 0
Read data :
eeprom ok!!
 
timerTask start~~~~
 
flash ok!!

문제점

SDRAM 을 R/W 하는 데, 엑세스 하는 방법에 따라서 결과가 다르다. 두가지 방법으로 가능한데,

  1. 한번에 전 영역을 Write 하고 난 후에 Read 하는 방법
  2. 한 번지를 Write 하고, Read 하는 방법

이 있다. 속도면을 봤을 때는 첫번째 방법이 낫다. 하지만, 문제는 위의 두가지 엑세스 결과가 다르다는 것이다. 몇가지 실험결과, 첫번째 방법은 예상대로 실행되지 않았다.

예를 들어 0 - 10 번지 주소에 5 를 Write 하고 나서, 순차적으로 읽어보면 가장 마지막에 Write 한 10 번지의 값만 제대로 나오고 다른 번지의 값들은 제대로 나오지 않았다.

두 번째 방법의 경우에는 예상대로 제대로 동작했다. 하지만, 실행속도가 너무 느렸다.

  • computer/digitalarena/테스트_루틴_계획.txt
  • Last modified: 3 years ago
  • by likewind