示例#1
0
static int8 tunerbb_drv_fc8050_check_overrun(uint8 op_mode)
{
	uint16 mfoverStatus;

	// Patch for BER monitoring 20111115
	//uint16 buf_set=0;

	uint16 veri_val=0;
	uint8 mask;

	if(op_mode == FC8050_DAB)
	{
		mask = 0x08;
	}
	else if(op_mode == FC8050_DMB || op_mode == FC8050_VISUAL)
	{
		mask = 0x01;
	}
	else
	{
		printk("fc8050 invaild op_mode %d\n", op_mode);
		return FC8050_RESULT_ERROR; /* invaild op_mode */
	}
	
	// Patch for BER monitoring 20111115
	//BBM_WORD_READ(NULL, BBM_BUF_ENABLE, &buf_set);

	// Patch for BER monitoring 20111115
	//if(buf_set & mask)
	{	
		BBM_WORD_READ(NULL, BBM_BUF_OVERRUN, &mfoverStatus);		

		if(mfoverStatus & mask)
		{
			BBM_WORD_WRITE(NULL, BBM_BUF_OVERRUN, mfoverStatus);
			BBM_WORD_WRITE(NULL, BBM_BUF_OVERRUN, 0x0000);
			
			BBM_WORD_READ(NULL, BBM_BUF_ENABLE, &veri_val);
			veri_val &= ~mask;
			BBM_WORD_WRITE(NULL, BBM_BUF_ENABLE, veri_val);
			veri_val |= mask; 
			BBM_WORD_WRITE(NULL, BBM_BUF_ENABLE, veri_val);

			fc8050_isr_interruptclear();

			printk("======== FC8050  OvernRun and Buffer Reset Done mask (0x%X) over (0x%X) =======\n", mask,mfoverStatus );
		}
	}

	return FC8050_RESULT_SUCCESS;
}
int8	tunerbb_drv_fc8050_get_fic(uint8* buffer, uint32* buffer_size  /*, uint8 crc_on_off */)
{
	HANDLE hDevice = NULL;
	fci_u16      mfIntStatus = 0;
	fci_u16      size;
		
	if(buffer==NULL)
		return FC8050_RESULT_ERROR;
	
	//BBM_WRITE(hDevice, BBM_COM_INT_ENABLE, 0x00);
	//BBM_WRITE(hDevice, BBM_COM_STATUS_ENABLE, 0x00);
	//tunerbb_drv_fc8050_control_fic(1);
	
	BBM_WORD_READ(hDevice, BBM_BUF_STATUS, &mfIntStatus);

	//printk("tunerbb_drv_fc8050_get_fic (0x%x)\n", mfIntStatus);
	if(mfIntStatus == 0)
	{
		//tunerbb_drv_fc8050_control_fic(0);
		//BBM_WRITE(hDevice, BBM_COM_INT_ENABLE, ENABLE_INT_MASK);
		//BBM_WRITE(hDevice, BBM_COM_STATUS_ENABLE, ENABLE_INT_MASK);
		return FC8050_RESULT_ERROR;
	}

	BBM_WORD_WRITE(hDevice, BBM_BUF_STATUS, mfIntStatus);
	BBM_WORD_WRITE(hDevice, BBM_BUF_STATUS, 0x0000);

	if(mfIntStatus & 0x0100) 
	{
		BBM_WORD_READ(hDevice, BBM_BUF_FIC_THR, &size);
		size += 1;
		if(size-1) 
		{
			BBM_DATA(hDevice, BBM_COM_FIC_DATA, buffer, size);
			*buffer_size=size;
		}

		//printk("FC8050 fic data (0x%x,len : %d)\n", *buffer, size);	
	}
	
	//tunerbb_drv_fc8050_control_fic(0);
	//BBM_WRITE(hDevice, BBM_COM_INT_ENABLE, ENABLE_INT_MASK);
	//BBM_WRITE(hDevice, BBM_COM_STATUS_ENABLE, ENABLE_INT_MASK);
	
	if(mfIntStatus & 0x0100)
		return FC8050_RESULT_SUCCESS;
	else
		return FC8050_RESULT_ERROR;
	
}
示例#3
0
static int8 tunerbb_drv_fc8050_check_overrun(uint8 op_mode)
{
	uint16 mfoverStatus;
	uint16 buf_set=0;
	uint16 veri_val=0;
	uint8 mask;

	if(op_mode == FC8050_DAB)
	{
		mask = 0x08;
	}
	else if(op_mode == FC8050_DMB || op_mode == FC8050_VISUAL)
	{
		mask = 0x01;
	}
	else
	{
		printk("fc8050 invaild op_mode %d\n", op_mode);
		return FC8050_RESULT_ERROR; /* invaild op_mode */
	}
	
	BBM_WORD_READ(NULL, BBM_BUF_ENABLE, &buf_set);

	if(buf_set & mask)
	{	
		BBM_WORD_READ(NULL, BBM_BUF_OVERRUN, &mfoverStatus);		

		if(mfoverStatus & mask)
		{
			BBM_WORD_WRITE(NULL, BBM_BUF_OVERRUN, mfoverStatus);
			BBM_WORD_WRITE(NULL, BBM_BUF_OVERRUN, 0x0000);
			
			BBM_WORD_READ(NULL, BBM_BUF_ENABLE, &veri_val);
			veri_val &= ~mask;
			BBM_WORD_WRITE(NULL, BBM_BUF_ENABLE, veri_val);
			veri_val |= mask; 
			BBM_WORD_WRITE(NULL, BBM_BUF_ENABLE, veri_val);

			fc8050_isr_interruptclear();

			printk("++++++++++++++++++++++ fc8050 overrun occured!!! ++++++++++++++++++++++++++\n");
			printk("fc8050 overrun and buffer reset done!! mask %x, over %x\n", mask, mfoverStatus);
		}
	}

	return FC8050_RESULT_SUCCESS;
}
void tdmb_fc8050_spi_write_read_test(void)
{
	uint16 i;
	uint32 wdata = 0;
	uint32 ldata = 0;
	uint32 data = 0;
	uint32 temp = 0;

#define TEST_CNT    5
	tdmb_fc8050_power_on();

	for(i=0;i<TEST_CNT;i++)
	{
		BBM_WRITE(NULL, 0x05, i & 0xff);
		BBM_READ(NULL, 0x05, (fci_u8*)&data);
		printk("FC8000 byte test (0x%x,0x%x)\n", i & 0xff, data);
		if((i & 0xff) != data)
			printk("FC8000 byte test (0x%x,0x%x)\n", i & 0xff, data);
	}

	for(i=0;i<TEST_CNT;i++)
	{
		BBM_WORD_WRITE(NULL, 0x0210, i & 0xffff);
		BBM_WORD_READ(NULL, 0x0210, (fci_u16*)&wdata);
		printk("FC8000 word test (0x%x,0x%x)\n", i & 0xffff, wdata);
		if((i & 0xffff) != wdata)
			printk("FC8000 word test (0x%x,0x%x)\n", i & 0xffff, wdata);
	}

	for(i=0;i<TEST_CNT;i++)
	{
		BBM_LONG_WRITE(NULL, 0x0210, i & 0xffffffff);
		BBM_LONG_READ(NULL, 0x0210, (fci_u32*)&ldata);
		printk("FC8000 long test (0x%x,0x%x)\n", i & 0xffffffff, ldata);
		if((i & 0xffffffff) != ldata)
			printk("FC8000 long test (0x%x,0x%x)\n", i & 0xffffffff, ldata);
	}

	data = 0;

	for(i=0;i<TEST_CNT;i++)
	{
		temp = i&0xff;
		BBM_TUNER_WRITE(NULL, 0x12, 0x01, (fci_u8*)&temp, 0x01);
		BBM_TUNER_READ(NULL, 0x12, 0x01, (fci_u8*)&data, 0x01);
		printk("FC8000 tuner test (0x%x,0x%x)\n", i & 0xff, data);
		if((i & 0xff) != data)
			printk("FC8000 tuner test (0x%x,0x%x)\n", i & 0xff, data);
	}
	temp = 0x51;
	BBM_TUNER_WRITE(NULL, 0x12, 0x01, (fci_u8*)&temp, 0x01 );
	tdmb_fc8050_power_off();
}
示例#5
0
unsigned char DMBDrv_ScanCh(unsigned long ulFrequency)
{
	esbInfo_t* esb;

	if(!gInitFlag)
		return TDMB_FAIL;

	FIC_DEC_SubChInfoClean();

	BBM_WORD_WRITE(NULL, BBM_BUF_INT, 0x01ff); 

	if(BBM_TUNER_SET_FREQ(NULL, ulFrequency)) {
		BBM_WORD_WRITE(NULL, BBM_BUF_INT, 0x00ff);
		return TDMB_FAIL;
	} 

	if(BBM_SCAN_STATUS(NULL)) {
		BBM_WORD_WRITE(NULL, BBM_BUF_INT, 0x00ff);
		return TDMB_FAIL;
	}

	// wait 1.2 sec for gathering fic information
	msWait(1200);   // 1200
	
	BBM_WORD_WRITE(NULL, BBM_BUF_INT, 0x00ff);

	esb = FIC_DEC_GetEsbInfo(0);
	if(esb->flag != 99) {
		FIC_DEC_SubChInfoClean();
		return TDMB_FAIL;
	}

	if(strlen(esb->label) <= 0) {
		FIC_DEC_SubChInfoClean();
		return TDMB_FAIL;
	}
		
	return TDMB_SUCCESS;
}
示例#6
0
/*--------------------------------------------------------------------------
int8 tunerbb_drv_fc8050_control_fic(void)
    (1)   fic interrupt control on/off
    (2)   Return Value
           Sucess : 1
           Fail : 0 or negative interger (If there is error code)
    (3)   Argument
           enable : on/off
---------------------------------------------------------------------------- */
int8 tunerbb_drv_fc8050_control_fic(uint8 enable)
{
	unsigned short mask;
	
	BBM_WORD_READ(NULL, BBM_BUF_INT, &mask);

	if(enable ==1)
		mask |= 0x100;
	else
		mask &= ~0x100;
	
	BBM_WORD_WRITE(NULL, BBM_BUF_INT, mask);
	
	return FC8050_RESULT_SUCCESS;
}
示例#7
0
void mmi_bbm_wwrite(int argc, char *argv[])
{
    u16  dest_addr;
    u16   dest_data;
    u16   length;
    int  i;

    if(argc == 3) {
        dest_addr = htoi(argv[1]);
        dest_data = htoi(argv[2]);

        BBM_WORD_WRITE(hDevice, dest_addr, dest_data);
    } else if(argc == 4) {
        dest_addr = htoi(argv[1]);
        dest_data = htoi(argv[2]);
        length    = htoi(argv[3]);

        for(i=0; i<length; i+=2) {
            BBM_WORD_WRITE(hDevice, dest_addr+i, dest_data);
        }
    } else {
        print_log("usage : %s [start addr] [data] [length] ; word write command\n", (int)argv[0]);
    }
}
示例#8
0
unsigned char DMBDrv_SetCh(unsigned long ulFrequency, unsigned char ucSubChannel, unsigned char ucSvType)
{
	if(!gInitFlag)
		return TDMB_FAIL;

        bfirst = 1;
        TSBuffpos = 0;
        MSCBuffpos = 0;
        mp2len = 0;

        gCurSvcType = ucSvType;
        gCurSubChId = ucSubChannel;
  
	BBM_VIDEO_DESELECT(NULL, 0, 0, 0);
	BBM_AUDIO_DESELECT(NULL, 0, 3);
	BBM_DATA_DESELECT(NULL, 0, 2);

	BBM_WORD_WRITE(NULL, BBM_BUF_INT, 0x00ff);

	if(BBM_TUNER_SET_FREQ(NULL, ulFrequency) != BBM_OK) {
		return TDMB_FAIL;
	}

	if(ucSvType == 0x18) {
		BBM_VIDEO_SELECT(NULL, ucSubChannel, 0, 0);
	} else if(ucSvType == 0x00) {
		BBM_AUDIO_SELECT(NULL, ucSubChannel, 3);
	} else {
		BBM_DATA_SELECT(NULL, ucSubChannel, 2);
	}
	
#ifdef FEATURE_FC8050_DEBUG
	if(ucSvType == 0x18) 
		gDmbMode=FC8050_DMB;
	else if(ucSvType == 0x00)
		gDmbMode=FC8050_DAB;
	else 
		gDmbMode=FC8050_DATA;
#endif
	return TDMB_SUCCESS;
}
示例#9
0
// Modified by somesoo 20100730 for removing green block effect
int8	tunerbb_drv_fc8050_multi_set_channel(int32 freq_num, uint8 subch_cnt, uint8 subch_id[ ], uint8 op_mode[ ])
{
	int8 res = BBM_OK;
	int32 freq = 0;
	uint8 dmb_cnt=0;
	int i;
	fc8050_service_type svcType = FC8050_SERVICE_MAX;
	unsigned short mask;
		
	// Added by somesoo 20100730 for removing green block effect
	fc8050_isr_control(0);
	
	for(i=0;i<subch_cnt;i++)
	{
		serviceType[i] = op_mode[i];

		if(FC8050_ENSQUERY != op_mode[i])
			tunerbb_drv_fc8050_stop();
		else
			svcType = FC8050_ENSQUERY;
	}
	
	tunerbb_drv_fc8050_control_fic(0);
	/* Change freq_num(channel num) to frequency */
	freq = tunerbb_drv_convert_chnum_to_freq(freq_num);

	if(freq == 0)
	{
		return FC8050_RESULT_ERROR;
	}

	res = BBM_TUNER_SET_FREQ(0, freq);
		
	if(res)
	{
		return FC8050_RESULT_ERROR;
	}
	
	if(svcType == FC8050_ENSQUERY)
	{
		if(BBM_SCAN_STATUS(0))
		{
			return FC8050_RESULT_ERROR;
		}
	}
		
	BBM_WORD_READ(NULL, BBM_BUF_ENABLE, &mask);
	mask &= 0x100;
	
	for(i=0;i<subch_cnt;i++)
	{
		switch(serviceType[i])
		{
			case FC8050_DAB:
				mask |= (1<<DAB_SVC_ID);
				BBM_AUDIO_SELECT(0, subch_id[i],DAB_SVC_ID);
#ifdef STREAM_TS_UPLOAD
				fc8050_demux_select_channel(subch_id[i], DAB_SVC_ID);
#else
				g_chinfo[subch_id[i]]=DAB_SVC_ID;
#endif
				break;
			case FC8050_DMB:
			case FC8050_VISUAL:
				mask |= (1<<(DMB_SVC_ID+dmb_cnt));	//LGE_BROADCAST_I
				if(dmb_cnt<2)
				{
					BBM_VIDEO_SELECT(0, subch_id[i], DMB_SVC_ID+dmb_cnt, dmb_cnt);
#ifdef STREAM_TS_UPLOAD
					fc8050_demux_select_video(subch_id[i], DMB_SVC_ID+dmb_cnt);
#else
					g_chinfo[subch_id[i]]=dmb_cnt;
#endif
					dmb_cnt++;
				}
				else
					res=BBM_NOK;
				break;
			case FC8050_DATA:
				mask |= (1<<DAT_SVC_ID);
				BBM_DATA_SELECT(0, subch_id[i], DAT_SVC_ID);
#ifdef STREAM_TS_UPLOAD
				fc8050_demux_select_channel(subch_id[i], DAT_SVC_ID);
#else
				g_chinfo[subch_id[i]]=DAT_SVC_ID;
#endif
				break;
			case FC8050_ENSQUERY:
				tunerbb_drv_fc8050_control_fic(1);
				res = BBM_OK;
				break;
			default:
				res = BBM_NOK;
				break;
		}
	}
	BBM_WORD_WRITE(NULL, BBM_BUF_ENABLE, mask);
	tot_subch_cnt = subch_cnt;

	// Added by somesoo 20100730 for removing green block effect
	if(svcType != FC8050_ENSQUERY)
		fc8050_isr_control(1);
	
	if(res)
		return FC8050_RESULT_ERROR;
	else
		return FC8050_RESULT_SUCCESS;
}
示例#10
0
/*======================================================= 
    Function 		: tunerbb_drv_fc8050_init
    Description		: Initializing the FC8050 Chip after power on
    Parameter		: VOID
    Return Value	: 
           SUCCESS : 1
           FAIL : 0 or negative interger (If there is error code)

	when		model	who			edit history
  -------------------------------------------------------
	2010/05/17	MOBIT	prajuna		EBI2 configuration
	2010/05/31	MOBIT	prajuna		Removed test code
	2010/06/09	MOBIT	prajuna		TDMB porting(KB3 Rev. A patch)
	2010/07/15	MOBIT	prajuna		TDMB tuning for QSC
	2010/07/16	MOBIT	somesoo		TDMB tuning for QSC with FCI 최규원 과장
	2010/07/17	MOBIT	somesoo		TDMB porting(VG)
	2010/08/19	MOBIT	prajuna		Code review
	2010/09/10	MOBIT	prajuna		TDMB porting(Aloe)
======================================================== */ 
int8	tunerbb_drv_fc8050_init(void)
{
	uint8 res;
	/*test*/

	/*
	uint16 i; 
	uint32 wdata = 0; 
	uint32 ldata = 0; 
	uint32 data = 0;
	uint32 temp = 0;
	*/

	/* Common Code */
#if defined(STREAM_SLAVE_PARALLEL_UPLOAD)
	/* EBI2 Specific Code */
	BBM_HOSTIF_SELECT(NULL, BBM_PPI);
#elif defined(STREAM_TS_UPLOAD)
	/* TSIF Specific Code */
	BBM_HOSTIF_SELECT(NULL, BBM_I2C);
#elif defined(STREAM_SPI_UPLOAD)
	/* SPI Specific. Code */
	BBM_HOSTIF_SELECT(NULL, BBM_SPI);
#else
#error code not present
#endif

	BBM_FIC_CALLBACK_REGISTER((fci_u32)NULL, tunerbb_drv_fc8050_fic_cb);
	BBM_MSC_CALLBACK_REGISTER((fci_u32)NULL, tunerbb_drv_fc8050_msc_cb);
	
	res = BBM_INIT(NULL);
	
	if(res)
		return FC8050_RESULT_ERROR;
	else
	{
#if !defined(STREAM_TS_UPLOAD)
		memset((void*)&g_chinfo, 0xff, sizeof(g_chinfo));
		memset((void*)&msc_buffer, 0x00, sizeof(DATA_BUFFER));
		memset((void*)&fic_buffer, 0x00, sizeof(DATA_BUFFER));
#endif
	}

	res = BBM_TUNER_SELECT(0, FC8050_TUNER, BAND3_TYPE);

//	res = BBM_PROBE(0);
//	printk("tunerbb_drv_fc8050_init probe RES = %d\n", res);
#if 0      //fc8050 <-> Host(MSM) 간의 Interface TEST를 위한 code
/* test */	
	for(i=0;i<5000;i++)
	{
//		dog_kick();
		BBM_WRITE(NULL, 0x05, i & 0xff);
		BBM_READ(NULL, 0x05, &data);
		if((i & 0xff) != data)
			printk("FC8000 byte test (0x%x,0x%x)\n", i & 0xff, data);
	}
	for(i=0;i<5000;i++)
	{
		BBM_WORD_WRITE(NULL, 0x0210, i & 0xffff);
		BBM_WORD_READ(NULL, 0x0210, &wdata);
		if((i & 0xffff) != wdata)
			printk("FC8000 word test (0x%x,0x%x)\n", i & 0xffff, wdata);
	}
	for(i=0;i<5000;i++)
	{
		BBM_LONG_WRITE(NULL, 0x0210, i & 0xffffffff);
		BBM_LONG_READ(NULL, 0x0210, &ldata);
		if((i & 0xffffffff) != ldata)
			printk("FC8000 long test (0x%x,0x%x)\n", i & 0xffffffff, ldata);
	}

	data = 0;
	
	for(i=0;i<5000;i++)
	{
	  temp = i&0xff;
		BBM_TUNER_WRITE(NULL, 0x12, 0x01, &temp, 0x01);
		BBM_TUNER_READ(NULL, 0x12, 0x01, &data, 0x01);
		if((i & 0xff) != data)
			printk("FC8000 tuner test (0x%x,0x%x)\n", i & 0xff, data);
	}
	temp = 0x51;
	BBM_TUNER_WRITE(NULL, 0x12, 0x01, &temp, 0x01 );	
/* test */
#endif

	if(res)
		return FC8050_RESULT_ERROR; 
	else
		return FC8050_RESULT_SUCCESS;
}
示例#11
0
unsigned char DMBDrv_init(void)
{
	u8 data;
	u16 wdata;
	u32 ldata;	
	int i;
	u8 temp = 0x1e;


#ifdef CONFIG_TDMB_SPI
	if(BBM_HOSTIF_SELECT(NULL, BBM_SPI))
		return TDMB_FAIL;
#elif defined(CONFIG_TDMB_EBI)
	if(BBM_HOSTIF_SELECT(NULL, BBM_PPI))
		return TDMB_FAIL;
#endif

  if(BBM_PROBE(NULL) != BBM_OK)  // check for factory  chip interface test
  {
    return TDMB_FAIL; 
  }
  
	BBM_FIC_CALLBACK_REGISTER(NULL, TDMBDrv_FIC_CALLBACK);
	BBM_MSC_CALLBACK_REGISTER(NULL, TDMBDrv_MSC_CALLBACK);

	BBM_INIT(NULL);
	BBM_TUNER_SELECT(NULL, FC8050_TUNER, BAND3_TYPE);

#if 0
	BBM_WRITE(NULL, 0x05, 0xa7);
	BBM_READ(NULL, 0x05, &data);
	BBM_READ(NULL, 0x12, &data);
	BBM_WORD_READ(NULL, 0x12, &wdata);
	BBM_WORD_WRITE(NULL, 0x310, 0x0b);
	BBM_WORD_READ(NULL, 0x310, &wdata);
	BBM_WRITE(NULL, 0x312, 0xc0);
	BBM_READ(NULL, 0x312, &data);

	BBM_TUNER_READ(NULL, 0x01, 0x01, &data, 0x01);
#endif

#if 0
	for(i=0;i<1000;i++)
	{
//		dog_kick();
		BBM_WRITE(NULL, 0x05, i & 0xff);
		BBM_READ(NULL, 0x05, &data);
		if((i & 0xff) != data)
			DPRINTK("FC8000 byte test (0x%x,0x%x)\r\n", i & 0xff, data);
	}
	for(i=0;i<1000;i++)
	{
		BBM_WORD_WRITE(NULL, 0x0210, i & 0xffff);
		BBM_WORD_READ(NULL, 0x0210, &wdata);
		if((i & 0xffff) != wdata)
			DPRINTK("FC8000 word test (0x%x,0x%x)\r\n", i & 0xffff, wdata);
	}
	for(i=0;i<1000;i++)
	{
		BBM_LONG_WRITE(NULL, 0x0210, i & 0xffffffff);
		BBM_LONG_READ(NULL, 0x0210, &ldata);
		if((i & 0xffffffff) != ldata)
			DPRINTK("FC8000 long test (0x%x,0x%x)\r\n", i & 0xffffffff, ldata);
	}
	for(i=0;i<1000;i++)
	{
	  temp = i&0xff;
		BBM_TUNER_WRITE(NULL, 0x12, 0x01, &temp, 0x01);
		BBM_TUNER_READ(NULL, 0x12, 0x01, &data, 0x01);
		if((i & 0xff) != data)
			DPRINTK("FC8000 tuner test (0x%x,0x%x)\r\n", i & 0xff, data);
	}
	temp = 0x51;
	BBM_TUNER_WRITE(NULL, 0x12, 0x01, &temp, 0x01 );	
	
#endif
	gBer = 3000;
	gInitFlag = 1;

	return TDMB_SUCCESS;
}