ST_HEADER_INFO LGD_HEADER_CHECK(ST_FIFO* pMainFifo) { LGD_UINT32 ulLoop, ulFrame, ulIndex, ulTotalLength, ulSubChTSize; LGD_UINT16 aunChSize[MAX_CHANNEL_FIFO-1]; LGD_UINT8* ptr; ulFrame = LGD_QFIFO_GET_SIZE(pMainFifo) / MAX_HEADER_SIZE; for(ulIndex = 0; ulIndex < (ulFrame-1); ulIndex++){ ptr = LGD_QFIFO_AT_PTR(pMainFifo); for(ulLoop = 0 ; ulLoop < (MAX_HEADER_SIZE-1); ulLoop++) { if(ptr[ulLoop] == HEADER_ID_0x33 && ptr[ulLoop+1] == HEADER_ID_0x00) { if(ulLoop) pMainFifo->ulRear += ulLoop; ptr = LGD_QFIFO_AT_PTR(pMainFifo); ulTotalLength = ((LGD_UINT16)(ptr[4] << 8) | ptr[5])&0x7FFF; 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]); ulSubChTSize = aunChSize[0] + aunChSize[1] + aunChSize[2] + aunChSize[3] + MAX_HEADER_SIZE; if(ulSubChTSize != ulTotalLength) { LGD_QFIFO_INIT(pMainFifo, 0); return LGD_HEADER_NOT_SEARACH; } if(LGD_QFIFO_GET_SIZE(pMainFifo) < (ulTotalLength + MAX_HEADER_SIZE)) return LGD_HEADER_SIZE_ERROR; ptr = LGD_QFIFO_AT_PTR(pMainFifo); if(ptr[ulTotalLength] == HEADER_ID_0x33 && ptr[ulTotalLength+1] == HEADER_ID_0x00) { return LGD_HEADER_GOOD; } else{ LGD_QFIFO_INIT(pMainFifo, 0); return LGD_HEADER_NOT_SEARACH; } } } if(ptr[ulLoop] == HEADER_ID_0x33) pMainFifo->ulRear += MAX_HEADER_SIZE-1; else pMainFifo->ulRear += MAX_HEADER_SIZE; } return LGD_HEADER_NOT_SEARACH; }
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; }
LGD_UINT8 LGD_QFIFO_AT(PST_FIFO pFF, LGD_UINT8* pData, LGD_UINT32 ulSize) { LGD_UINT32 ulLoop, ulOldRear; if(pFF == LGD_NULL || pData == LGD_NULL || ulSize > LGD_QFIFO_GET_SIZE(pFF)) return LGD_ERROR; ulOldRear = pFF->ulRear; ulLoop = pFF->ulDepth - pFF->ulRear; if(ulLoop >= ulSize) { memcpy(pData, &pFF->acBuff[ulOldRear], ulSize); } else { memcpy(pData, &pFF->acBuff[ulOldRear], ulLoop); memcpy(pData + ulLoop, &pFF->acBuff[0], ulSize - ulLoop); } 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; }