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