테스트 루틴 계획
왜 필요한가
현재 개발하고 있는 STB 가 나중에는 대량생산 방식으로 옮겨지게 되면, 지금의 일일이 사람의 손으로 땜질을 하는 방법은 더 이상 불가능하다.
예를 들어 10 대를 만드는 데, 1 대가 불량이라고 한다면, 10 만대를 만든다면, 만대가 불량이라는 뜻이 된다. 나중에는 생산 공장에서 기계가 자동으로 납땜을 하기 때문에, 그 중에서 어떤 것이 불량이고, 정상인지를 판별해낼 수 있는 어떤 특정한 테스트 루틴이 필요하다.
테스트 루틴은
- 초기에 알아낼 수록
- 간단하게 알아낼 수록
- 빠르게 알아낼 수록
좋다. 지난 번 회의를 통해, 대강의 테스트 루틴의 순서를 정했다. 각 단계마다의 구체적인 테스트 방법등은 차후에 논의될 것이다.
대강의 테스트 루틴
| 순서 | 테스트할 것들 | 세부 테스트 방법 |
| 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 여부? |
각 세부적인 테스트 루틴
전원, Bore Board
가장 먼저, 테스터기를 이용해서 접지 테스트를 하고 난 후에 5517 관련 저항와 칩을 납땜한다.
5517 BGA
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 은 정상이라고 판단한다.
SDRAM, FLASH, EEPROM
위의 디바이스들은 모두 메모리이기 때문에, 테스트는 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!!
POD
문제점
SDRAM R/W 문제
SDRAM 을 R/W 하는 데, 엑세스 하는 방법에 따라서 결과가 다르다. 두가지 방법으로 가능한데,
- 한번에 전 영역을 Write 하고 난 후에 Read 하는 방법
- 한 번지를 Write 하고, Read 하는 방법
이 있다. 속도면을 봤을 때는 첫번째 방법이 낫다. 하지만, 문제는 위의 두가지 엑세스 결과가 다르다는 것이다. 몇가지 실험결과, 첫번째 방법은 예상대로 실행되지 않았다.
예를 들어 0 - 10 번지 주소에 5 를 Write 하고 나서, 순차적으로 읽어보면 가장 마지막에 Write 한 10 번지의 값만 제대로 나오고 다른 번지의 값들은 제대로 나오지 않았다.
두 번째 방법의 경우에는 예상대로 제대로 동작했다. 하지만, 실행속도가 너무 느렸다.