7710 에서(cut2.1 & cut3.1) 튜너의 튜닝문제에 대한 문제점 및 해결방안에 대해서 정리했다.
현재 7710 cut3.1 까지는 LG tunner(모델명 : TDVS-H061P 2004.12.23) 를 사용한다. 이 튜너는 HDT HD 보드에도 동일하게 사용하고 있다.
문제점
기존의 DAC5000 에서 사용했던 H/W Debugging 프로그램을 DACS7000 용으로 포팅해서 테스트 했다. 아래는 처음에 특정 주소에 값을 쓴 뒤에 값을 읽어서 제대로 동작하는지 테스트하는 루틴이다.
void i2cTunerInit ( void ) { U8 temp8, temp9,temp10,temp11; //2004.01.08 STI2C_OpenParams_t OpenParams; U8 TunerB[6]=0; TunerB[0]=44 ; TunerB[1]=144; TunerB[2]=134; TunerB[3]=4; printf("\nLG VSB TUNNER TEST START\n"); //SCL1,SDA1 OpenParams.I2cAddress = SS_MT2111_TUNER; OpenParams.AddressType = STI2C_ADDRESS_7_BITS; OpenParams.BusAccessTimeOut = 100000; STI2C_Open(I2C_DeviceName[I2C_3125_SC0], &OpenParams, &SS_MT2111_Handle); OpenParams.I2cAddress = SS_OOB_DOWN_TUNER; OpenParams.AddressType = STI2C_ADDRESS_7_BITS; OpenParams.BusAccessTimeOut = 100000; STI2C_Open(I2C_DeviceName[I2C_3125_SC0], &OpenParams, &SS_OOB_DOWN_Handle); //lgtuner OpenParams.I2cAddress = tunerAddr; OpenParams.AddressType = STI2C_ADDRESS_7_BITS; OpenParams.BusAccessTimeOut = 100000; STI2C_Open(I2C_DeviceName[I2C_3125_SC0], &OpenParams, &LGtuner_Handle); //lgt3302 OpenParams.I2cAddress = chipAddr; OpenParams.AddressType = STI2C_ADDRESS_7_BITS; OpenParams.BusAccessTimeOut = 100000; STI2C_Open(I2C_DeviceName[I2C_3125_SC0], &OpenParams, &LGDT3303I2C_chip_Handle); writeOneByteforQAM(chipAddr, 0x00, 0xaa); readOneByteforQAM(chipAddr,0x00, &temp8); printf("\nfirst_value == 0x%X", temp8); writeOneByteforQAM(chipAddr, 0x0d, 0xbb); readOneByteforQAM(chipAddr,0x0d, &temp9); printf("\nfirst_value == 0x%X", temp9); writeMoreByteforQAM(tunerAddr, TunerB[0], &TunerB[1], 3); readOneByteforQAM(tunerAddr, 0xc2, &temp10); printf("\nfirst_value == 0x%X", temp10); if(temp8 == 0x03 && temp9 == 0x40 && temp10 == 0x7a) { printf("\nLG VSB TUNER [OK]\n"); }else { printf("\nLG VSB TUNER [FAIL]\n"); } }
테스트 결과, 모두 0x0 값이 나오거나, 전혀 엉뚱한 값이 나왔다. 또한 튜너에서 튜닝되어 나가는 신호('VSBIN_DATA') 를 찍어봐도, 신호가 나오지 않았다.
해결 방안
해결은 간단했다. 기존의 HDT HD 회로에서 7710 으로 바뀌면서 GPIO 핀인 VSB_RESET 의 위치가 바뀌었다. 또한 위의 테스트 루틴을 하기 전에 H/W RESET 을 수행하지 않고 바로 R/W 를 하기 때문에 처음 값은 0x0 이 나왔다. 리셋하는 루틴을 넣고 수행했더니, 제대로 된 값이 R/W 되었고 'VSBIN_DATA' 핀에서 신호가 나왔다.
수정해야 할 부분은 아래와 같다.
src/tuner/lgtunerDlg.c
void VSB_Tuner_Reset() //PIO 5_1 { ST_ErrorCode_t Err=ST_NO_ERROR; STPIO_OpenParams_t OpenParams; STPIO_Handle_t HandlePIO; OpenParams.ReservedBits = PIO_BIT_5; OpenParams.BitConfigure[5] = STPIO_BIT_OUTPUT; OpenParams.IntHandler = NULL; STPIO_Open(PIO_DeviceName[2], &OpenParams, &HandlePIO);//init = PIO[0-6], opened PIO = PIO_DEVICE_3 STPIO_Clear(HandlePIO, PIO_BIT_5); task_delay(78); STPIO_Set(HandlePIO, PIO_BIT_5); task_delay(78); STPIO_Clear(HandlePIO, PIO_BIT_5); task_delay(78); STPIO_Set(HandlePIO, PIO_BIT_5); STPIO_Close(HandlePIO); }
src/system/main.c
// tuner test start!! printf("\n ===== NIM Test Mode Start=====\n"); // Init_Tuner(); // nimInit (); VSB_Tuner_Reset(); // 추가할 것!! i2cTunerInit(); task_delay(TICKS_SECOND); OnRun(579000000, 4); //initEprom(); // nimRtn = nimTuneFATfreq(3, 579000000, 4, 500);//SBS:579M,KBS2:585M,KBS1:573M,MBC:597M printf("\n ===== Tunning Result(Digital Channel) = %d =====\n", nimRtn);