コード例 #1
0
/*====================================================================
FUNCTION       sharp_bb_get_status
DESCRIPTION 
DEPENDENCIES
RETURN VALUE
SIDE EFFECTS
======================================================================*/
void sharp_bb_get_status(tIsdbtSigInfo *sig_info)
{
  //ISDBT_MSG_SHARP_BB("[%s] \n", __func__);

  tIsdbtSignalStatus status;
    
  memset(&status, 0, sizeof(tIsdbtSignalStatus));

  status.get_simple_mode = 1; /* if zero, you will get all signal information. */
  
  nmi_isdbt_get_status(nMaster, &status);

  sig_info->ber = status.dberinst;
  sig_info->per = status.dperinst;
  // ant level -> sqindicator (0~100) by NMI.
  sig_info->cninfo = sharp_bb_get_ant_value(status.sqindicator);

  if(status.lock)
  {
    ISDBT_MSG_SHARP_BB("[%s] Locked, freq=[%d], ant=[%d], rssi=[%d]\n", __func__, status.frequency, sig_info->cninfo, status.rssi);
  }
  else
  {
    ISDBT_MSG_SHARP_BB("[%s] Unlocked, freq=[%d], ant=[%d], rssi=[%d]\n", __func__, status.frequency, sig_info->cninfo,status.rssi);
  }
}
コード例 #2
0
/*====================================================================
FUNCTION       sharp_test
DESCRIPTION 
DEPENDENCIES
RETURN VALUE
SIDE EFFECTS
======================================================================*/
void sharp_test(int index)
{
#ifdef FEATURE_TEST_READ_CHIPID
  int i;
#else
  tIsdbtSigInfo sig_info;
#endif

  ISDBT_MSG_SHARP_BB("[%s] start!!!\n", __func__);

  sharp_bb_pre_init();

#ifdef FEATURE_TEST_READ_CHIPID
  sky_isdbt_pre_init();

  for(i = 0; i < 100; i++)
  {
    //nmi_test();
    read_chipID();
  }
#else
  sharp_bb_init();

  ISDBT_MSG_SHARP_BB("[%s] freq index[%d]\n", __func__, index);
  sharp_bb_set_frequency(index);
  sharp_bb_start_ts(1);
  sharp_bb_get_status(&sig_info);
#endif
  ISDBT_MSG_SHARP_BB("[%s] end!!!\n", __func__);
}
コード例 #3
0
/*====================================================================
FUNCTION       sharp_bb_set_frequency
DESCRIPTION 
DEPENDENCIES
RETURN VALUE
SIDE EFFECTS
======================================================================*/
int sharp_bb_set_frequency(int freq_idx)
{
  tIsdbtScan scan;
  tIsdbtRun tune;

  memset(&scan, 0, sizeof(tIsdbtScan));

  if(freq_idx == 100)
  {
    scan.frequency = 473143000;
  }
  else
  {
    scan.frequency = isdbt_bb_index2freq(freq_idx);
  }

  nmi_drv_scan(nISDBTMode, nMaster, &scan);

  if(scan.found)
  {
    ISDBT_MSG_SHARP_BB("[%s] found the channel, freq=[%d]\n", __func__, scan.frequency);
  }
  else
  {
    ISDBT_MSG_SHARP_BB("[%s] No. channel, freq=[%d]\n", __func__, scan.frequency);
  }

  tune.highside = 0;
  tune.frequency = scan.frequency;
  nmi_drv_run(nISDBTMode, nMaster, &tune);

  ISDBT_MSG_SHARP_BB("[%s]  freq[%d] result [%d]\n", __func__, scan.frequency, scan.found);

  return scan.found;
}
コード例 #4
0
/*====================================================================
FUNCTION       read_chipID
DESCRIPTION 
DEPENDENCIES
RETURN VALUE
SIDE EFFECTS
======================================================================*/
static void read_chipID(void)
{
  unsigned int nChipId = 0;

  ISDBT_MSG_SHARP_BB("[%s] start!!!\n", __func__);

  //DRV_MASTER_CTL(NMI_DRV_GET_CHIPID, &nChipId);
  //nChipId = isdbt_get_chipid(nMaster);
  //nChipId = 0;
  nChipId = i2c_read_chipID();

  ISDBT_MSG_SHARP_BB("[%s] chipID[0x%x]\n", __func__, nChipId);
}
コード例 #5
0
static boolean sharp_function_register(isdbt_bb_function_table_type *ftable_ptr)
{
  ISDBT_MSG_SHARP_BB("[%s] !!!\n", __func__);

  ftable_ptr->isdbt_bb_power_on         = sharp_power_on;
  ftable_ptr->isdbt_bb_power_off        = sharp_power_off;
  ftable_ptr->isdbt_bb_init             = sharp_bb_init;
  ftable_ptr->isdbt_bb_set_freq         = sharp_bb_set_frequency;
  ftable_ptr->isdbt_bb_fast_search      = sharp_bb_fast_search;
  ftable_ptr->isdbt_bb_start_ts         = sharp_bb_start_ts;
  ftable_ptr->isdbt_bb_get_status       = sharp_bb_get_status;
  ftable_ptr->isdbt_bb_get_tuner_info   = sharp_bb_get_tuner_info;
#if 0
  ftable_ptr->isdbt_bb_bus_deinit       = nmi_bus_deinit;
  ftable_ptr->isdbt_bb_bus_init         = nmi_bus_init;
  ftable_ptr->isdbt_bb_bus_set_mode     = nmi_bus_set_mode;
  ftable_ptr->isdbt_bb_deinit           = nmi_isdbt_deinit;
  ftable_ptr->isdbt_bb_init_core        = npm_init_core;
  ftable_ptr->isdbt_bb_get_status       = npm_isdbt_get_status;
  ftable_ptr->isdbt_bb_get_status_slave = npm_isdbt_get_status_slave;
#endif
  ftable_ptr->isdbt_bb_test             = sharp_test;

  return TRUE;
}
コード例 #6
0
/*====================================================================
FUNCTION       sharp_bb_start_ts
DESCRIPTION 
DEPENDENCIES
RETURN VALUE
SIDE EFFECTS
======================================================================*/
int sharp_bb_start_ts(int enable)
{
  int result = 0;

  //ISDBT_MSG_SHARP_BB("[%s] enable [%d]\n", __func__, enable);
  
  tNmDtvStream stream;
  
  ISDBT_MSG_SHARP_BB("[%s]  enable [%d]",__func__,enable);

  memset(&stream, 0, sizeof(tNmDtvStream));
  stream.transporttype = nTS;
  stream.tso.mode = nSingle;
  stream.tso.tstype = nSerial;
  stream.tso.blocksize = 1;
  stream.tso.clkrate = nClk_s_2; // 2Mhz
  stream.tso.datapol = 0; /* refer to the comment in nmi325test.c */
  stream.tso.validpol = 0; /* refer to the comment in nmi325test.c */
  stream.tso.syncpol = 0; /* refer to the comment in nmi325test.c */
  stream.tso.clkedge = 0; /* refer to the comment in nmi325test.c */

  nmi_drv_video(nISDBTMode, &stream, enable);

  return result;
}
コード例 #7
0
/*====================================================================
FUNCTION       sharp_bb_init
DESCRIPTION 
DEPENDENCIES
RETURN VALUE
SIDE EFFECTS
======================================================================*/
int sharp_bb_init(void)
{
  tNmDrvInit nmiDrvInit;
  int ret = 0;

  //ISDBT_MSG_SHARP_BB("[%s] \n", __func__);

  sharp_bb_pre_init();

  memset(&nmiDrvInit, 0, sizeof(tNmDrvInit));
  nmiDrvInit.isdbt.bustype = nI2C;
  nmiDrvInit.isdbt.transporttype = nTS;
  nmiDrvInit.isdbt.blocksize = 1;
  nmiDrvInit.isdbt.ai2c.adrM = 0x61;
  nmiDrvInit.isdbt.core.bustype = nmiDrvInit.isdbt.bustype;
  nmiDrvInit.isdbt.core.transporttype = nmiDrvInit.isdbt.transporttype;
  nmiDrvInit.isdbt.core.dco = 1;
  nmiDrvInit.isdbt.core.ldoby = 1; /* Set to 1 if the IO voltage is less than 2.2v */
  nmiDrvInit.isdbt.core.op = nSingle;
  //nmiDrvInit.isdbt.core.xo = 32.;

  nmi_drv_init(&nmiDrvInit);
  ret = nmi_drv_init_core(nISDBTMode, nMaster);

  ISDBT_MSG_SHARP_BB("[%s]  result [%d]\n", __func__, ret);

  return ret;
}
コード例 #8
0
/*====================================================================
FUNCTION       sharp_bb_fast_search
DESCRIPTION 
DEPENDENCIES
RETURN VALUE
SIDE EFFECTS
======================================================================*/
int sharp_bb_fast_search(int freq)
{
  int result=0;

  ISDBT_MSG_SHARP_BB("[%s]  freq[%d] \n", __func__, freq);

  return result;
}
コード例 #9
0
/*====================================================================
FUNCTION       sharp_bb_pre_init
DESCRIPTION 
DEPENDENCIES
RETURN VALUE
SIDE EFFECTS
======================================================================*/
static void sharp_bb_pre_init(void)
{
  ISDBT_MSG_SHARP_BB("[%s] start\n", __func__);

  poem->prnt = NULL;//ISDBT_MSG_SHARP_BB;
  poem->os.delay = msleep;
  poem->os.gettick = GetTick;

  poem->bus.i2cw = sharp_i2c_write_data;
  poem->bus.i2cr = sharp_i2c_read_data;
  poem->bus.spiw = NULL;
  poem->bus.spir = NULL;
  poem->bus.burstr = NULL;

  ntv->tsdmasize = NMI_TS_BUF_SIZE; // cys temp

  ISDBT_MSG_SHARP_BB("[%s] end\n", __func__);
}
コード例 #10
0
static void nmi_log(char *str)
{
#ifdef FEATURE_SKY_ISDBT
    ISDBT_MSG_SHARP_BB("%s", str);
#else
	if(ISVALID(poem->prnt))
		poem->prnt(str);
#endif
}
コード例 #11
0
/*====================================================================
FUNCTION       i2c_read_chipID
DESCRIPTION 
DEPENDENCIES
RETURN VALUE
SIDE EFFECTS
======================================================================*/
static unsigned int i2c_read_chipID(void)
{
  uint8_t b[16];
  uint32_t val;
  int len;
  uint32_t adr = 0x6400;
  int ret = 0;

  ISDBT_MSG_SHARP_BB("[%s] \n", __func__);

  b[0] = 0x80; /* word access */
  b[1] = (uint8_t)(adr >> 16);
  b[2] = (uint8_t)(adr >> 8);
  b[3] = (uint8_t)(adr);
  b[4] = 0x00;
  b[5] = 0x04;
  len = 6;

  //chip.inp.hlp.read(cix, b, len, (uint8_t *)&val, 4)
  ret = sharp_i2c_write_data(NMI_I2C_ID >> 1, b, len);
  if (ret)
  {
    ISDBT_MSG_SHARP_BB("[%s] 1111111\n", __func__);
  }
  else
  {
    ISDBT_MSG_SHARP_BB("[%s] 2222222\n", __func__);
  }

  ret = sharp_i2c_read_data(NMI_I2C_ID >> 1, (uint8_t *)&val, 4);
  if(ret)
  {
    ISDBT_MSG_SHARP_BB("[%s] 3333333\n", __func__);
  }
  else
  {
    ISDBT_MSG_SHARP_BB("[%s] 4444444\n", __func__);
  }

  return val;
}
コード例 #12
0
/*====================================================================
FUNCTION       sharp_bb_get_tuner_info
DESCRIPTION 
DEPENDENCIES
RETURN VALUE
SIDE EFFECTS
======================================================================*/
void sharp_bb_get_tuner_info(tIsdbtTunerInfo *tuner_info)
{
  tIsdbtSignalStatus status;

  //ISDBT_MSG_SHARP_BB("[%s] \n", __func__);
  
  memset(&status, 0, sizeof(tIsdbtSignalStatus));

  status.get_simple_mode = 0; /* if zero, you will get all signal information. */

  nmi_isdbt_get_status(nMaster, &status);

  // ant level -> sqindicator (0~100) by NMI.
  tuner_info->rssi = status.rssi;
  tuner_info->ant_level = sharp_bb_get_ant_value(status.sqindicator);
  if(status.lock)
  {
    tuner_info->ber = status.dberinst;
  }
  else
  {
    tuner_info->ber = 9999;
  }
  tuner_info->per = status.dperinst;
  tuner_info->snr = status.nsnr;
  tuner_info->doppler_freq = status.doppler; // Hz ´ÜÀ§
  //tuner_info->doppler_freq = 0;
  tuner_info->tmcc_info.carrier_mod = status.modulation;
  tuner_info->tmcc_info.coderate= status.fec;
  tuner_info->tmcc_info.interleave_len= status.interleaver;

  if(status.lock)
  {
    ISDBT_MSG_SHARP_BB("[%s] Locked, freq=[%d], sq=[%d], rssi=[%d]\n", __func__, status.frequency, status.sqindicator, status.rssi);
    ISDBT_MSG_SHARP_BB("[%s] ber=[%ld], Dfreq=[%ld]\n", __func__, tuner_info->ber, tuner_info->doppler_freq);
  }
  else
  {
    ISDBT_MSG_SHARP_BB("[%s] Unlocked, freq=[%d], sq=[%d], rssi=[%d]\n", __func__, status.frequency, status.sqindicator,status.rssi);
  }
}
コード例 #13
0
/*====================================================================
FUNCTION       sharp_power_off
DESCRIPTION 
DEPENDENCIES
RETURN VALUE
SIDE EFFECTS
======================================================================*/
void sharp_power_off(void)
{
// 1. DMB_RESET : LOW
// 2. DMB_PWR_EN : LOW

  ISDBT_MSG_SHARP_BB("[%s] start!!![%d]\n", __func__, isdbt_chip_power_on);

  if(!isdbt_chip_power_on)
  {
    return;
  }

  dmb_set_gpio(DMB_RESET, 0);
  msleep(1);

  dmb_power_off();

  isdbt_chip_power_on = FALSE;

  ISDBT_MSG_SHARP_BB("[%s] end!!!\n", __func__);
}
コード例 #14
0
/*====================================================================
FUNCTION       sharp_power_on
DESCRIPTION 
DEPENDENCIES
RETURN VALUE
SIDE EFFECTS
======================================================================*/
void sharp_power_on(void)
{
// 1. DMB_RESET : LOW
// 2. DMB_PWR_EN : HIGH
// 3. DMB_RESET : HIGH

  ISDBT_MSG_SHARP_BB("[%s] start!!!\n", __func__);

  dmb_power_on();

  dmb_set_gpio(DMB_RESET, 0);
  msleep(1);

  dmb_power_on_chip();
  msleep(100);

  dmb_set_gpio(DMB_RESET, 1);
  msleep(100);

  isdbt_chip_power_on = TRUE;

  ISDBT_MSG_SHARP_BB("[%s] end!!!\n", __func__);
}
コード例 #15
0
static void nmi_debug(uint32_t zone, char *fmt,...)
{
#if 1 // cys Android porting
	char buf[256];
	va_list args;
	int len;

	if (zone & chip.inp.zone) {
		va_start(args, fmt);
		strcpy(buf, "[Nmi Isdbt]: "); 
		len = vsprintf(&buf[13], fmt, args);
		va_end(args);
    ISDBT_MSG_SHARP_BB("%s\n",buf);

		//if (chip.inp.hlp.log) {
		//	chip.inp.hlp.log(buf);
		//}
	}
#endif
	return;
}
コード例 #16
0
void nmi_isdbt_get_status(tNmiIsdbtChip cix, tIsdbtSignalStatus *p)
{
	int tmcclock;
	tNmiDrv *pd = &drv;
	tIsdbtBer ber;
	//tIsdbtPer per;
	uint32_t nber; // cys
	//int nber;//, nper;
	tIsdbtGainInfo ginfo;
#ifndef FIX_POINT
	tIsdbtAcqTime acqtime;
#endif
	tIsdbtTmccInfo tmccinfo;
	uint32_t sq, coeff;
	int acq_mode = p->get_simple_mode;

	//dPrint(N_INFO, "nmi_isdbt_get_status: cix=[%d]\n", cix); 
	
	tmcclock = 0;
	pd->dtv.vf.chkpll(cix);		// it shoud be checked with system guys...
	tmcclock = pd->dtv.vf.tmcclock(cix);

	if (tmcclock) {
		p->lock 			= 1;
		if(!pd->decoder_initialized) {
			dPrint(N_INFO, "nmi_isdbt_get_status: pd->decoder_initialized != 1\n"); 
			pd->dtv.vf.decoder(cix, 0, NULL);
			pd->dtv.vf.gettmccinfo(cix,&tmccinfo);
			memcpy((void *)&pd->tmcc, (void *)&tmccinfo, sizeof(tIsdbtTmccInfo));
			pd->decoder_initialized = 1;
		} 
#if 0
		pd->dtv.vf.gettmccinfo(cix,&tmccinfo);
		if ((tmccinfo.mode != pd->tmcc.mode) ||
				(tmccinfo.guard != pd->tmcc.guard) ||
				(tmccinfo.coderate != pd->tmcc.coderate) ||
				(tmccinfo.modulation != pd->tmcc.modulation) ||
				(tmccinfo.interleaver != pd->tmcc.interleaver)) {
			dPrint(N_INFO, "nmi_isdbt_get_status: calling the decoder...\n"); 
			pd->dtv.vf.decoder(cix, 0, NULL);
		}
		p->mode				= tmccinfo.mode;
		p->guard			= tmccinfo.guard;
		p->modulation		= tmccinfo.modulation;
		p->interleaver		= tmccinfo.interleaver;
		p->fec				= tmccinfo.coderate;
		// [[ added by tony
		p->emerg_flag		= tmccinfo.emerg_flag;
		// ]]
#else	
		// nmi_drv_run() should have the backup of the tmcc.
		p->mode				= pd->tmcc.mode;
		p->guard			= pd->tmcc.guard;
		p->modulation		= pd->tmcc.modulation;
		p->interleaver		= pd->tmcc.interleaver;
		p->fec				= pd->tmcc.coderate;
		p->emerg_flag		= pd->tmcc.emerg_flag;
#endif
		if(acq_mode != __DEBUG_SIMPLE__) {
      p->doppler      = pd->dtv.vf.getdoppler(cix);
#ifndef FIX_POINT
			p->chanlen			= pd->dtv.vf.getchanlen(cix);		
#endif
		}
	} else {
		dPrint(N_INFO, "nmi_isdbt_get_status, tmcclock = 0\n"); 
		p->lock = 0;
	}

	/* get snr */
	if ((cix == nMaster) && (pd->opmode == nDiversity)) {
#ifndef FIX_POINT
		p->dsnr = pd->dtv.vf.getsnr(cix, 1);	/* combiner */
#else
		p->nsnr = pd->dtv.vf.getsnr(cix, 1);
#endif
		p->dsmstate = pd->dtv.vf.dsmstate();
		p->dsmlock = pd->dtv.vf.dsmlock();
	} else {
#ifndef FIX_POINT
		p->dsnr = pd->dtv.vf.getsnr(cix, 0);
#else
		p->nsnr = pd->dtv.vf.getsnr(cix, 0);
#endif
	}
	
#ifndef FIX_POINT
	dPrint(N_VERB, "lock (%d), snr (%f)\n", p->lock, p->dsnr);
#else
	dPrint(N_VERB, "lock (%d), snr (%d)\n", p->lock, p->nsnr);
#endif

	if(acq_mode != __DEBUG_SIMPLE__) {
		/**
			get ber before viterbi 
		**/
		if (pd->dtv.vf.getberb(cix, (void *)&ber) > 0) {
			nber = ber.bec / ber.becw;
			p->dbbvinst = nber;
			pd->sq[cix].abbv = ((pd->sq[cix].abbv * pd->sq[cix].npol) + nber)/(pd->sq[cix].npol + 1);//pd->sq[cix].abbv = ((pd->sq[cix].abbv * pd->sq[cix].npol) + dber)/(pd->sq[cix].npol + 1); 
			p->dbbv = pd->sq[cix].abbv;
		} else {
			/**
				review: BER counter not turn on 
			**/
			p->dbbvinst = 1;
			p->dbbv = 1;
		}
	}

	/**
		get ber 
		ber should be less than 0.0002.
	**/
	if (tmcclock) {
		pd->dtv.vf.getber(cix, (void *)&ber);
    nber = ((ber.bec * 1000000) / ber.becw); // cys
		//nber = ber.bec/ber.becw;
		p->dberinst = nber;
	
		pd->sq[cix].aber = ((pd->sq[cix].aber * pd->sq[cix].npol) + nber)/(pd->sq[cix].npol + 1);
		p->dber = pd->sq[cix].aber;
	} else {
		p->dberinst = 1;
	}

#ifdef FIX_POINT
	if(tmcclock) 
		p->dperinst = 0;
	else			
		p->dperinst = 1;
#else
	if(acq_mode != __DEBUG_SIMPLE__) {
		/**
			get per 
			per should be less than 0.0001.
		**/
		pd->dtv.vf.getper(cix, (void *)&per);
		nper = per.pec /per.pecw;
		p->dperinst = nper;
		pd->sq[cix].aper = ((pd->sq[cix].aper * pd->sq[cix].npol) + nper)/(pd->sq[cix].npol + 1);
		p->dper = pd->sq[cix].aper;	
		
		pd->sq[cix].npol++;
	}
#endif

	/**
		get rssi 
	**/
	pd->dtv.vf.getrssi(cix, (void *)&ginfo);
	p->dagc = ginfo.dagc;
	p->lnagain = (int)ginfo.bblnadb;
	p->lnagaincode = ginfo.bblnacode;
	p->lnamode = ginfo.rflna;
	p->rssi = ginfo.rssi;

	if(acq_mode != __DEBUG_SIMPLE__) {
		/**
			get offset 
		**/
#ifndef FIX_POINT
		p->freqoffset = pd->dtv.vf.getfreqoffset(cix);
		p->timeoffset = pd->dtv.vf.gettimeoffset(cix);
#endif
		
		/* get acquisation time */
		if(cix == nMaster) {
#ifndef FIX_POINT
			pd->dtv.vf.getacqtime(cix,&acqtime);

			p->agcacq		= acqtime.agcacq;
			p->syracq		= acqtime.syracq;
			p->ppmacq		= acqtime.ppmacq;
			p->tmccacq	= acqtime.tmccacq;
			p->tsacq			= acqtime.tsacq;
			p->totalacq		= acqtime.totalacq;
#endif
		}

		if (pd->opmode == nDiversity) {
			p->regad48 = pd->dtv.vf.r32(cix, 0xad48);
			p->regad4c = pd->dtv.vf.r32(cix, 0xad4c);
			p->regacc8 = pd->dtv.vf.r32(cix, 0xacc8);
		}
	}

	/**
		save the current frequency
	**/
	if(cix == nMaster)
		p->frequency = pd->mfrequency;
	else
		p->frequency = pd->sfrequency;

	if(p->rssi < -100)
		p->rssi = -100;

#ifndef FIX_POINT
	coeff = p->dsnr * 0.0625;
#else
	coeff = p->nsnr * 1;			
#endif
	sq = 2 * (100 + p->rssi);
	sq *= coeff;
	
	if(p->lock == 0)
		p->sqindicator = 0;
	else if(sq > 100)
		p->sqindicator = 100;
	else 
		p->sqindicator = (unsigned int)sq;

#if 1 //cys test
  ISDBT_MSG_SHARP_BB("[%s] snr=[%d], rssi=[%d], bec=[%d], becw=[%d], lnamode=[%d], dagc=[%d], lnagain=[%d], lnagaincode=[%d]\n",
                            __func__, p->nsnr, p->rssi, ber.bec, ber.becw, p->lnamode, p->dagc, p->lnagain, p->lnagaincode);
#endif

	return;
}