static int nmi_tnr_init(void *pv) { tNmiDrv *pd = &drv; int result = NMI_S_OK; tNmiIn inp; tTnrInit *p = (tTnrInit *)pv; if (!already_init) { nmi_memset((void *)pd, 0, sizeof(tNmiDrv)); /** Asic Init **/ nmi_memset((void *)&inp, 0, sizeof(tNmiIn)); inp.xo = p->xo; inp.ldobypass = p->ldobypass; inp.ai2c = p->i2c_adr; inp.zone = N_ERR|N_INFO; inp.hlp.c.write = nmi_bus_write; inp.hlp.c.read = nmi_bus_read; inp.hlp.c.getreadblksz = nmi_bus_get_read_blksz; inp.hlp.c.getwriteblksz = nmi_bus_get_write_blksz; inp.hlp.delay = nmi_delay; inp.hlp.gettick = nmi_get_tick; inp.hlp.log = nmi_log; inp.init_bus_only = p->init_bus_only; inp.xo_out_en = p->xo_out_en; inp.ltGain = p->ltGain; inp.disableOneKhzShift = p->disableOneKhzShift; nmi_common_init(&inp, &pd->tnr); //nmi_tuner_os_log("nmi_tnr_init 2\n"); //print_32hex(pd->tnr.init); /** initialize chip **/ if (pd->tnr.init() < 0) { //dPrint(N_ERR, "[NMI] Failed to initialize chip...\n"); nmi_tuner_os_log("[NMI] Failed to initialize chip...\n"); result = NMI_E_CHIP_INIT; goto _fail_; } /** Get chip id **/ pd->chipid = pd->tnr.getchipid(); nmi_tuner_os_log("chip id:"); print_32hex(pd->chipid); already_init = 1; } _fail_: return result; }
uint32_t nmi_tuner_os_get_mutex(uint32_t * mutex) { uint32_t ret=FALSE; nmi_tuner_os_log("nmi_tuner_os_get_mutex in %d\n",*mutex); ret = TRUE;//MsOS_ObtainMutex((_s32MutexId[*mutex]),0xFFFFFFFF); nmi_tuner_os_log("nmi_tuner_os_get_mutex out %d %d\n",ret,*mutex); //nmi_tuner_os_delay(2000); return ret; }
uint32_t Nmi_Tuner_Interface_init_chip(tTnrInit* pcfg) { int result; nmi_tuner_os_memset((void *)&gChipNowInfo, 0, sizeof(tNmiInterfaceGlobal)); nmi_tuner_os_chip_power_on(); nmi_tuner_os_chip_enable(); result = nmi_drv_ctl(NMI_DRV_INIT, (void *)pcfg); if(result < 0) { nmi_tuner_os_log(">> NMI_DRV_INIT failed. result = %d\n", result); gChipNowInfo.bInit = FALSE; return FALSE; } //Leo else { uint32_t chipid; tNmiDriverVer ver; nmi_drv_ctl(NMI_DRV_VERSION, &ver); nmi_tuner_os_log("[NMI] driver version (%d.%d.%d.%d) build %d\n", ver.major, ver.minor, ver.rev1, ver.rev2, ver.buildrev); nmi_drv_ctl(NMI_DRV_GET_CHIPID, &chipid); nmi_tuner_os_log("[NMI] Chip ID:"); nmi_tuner_os_log("%4x:",(uint16_t)(chipid>>16)); nmi_tuner_os_log("%4x\n",(uint16_t)((chipid<<16)>>16)); gChipNowInfo.chip_id = chipid; } gChipNowInfo.bSleep = FALSE; gChipNowInfo.bInit = TRUE; gChipNowInfo.btuned = FALSE; gChipNowInfo.jiffies = nmi_tuner_os_get_tick(); if(ISNM120(gChipNowInfo.chip_id))//only 120 { Nmi_Tuner_Interface_LoopThrough(); nmi_tuner_os_log("before nmi_tuner_os_create_task\n"); nmi_tuner_os_create_mutex(&gChipNowInfo.mutex); nmi_tuner_os_create_task((NmiTaskEntry)Nmi_Tuner_Task); } return TRUE; }
int NMI120_GetRSSI(uint8_t outputChoice) { int rssi; rssi = (int)Nmi_Tuner_Interface_GetRSSI(); if (1 == outputChoice) // for percent value { if ((rssi<=0) && (rssi>=-100)) { rssi = ABS(rssi); if(rssi>85) rssi = 0; else if(rssi > 45) rssi = (85-rssi)*100/40; else rssi = 100; } else { if (rssi > 0) { rssi = 100; } if (rssi < -100) { rssi = 0; } } } nmi_tuner_os_log("[NMI]SSI=%d\n",rssi); return rssi; }
MS_U32 MDrv_Tuner_SetTuner(MS_U32 dwFreq, MS_U8 ucBw) { uint8_t type=NMI_DVBT2; /* if(E_TUNE_TYPE_T2 == MDrv_Tuner_GetTuneType()) type = NMI_DVBT2; else type = NMI_DVBT;*/ nmi_tuner_os_log("120 set tuner dwFreq(%d),ucBw(%d)\n",dwFreq,ucBw); return MDrv_NMI120_Tuner_SetTuner(dwFreq,ucBw,type); }
void Nmi_Tuner_Interface_Sleep_Lt(void) { gChipNowInfo.bSleep = TRUE; /*if(ISNM120(gChipNowInfo.chip_id))//only 120 { nmi_tuner_os_delete_task(); nmi_tuner_os_log("nmi_tuner_os_delete_task~~~~~~~~111111111111~~~~~~~\n"); }*/ nmi_tuner_os_log("Nmi_Tuner_Interface_Sleep_Lt ~~~~~~~~~~~~\n"); nmi_drv_ctl(NMI_DRV_SLEEP_LT, NULL); }
uint8_t nmi_tuner_os_reset_demod(uint32_t freq) { #if 0 extern DEMOD_MS_FE_CARRIER_PARAM _demod_param_120; extern MS_BOOL MDrv_Demod_Restart(DEMOD_MS_FE_CARRIER_PARAM *pParam); _demod_param_120.u32Frequency = (uint32_t)(freq/1000); MDrv_Demod_Restart(&_demod_param_120); nmi_tuner_os_log("nmi_tuner_os_reset_demod,freq\n"); #endif return TRUE; }
uint32_t Nmi_Tuner_Interface_deinit_chip(void) { if(ISNM120(gChipNowInfo.chip_id))//only 120 { nmi_tuner_os_log("Nmi_Tuner_Interface_deinit_chip\n"); nmi_tuner_os_delete_task(); nmi_tuner_os_delete_mutex(&gChipNowInfo.mutex); } nmi_drv_ctl(NMI_DRV_DEINIT, NULL); nmi_tuner_os_chip_power_off(); gChipNowInfo.bSleep = FALSE; gChipNowInfo.bInit = FALSE; gChipNowInfo.btuned = FALSE; return TRUE; }
uint8_t Nmi_Tuner_Interface_Tuning(tNMI_TUNE_PARAM* param) { uint8_t ret; if(!nmi_tuner_os_get_mutex(&gChipNowInfo.mutex)) { nmi_tuner_os_log("Obtain NMI Mutex failed\n"); return FALSE; } gChipNowInfo.bdemodlock = FALSE; ret = Nmi_Tuner_Interface_SelfTune(param); gChipNowInfo.btuned = TRUE; nmi_tuner_os_memcpy((void*)&gChipNowInfo.orgparam,param,sizeof(tNMI_TUNE_PARAM)); nmi_tuner_os_release_mutex(&gChipNowInfo.mutex); return ret; }
static void Nmi_Tuner_Task(void) { while(gChipNowInfo.bInit) { nmi_tuner_os_delay(130);//ms //if(gChipNowInfo.bInit != TRUE) // break; if(TRUE == gChipNowInfo.bSleep) { nmi_tuner_os_log("NMI task break for sleep!!!!\n"); break; } //nmi_tuner_os_log("task work~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); //if(gChipNowInfo.currentparam.tvstd == NMI_DVBT || gChipNowInfo.currentparam.tvstd == NMI_DVBT2) { Nmi_Tuner_Interface_poll(); } } }
uint8_t NMI120_MDrv_Tuner_Init(void) { uint32_t chipid; tTnrInit cfg; uint32_t ret; tTnrLtCtrl lpthru; cfg.ldobypass = 0; cfg.xo = 24; cfg.i2c_adr = 0xce;//0xce; cfg.init_bus_only = 0; cfg.xo_out_en = XO_OUT_EN; cfg.disableOneKhzShift = TRUE;//FALSE for nmi130; TRUE otherwise cfg.ltGain = nLtGainMax; ret = Nmi_Tuner_Interface_init_chip(&cfg); if(ret == FALSE) { return FALSE; } else { chipid = Getchipid(); } lpthru.enable = 0; //ret = nmi_drv_ctl(NMI_DRV_LT_CTRL, &lpthru); if(ret < 0) { nmi_tuner_os_log(">> NMI_DRV_LT_CTRL failed."); } //nmi_drv_ctl(NMI_DRV_WAKE_UP_LT, NULL); //wood, ++, @20120427, must be called if NMI_DRV_SLEEP_LT last time and no power on reset return TRUE; }
uint8_t MDrv_NMI120_Tuner_SetTuner(uint32_t dwFreq, uint8_t ucBw,uint8_t type)//MHZ { tNMI_TUNE_PARAM param; uint8_t ret = FALSE; nmi_tuner_os_memset((void *)¶m, 0x00, sizeof(tNMI_TUNE_PARAM)); param.freq = dwFreq;//hz param.if_freq = 5000000; param.dacsel = nDac2; param.if_freq_invert = FALSE; param.freq_invert = FALSE; param.ucBw = ucBw; param.output = nIf; param.freq_invert = FALSE; param.tvstd = type; //NMI_DVBT; if(param.tvstd == NMI_DVBT || param.tvstd == NMI_DVBT2) nmi_tuner_os_memcpy((void*)¶m.poll_param,&SwrfliArg,sizeof(tNmiSwrfliArg)); if(param.tvstd == NMI_DVBT2) { param.scan_aci[0] = 0x07;//6mhz param.scan_aci[1] = 0x0a;//7mhz param.scan_aci[2] = 0x04;//8mhz param.play_aci[0] = 0x07;//6mhz param.play_aci[1] = 0x0a;//7mhz param.play_aci[2] = 0x04;//8mhz } else if(param.tvstd == NMI_DVBT || param.tvstd == NMI_DVBC) { param.scan_aci[0] = 0x07;//6mhz param.scan_aci[1] = 0x0a;//7mhz param.scan_aci[2] = 0x04;//8mhz param.play_aci[0] = 0x07;//6mhz param.play_aci[1] = 0x0a;//7mhz param.play_aci[2] = 0x04;//8mhz } else { param.scan_aci[0] = 0x01;//6mhz param.scan_aci[1] = 0x03;//7mhz param.scan_aci[2] = 0x05;//8mhz param.play_aci[0] = 0x01;//6mhz param.play_aci[1] = 0x03;//7mhz param.play_aci[2] = 0x05;//8mhz } nmi_tuner_os_log("tune: rf=%d, if=%d, bw=%d, tvstd=%d\n", param.freq, param.if_freq, param.ucBw, param.tvstd); ret = Nmi_Tuner_Interface_Tuning(¶m); Nmi_Tuner_Interface_Wreg(0x35,0x18);//0x18 ~ 0x10, 0x5f~ 0x50 Nmi_Tuner_Interface_Wreg(0x164,0x400); if((param.freq >666000000-1500000) &&(param.freq <666000000+1500000)) { Nmi_Tuner_Interface_Wreg(0x05,0x5); } return ret; }
static bool_t Nmi_Tuner_Interface_poll(void) { static uint32_t lockdelay = 0; static uint32_t nmi_times=0; static uint8_t start_polling = 0; bool_t lock_status; nmi_tuner_os_log("Nmi_Tuner_Interface_call_every100ms ~~~\n"); nmi_tuner_os_log("start_polling(%d)\n",start_polling); if(!gChipNowInfo.btuned) return FALSE; //if(gChipNowInfo.orgparam.tvstd != NMI_DVBT && gChipNowInfo.orgparam.tvstd != NMI_DVBT2) // return FALSE; lock_status = nmi_tuner_os_get_demod_lock(); { static uint32_t temp_times=0; if(start_polling == 1) { if(0 == nmi_times%2) { nmi_tuner_os_change_iic_mode(TRUE); nm120_rfli_track(); nmi_tuner_os_log("poll is called \n"); nmi_tuner_os_change_iic_mode(FALSE); } nmi_times++; } temp_times++; } if(gChipNowInfo.orgparam.freq != gChipNowInfo.currentparam.freq) { if(nmi_tuner_os_get_tick()- gChipNowInfo.jiffies<NML120_MAX_RESET_WAITTIME) { return TRUE; } } if(lock_status)//Ƶƫ´¦Àí { float pFreqOff; nmi_tuner_os_Get_FreqOffset(&pFreqOff, gChipNowInfo.currentparam.ucBw); nmi_tuner_os_log("pFreqOff(%f)\n",pFreqOff); if(((pFreqOff>10)||(pFreqOff<-10))&&start_polling) { nmi_tuner_os_log("\n#####offset:%f",pFreqOff); if(Nmi_Tuner_Interface_Retune(pFreqOff)) { nmi_tuner_os_log("\n#####reset offset:%f",pFreqOff); gChipNowInfo.jiffies = nmi_tuner_os_get_tick(); return TRUE; } } } #if 1 if(lock_status) //reset ÖØÖòÙ×÷ { uint16_t u16_data; static uint32_t tune_120_rest_time =0; lockdelay++; if(lockdelay<50) { return TRUE; } nmi_tuner_os_Get_Packet_Error(&u16_data); nmi_tuner_os_log("u16_data(%d)\n",u16_data); if(u16_data!=0) { start_polling = 1; tune_120_rest_time++; if(tune_120_rest_time>=TUNER_NML120_MAX_TIME) { tune_120_rest_time = 0; nmi_tuner_os_change_iic_mode(TRUE); NM120_ACI_Change(TRUE); Nmi_Tuner_Interface_Reset_Moaic(); nmi_tuner_os_change_iic_mode(FALSE); //nmi_tuner_os_reset_demod(gChipNowInfo.currentparam.freq); nmi_tuner_os_log("\n##############packeterr_reset1######"); gChipNowInfo.jiffies = nmi_tuner_os_get_tick()-2000; } } } else { static int temp= 0; if(temp>=20) { nmi_tuner_os_change_iic_mode(TRUE); NM120_ACI_Change(FALSE); Nmi_Tuner_Interface_Reset_Moaic(); nmi_tuner_os_change_iic_mode(FALSE); nmi_tuner_os_reset_demod(gChipNowInfo.currentparam.freq); nmi_tuner_os_log("\n##############packeterr_reset2######"); temp= 0; } temp++; } #endif return TRUE; }
static uint8_t Nmi_Tuner_Interface_SelfTune(tNMI_TUNE_PARAM* param) { uint8_t ret = TRUE; tTnrTune tune; nmi_tuner_os_memset((void *)&tune, 0x00, sizeof(tTnrTune)); tune.aif = param->aif; tune.dacSel = param->dacsel; tune.is_stereo = param->is_stereo; tune.output = param->output; tune.rf = param->freq; tune.vif = param->if_freq; tune.rfinvert = param->freq_invert; switch(param->tvstd) { case NMI_NTSC: { //add codes tune.std = nNTSC; } break; case NMI_PAL_G: { //add codes } break; case NMI_PAL_M: { //add codes } break; case NMI_PAL_N: { //add codes } break; case NMI_PAL_K: { //add codes } break; case NMI_PAL_L: { //add codes } break; case NMI_PAL_D: { //add codes } break; case NMI_SECAM_L: { //add codes } break; case NMI_SECAM_B: { //add codes } break; case NMI_SECAM_D: { //add codes } break; case NMI_ATSC_8VSB: case NMI_ATSC_64QAM: case NMI_ATSC_256QAM: { //add codes nmi_tuner_os_log("mode NMI_ATSC %d\n",param->ucBw); switch(param->ucBw) { case 0: case 6: tune.std = nDTV_6; break; case 1: case 7: tune.std = nDTV_7; break; case 2: case 8: default: tune.std = nDTV_8; break; } } break; case NMI_DVBT: case NMI_DVBT2: { //add codes switch(param->ucBw) { case 0: case 6: tune.std = nDTV_6; break; case 1: case 7: tune.std = nDTV_7; break; case 2: case 8: default: tune.std = nDTV_8; break; } } break; case NMI_DVBC: { //add codes uint32_t tempfreq; tempfreq = tune.rf/1000000; if(tempfreq%3 != 0) { tune.rf = tune.rf + 1000; } switch(param->ucBw) { case 0: case 6: tune.std = nDTV_6; break; case 1: case 7: tune.std = nDTV_7; break; case 2: case 8: default: tune.std = nDTV_8; break; } } break; case NMI_DTMB: { //add codes switch(param->ucBw) { case 0: case 6: tune.std = nDTV_6; break; case 1: case 7: tune.std = nDTV_7; break; case 2: case 8: default: tune.std = nDTV_8; break; } } break; case NMI_ISDBT: { //add codes } break; default: { //add codes } break; } if(param->tvstd <= NMI_SECAM_D &&( param->output == nCvbsSif || param->output == nCvbsBBAud)) { if(nmi_drv_ctl(NMI_DRV_TUNE, &tune) == 0) { nmi_tuner_os_log("\n tuneFail......\n"); ret = FALSE; } } else { if(nmi_drv_ctl(NMI_DRV_TUNE, &tune) < 0) { nmi_tuner_os_log("\n tuneFail......\n"); ret = FALSE; } if(param->if_freq_invert == TRUE) { int spectrum = 1; nmi_drv_ctl(NMI_DRV_INVERT_SPECTRUM, (void *)(&spectrum)); nmi_tuner_os_log("\n swan if invert \n"); } } if(param->tvstd == NMI_DVBC)//yao jin masic bugs //swan 2012_5_14 honestar { uint32_t tempfreq; tempfreq = tune.rf/1000000; if(tempfreq%3 == 0) { Nmi_Tuner_Interface_Wreg(0x1b,0x08); } else { Nmi_Tuner_Interface_Wreg(0x1b,0x0e); } if(tempfreq<726) { if(tempfreq == 602 || tempfreq ==650 || tempfreq ==690 || tempfreq ==698 || tempfreq ==706) { Nmi_Tuner_Interface_Wreg(0x05,0x85); } else { Nmi_Tuner_Interface_Wreg(0x05,0x05); } } else { Nmi_Tuner_Interface_Wreg(0x05,0x85); } } if(param->tvstd == NMI_DTMB)//swan 2012_6_1 honestar for C/N { Nmi_Tuner_Interface_Wreg(0x0e,0x25); } nmi_tuner_os_log("gChipNowInfo.currentparam.freq(%d) \n",gChipNowInfo.currentparam.freq); nmi_tuner_os_memcpy((void*)&gChipNowInfo.currentparam,param,sizeof(tNMI_TUNE_PARAM)); return ret; }