static void mtv319_pull_data(void) { U8 ifreg, istatus; RTV_GUARD_LOCK; RTV_REG_MAP_SEL(SPI_CTRL_PAGE); ifreg = RTV_REG_GET(0x55); if (ifreg != 0xAA) { mtv319_spi_recover(stream_buff, MTV319_INTERRUPT_SIZE); DPRINTK("Interface error 1\n"); } istatus = RTV_REG_GET(0x10); if (istatus & (U8)(~SPI_INTR_BITS)) { mtv319_spi_recover(stream_buff, MTV319_INTERRUPT_SIZE); DPRINTK("Interface error 2 (0x%02X)\n", istatus); goto exit_read_mem; } if (istatus & SPI_UNDERFLOW_INTR) { RTV_REG_SET(0x2A, 1); RTV_REG_SET(0x2A, 0); DPRINTK("UDF: 0x%02X\n", istatus); goto exit_read_mem; } if (istatus & SPI_THRESHOLD_INTR) { RTV_REG_MAP_SEL(SPI_MEM_PAGE); RTV_REG_BURST_GET(0x10, stream_buff, MTV319_INTERRUPT_SIZE); tdmb_store_data(stream_buff, MTV319_INTERRUPT_SIZE); if (istatus & SPI_OVERFLOW_INTR) DPRINTK("OVF: 0x%02X\n", istatus); /* To debug */ } else DPRINTK("No data interrupt (0x%02X)\n", istatus); exit_read_mem: RTV_GUARD_FREE; }
static void mtv318_pull_data(void) { unsigned char int_type_val1; unsigned char int_type_val2; RTV_GUARD_LOCK; RTV_REG_MAP_SEL(DD_PAGE); int_type_val1 = RTV_REG_GET(INT_E_STATL); int_type_val2 = RTV_REG_GET(INT_E_STATH); /*=========================================== * Processing MSC1 interrupt. * T-DMB/DAB: 1 VIDEO data or 1 AUDIO data * 1 seg: 1 VIDEO data * FM: PCM data *===========================================*/ /* MSC1 memory overflow or under run */ if (int_type_val1&(MSC1_E_INT|MSC1_E_OVER_FLOW|MSC1_E_UNDER_FLOW)) { if (int_type_val1 & (MSC1_E_OVER_FLOW|MSC1_E_UNDER_FLOW)) { rtv_ClearAndSetupMemory_MSC1(); /* MSC1 Interrupt status clear */ RTV_REG_SET(INT_E_UCLRL, 0x04); } else { /* Get the frame data using CPU or DMA. RTV_REG_BURST_GET() macro should implemented by user. */ RTV_REG_MAP_SEL(MSC1_PAGE); RTV_REG_BURST_GET(0x10, stream_buff, MTV318_INTERRUPT_SIZE+1); RTV_REG_MAP_SEL(DD_PAGE); /* MSC1 Interrupt status clear */ RTV_REG_SET(INT_E_UCLRL, 0x04); tdmb_store_data(&stream_buff[1], MTV318_INTERRUPT_SIZE); } } RTV_GUARD_FREE; }
/*------------------------------------------------------------------------------------- int8 tunerbb_drv_mtv319_read_data(uint8* buffer, uint32* buffer_size) (1) Reading MSC or MSC + FIC etc Data. This function is used in EBI2 HOST Interface (2) Return Value Sucess : 1 Fail : 0 or negative interger (If there is error code) (3) Argument uint8* buffer (IN/OUT) - buffer for Data uint32* buffer_size (IN /OUT) - Data Size <notice> This function is used in only EBI2 HOST Interface --------------------------------------------------------------------------------------- */ int8 tunerbb_drv_mtv319_read_data(uint8* buffer, uint32* buffer_size) { #if defined(STREAM_SLAVE_PARALLEL_UPLOAD) || defined(STREAM_SPI_UPLOAD) #if defined(SPI_INTERFACE_CHECK) uint8 ifreg, ifreg2; UINT i; #endif uint8 istatus; UINT intr_size, num_read_ts_chunk, tsp_read_len = 0; TDMB_BB_HEADER_TYPE *dmb_header = (TDMB_BB_HEADER_TYPE *)buffer; uint8 *tspb_ptr = (uint8 *)(buffer + sizeof(TDMB_BB_HEADER_TYPE)); uint8 intr_cnt; #define MAX_NUM_READ_THRESHOLD_INTR 4 *buffer_size = 0; /* Init */ RTV_GUARD_LOCK; intr_size = rtvTDMB_GetInterruptLevelSize(); RTV_REG_MAP_SEL(SPI_CTRL_PAGE); #if defined(SPI_INTERFACE_CHECK) for (i = 0; i < 10; i++) { ifreg = RTV_REG_GET(0x55); ifreg2 = RTV_REG_GET(0x56); if ((ifreg == 0xAA) && (ifreg2 == 0xAA)) break; else { mtv319_spi_recover(buffer, MTV319_SPI_CMD_SIZE + intr_size); DMBMSG("(%u) Interface error 1\n", i); } } #endif istatus = RTV_REG_GET(0x10); if (istatus & (U8)(~SPI_INTR_BITS)) { mtv319_spi_recover(buffer, MTV319_SPI_CMD_SIZE + intr_size); RTV_REG_SET(0x2A, 1); RTV_REG_SET(0x2A, 0); DMBMSG("Interface error 2 (0x%02X)\n", istatus); goto exit_read_mem; } if (istatus & SPI_UNDERFLOW_INTR) { RTV_REG_SET(0x2A, 1); RTV_REG_SET(0x2A, 0); DMBMSG("UDF: 0x%02X\n", istatus); goto exit_read_mem; } if (istatus & SPI_THRESHOLD_INTR) { #if 0 if (!(istatus & SPI_OVERFLOW_INTR)) num_read_ts_chunk = 1; else num_read_ts_chunk = MAX_NUM_READ_THRESHOLD_INTR; /* Overflow */ #else num_read_ts_chunk = 1; #endif //DMBMSG("num_read_ts_chunk (%u)\n", num_read_ts_chunk); RTV_REG_MAP_SEL(SPI_CTRL_PAGE); intr_cnt = RTV_REG_GET(0x12); if (intr_cnt > 1) DMBMSG("1 more threshold interrupt(%d)\n", intr_cnt); RTV_REG_MAP_SEL(SPI_MEM_PAGE); do { RTV_REG_BURST_GET(0x10, tspb_ptr, intr_size); //print_tsp(tspb_ptr, intr_size); /* To debug */ tspb_ptr += intr_size; tsp_read_len += intr_size; } while (--num_read_ts_chunk); if (istatus & SPI_OVERFLOW_INTR) DMBMSG("OVF: 0x%02X\n", istatus); /* To debug */ dmb_header->size = tsp_read_len; dmb_header->data_type = opened_subch_info[0].data_type; *buffer_size = sizeof(TDMB_BB_HEADER_TYPE) + tsp_read_len; } else { RTV_REG_MAP_SEL(SPI_CTRL_PAGE); mtv319_spi_recover(buffer, MTV319_SPI_CMD_SIZE + intr_size); RTV_REG_SET(0x2A, 1); RTV_REG_SET(0x2A, 0); DMBMSG("No data interrupt (0x%02X)\n", istatus); } exit_read_mem: RTV_GUARD_FREE; return MTV319_RESULT_SUCCESS; #elif defined(STREAM_TS_UPLOAD) return MTV319_RESULT_ERROR; #endif }