왜 필요한가
현재 개발하고 있는 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 번지의 값만 제대로 나오고 다른 번지의 값들은 제대로 나오지 않았다.
두 번째 방법의 경우에는 예상대로 제대로 동작했다. 하지만, 실행속도가 너무 느렸다.