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; } }
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; }