Пример #1
0
void LGD_MULTI_SORT_INIT(void)
{
	LGD_UINT32 	ulLoop;
	ST_FIFO*	pFifo;

	for(ulLoop = 0 ; ulLoop < MAX_CHANNEL_FIFO; ulLoop++){
		pFifo = LGD_GET_CHANNEL_FIFO((MULTI_CHANNEL_INFO)ulLoop);
		LGD_QFIFO_INIT(pFifo, 0);
		pFifo->unSubChID = LGD_SUB_CHANNEL_ID_MASK;
	}
}
int8 tunerbb_drv_lg2102_process_multi_data(uint8 subch_cnt,uint8* input_buf, uint32 input_size, uint32* read_size)
{
	ST_FIFO*	pMultiFF;
	int			nDataSize;
	int			i;
	LGD_UINT32	buf_size = 0;

	if(input_buf == NULL || read_size == NULL)
	{
		return LGD_ERROR;
	}
	
	if(subch_cnt>LGD_MULTI_MAX_CHANNEL) 
	{
		return LGD_ERROR;
	}

	if(LGD_MULTI_FIFO_PROCESS(input_buf, input_size))
	{

		for(i=0;i<subch_cnt;i++)
		{
			/************************************************
			(i==2) => CHANNEL1_STREAM_DATA,
			(i==3) => CHANNEL2_STREAM_DATA,
			(i==4) => CHANNEL3_STREAM_DATA,
			************************************************/
			pMultiFF = LGD_GET_CHANNEL_FIFO(i+2);
			nDataSize = LGD_QFIFO_GET_SIZE(pMultiFF);
			if(nDataSize>=LGD_INTERRUPT_SIZE)
			{				
				buf_size += sizeof(TDMB_BB_HEADER_TYPE) + nDataSize;
			}			
		}
	}
	else
	{
		return LGD_ERROR;
	}

	*read_size = buf_size;

	return LGD_SUCCESS;
}
int8 tunerbb_drv_lg2102_get_multi_data(uint8 subch_cnt, uint8* buf_ptr, uint32 buf_size)
{
	ST_FIFO*	pMultiFF;
	int			nDataSize;
	int			i;
	TDMB_BB_HEADER_TYPE dmb_header;
	LGD_UINT16	uFIBCnt;
	LGD_UINT32	read_size = 0;

	if(buf_ptr == NULL || buf_size == 0)
	{
		return LGD_ERROR;
	}
	
	if(subch_cnt>LGD_MULTI_MAX_CHANNEL) 
	{
		return LGD_ERROR;
	}
	
#ifdef LGD_MULTI_CHANNEL_FIC_UPLOAD
	// (i==1) => FIC_STREAM_DATA,
	pMultiFF = LGD_GET_CHANNEL_FIFO(FIC_STREAM_DATA);
	uFIBCnt = LGD_GET_FIB_CNT(m_ucTransMode);
	nDataSize = LGD_QFIFO_GET_SIZE(pMultiFF);
	if(nDataSize >= (uFIBCnt*FIB_SIZE))
	{
		wFicLen = (uFIBCnt*FIB_SIZE);
		LGD_QFIFO_BRING(pMultiFF, abyBuff, wFicLen);
#ifdef LGD_EWS_SOURCE_ENABLE  
		if(LGD_EWS_PARSING(abyBuff, wFicLen)==LGD_SUCCESS)
		{
			ST_OUTPUT_EWS*	pstEWSMsg;
			LGD_GET_EWS_DB(pstEWSMsg);
			///////////////////////////
			// TO-DO : process EWS Data
			///////////////////////////
		}
#endif			
	}
#endif

	for(i=0;i<subch_cnt;i++)
	{
		/************************************************
		(i==2) => CHANNEL1_STREAM_DATA,
		(i==3) => CHANNEL2_STREAM_DATA,
		(i==4) => CHANNEL3_STREAM_DATA,
		************************************************/
		pMultiFF = LGD_GET_CHANNEL_FIFO(i+2);
		nDataSize = LGD_QFIFO_GET_SIZE(pMultiFF);
		if(nDataSize>=LGD_INTERRUPT_SIZE)
		{
			dmb_header.reserved = 0xDEAD;
			dmb_header.data_type = g_datatype[i];
			dmb_header.size = nDataSize;
			dmb_header.subch_id = g_subch_id[i];
			memcpy(buf_ptr,&dmb_header,sizeof(TDMB_BB_HEADER_TYPE));
			buf_ptr += sizeof(TDMB_BB_HEADER_TYPE);
			read_size += sizeof(TDMB_BB_HEADER_TYPE);
			LGD_QFIFO_BRING(pMultiFF, buf_ptr, nDataSize);
			buf_ptr += nDataSize;
			read_size += nDataSize;
		}			
	}

	if(read_size != buf_size)
	{
		return LGD_ERROR;		
	}
	else
	{
		return LGD_SUCCESS;
	}
}
Пример #4
0
LGD_UINT8 LGD_MULTI_FIFO_PROCESS(LGD_UINT8* pData, LGD_UINT32 ulSize)
{
	LGD_UINT8 cIndex, bIsData = LGD_ERROR;
	LGD_UINT16 aunChSize[MAX_CHANNEL_FIFO-1], unTotalSize=0;
	LGD_UINT16 aunSubChID[MAX_CHANNEL_FIFO-1];

	LGD_UINT8*	ptr;

	ST_FIFO*	pFifo;
	ST_FIFO*	pMainFifo;

	pMainFifo = LGD_GET_CHANNEL_FIFO(MAIN_INPUT_DATA);

	if(pMainFifo->ulDepth<(ulSize+pMainFifo->ulFront))
	{
		unTotalSize = LGD_QFIFO_GET_SIZE(pMainFifo);
		ptr = LGD_QFIFO_AT_PTR(pMainFifo);
		memcpy(pMainFifo->acBuff, ptr, unTotalSize);
		pMainFifo->ulFront = unTotalSize;
		pMainFifo->ulRear = 0;
	}

	LGD_QFIFO_ADD(pMainFifo, pData, ulSize);

	while(1){

		if(LGD_QFIFO_GET_SIZE(pMainFifo) < MAX_HEADER_SIZE) break;
		if(LGD_HEADER_CHECK(pMainFifo) != LGD_HEADER_GOOD) break;

		ptr = LGD_QFIFO_AT_PTR(pMainFifo);
		
		unTotalSize = ((LGD_UINT16)(ptr[4] << 8) | ptr[5])&0x7FFF;

		if(unTotalSize > LGD_QFIFO_GET_SIZE(pMainFifo)) break;

		
		memset(aunChSize, 0 , sizeof(aunChSize));

		aunChSize[0] = LGD_GET_SUBCHANNEL_SIZE(ptr[0x8], ptr[0x9]);
		aunChSize[1] = LGD_GET_SUBCHANNEL_SIZE(ptr[0xA], ptr[0xB]);
		aunChSize[2] = LGD_GET_SUBCHANNEL_SIZE(ptr[0xC], ptr[0xD]);
		aunChSize[3] = LGD_GET_SUBCHANNEL_SIZE(ptr[0xE], ptr[0xF]);

		aunSubChID[0] = LGD_GET_SUBCHANNEL_ID(ptr[0x8]);
		aunSubChID[1] = LGD_GET_SUBCHANNEL_ID(ptr[0xA]);
		aunSubChID[2] = LGD_GET_SUBCHANNEL_ID(ptr[0xC]);
		aunSubChID[3] = LGD_GET_SUBCHANNEL_ID(ptr[0xE]);

		pMainFifo->ulRear += MAX_HEADER_SIZE;

		
		for(cIndex = 0; cIndex < (MAX_CHANNEL_FIFO-1); cIndex++){
			if(!aunChSize[cIndex]) continue;

			pFifo = LGD_GET_CHANNEL_FIFO((MULTI_CHANNEL_INFO)(cIndex+1));

			if(pFifo->unSubChID == LGD_SUB_CHANNEL_ID_MASK)
					pFifo->unSubChID = aunSubChID[cIndex];
			
			while(aunChSize[cIndex] > LGD_CIF_MAX_SIZE)
			{
				ptr = LGD_QFIFO_AT_PTR(pMainFifo);
				LGD_QFIFO_ADD(pFifo, ptr, (LGD_UINT32)LGD_CIF_MAX_SIZE);
				pMainFifo->ulRear += LGD_CIF_MAX_SIZE;
				aunChSize[cIndex] -= LGD_CIF_MAX_SIZE;
			}

			ptr = LGD_QFIFO_AT_PTR(pMainFifo);
			LGD_QFIFO_ADD(pFifo, ptr, (LGD_UINT32)aunChSize[cIndex]);
			pMainFifo->ulRear += aunChSize[cIndex];
		}

		bIsData = LGD_SUCCESS;
	}

	return bIsData;
}