I32U Tcc353xGetStreamBuffer(I32S _moduleIndex, I08U * _buff, I32U _size) { I32U tsSize = 0; I32U totalSize = 0; I32U rp; I32U wp; I32U nextRp; TcpalSemaphoreLock(&Tcc353xStreamSema); rp = Tcc353xStreamRp[_moduleIndex]; wp = Tcc353xStreamWp[_moduleIndex]; Tcc353xStreamFlushFlag[_moduleIndex] = 0; TcpalSemaphoreUnLock(&Tcc353xStreamSema); if(rp > wp) totalSize = wp + (TCC353X_STREAM_BUFFER_SIZE - rp); else if (rp < wp) totalSize = wp - rp; else totalSize = 0; if(_size > totalSize) tsSize = totalSize; else tsSize = _size; tsSize = tsSize - (tsSize%188); if (tsSize<188) { return 0; } nextRp = ((rp+tsSize)%TCC353X_STREAM_BUFFER_SIZE); if(rp+tsSize>TCC353X_STREAM_BUFFER_SIZE) { /* read twice */ I32U first; I32U remain; first = TCC353X_STREAM_BUFFER_SIZE - rp; remain = nextRp; TcpalMemcpy (&_buff[0], &Tcc353xStreamData[rp], first); TcpalMemcpy (&_buff[first], &Tcc353xStreamData[0], nextRp); } else { TcpalMemcpy (&_buff[0], &Tcc353xStreamData[rp], tsSize); } TcpalSemaphoreLock(&Tcc353xStreamSema); if(Tcc353xStreamFlushFlag[_moduleIndex]!=0) { /* no update read pointer & no push data */ Tcc353xStreamFlushFlag[_moduleIndex] = 0; tsSize = 0; } else { Tcc353xStreamRp[_moduleIndex] = nextRp; if(Tcc353xStreamBufferedSize[0]>=tsSize) Tcc353xStreamBufferedSize[0] -= tsSize; } TcpalSemaphoreUnLock(&Tcc353xStreamSema); return tsSize; }
I32S Tcc353xAdaptI2CWriteEx(I08U raddr, I08U* txdata, I32S length) { #if !defined (_TCSPI_ONLY_) I32S rc; I32S cMax, remain; I32S i; struct i2c_msg msg; TcpalMemset (&msg, 0x00, sizeof(struct i2c_msg)); cMax = length / MAX_I2C_BURST; remain = length % MAX_I2C_BURST; msg.addr = TcpalI2cClient->addr; msg.flags = 0; msg.len = MAX_I2C_BURST+1; msg.buf = (unsigned char*)I2cBuffer; I2cBuffer[0] = (unsigned char) (raddr); for (i = 0; i < cMax; i++) { TcpalMemcpy(&I2cBuffer[1], &txdata[i * MAX_I2C_BURST], MAX_I2C_BURST); msg.len = MAX_I2C_BURST+1; msg.buf = (unsigned char*)I2cBuffer; rc = i2c_transfer(TcpalI2cClient->adapter, &msg, 1); if(rc < 0) { TcpalPrintErr((I08S *)"[dtv][tcc3536][error] fail rc=%d, addr=0x%X, data=0x%02x\n", (int)rc, (unsigned int)TcpalI2cClient->addr, (unsigned int)txdata[1]); return TCC353X_RETURN_FAIL; } } if (remain) { TcpalMemcpy(&I2cBuffer[1], &txdata[cMax * MAX_I2C_BURST], remain); msg.len = remain+1; msg.buf = (unsigned char*)I2cBuffer; rc = i2c_transfer(TcpalI2cClient->adapter, &msg, 1); if(rc < 0) { TcpalPrintErr((I08S *)"[dtv][tcc3536][error] fail rc=%d, addr=0x%X, data=0x%02x\n", (int)rc, (unsigned int)TcpalI2cClient->addr, (unsigned int)txdata[1]); return TCC353X_RETURN_FAIL; } } #endif return TCC353X_RETURN_SUCCESS; }