| |
| |
| #include "fifo_buffer.h" |
| |
| |
| |
| u32 FIFO_InitBuffer(tHANDLE *hBuffer, u32 u32BufferLength) |
| { |
| u32 u32Error = 0; |
| tstrFifoHandler *pstrFifoHandler = WILC_MALLOC (sizeof (tstrFifoHandler)); |
| if (pstrFifoHandler) { |
| WILC_memset (pstrFifoHandler, 0, sizeof (tstrFifoHandler)); |
| pstrFifoHandler->pu8Buffer = WILC_MALLOC (u32BufferLength); |
| if (pstrFifoHandler->pu8Buffer) { |
| pstrFifoHandler->u32BufferLength = u32BufferLength; |
| WILC_memset (pstrFifoHandler->pu8Buffer, 0, u32BufferLength); |
| /* create semaphore */ |
| sema_init(&pstrFifoHandler->SemBuffer, 1); |
| *hBuffer = pstrFifoHandler; |
| } else { |
| *hBuffer = NULL; |
| u32Error = 1; |
| } |
| } else { |
| u32Error = 1; |
| } |
| return u32Error; |
| } |
| u32 FIFO_DeInit(tHANDLE hFifo) |
| { |
| u32 u32Error = 0; |
| tstrFifoHandler *pstrFifoHandler = (tstrFifoHandler *) hFifo; |
| if (pstrFifoHandler) { |
| if (pstrFifoHandler->pu8Buffer) { |
| WILC_FREE (pstrFifoHandler->pu8Buffer); |
| } else { |
| u32Error = 1; |
| } |
| |
| WILC_FREE (pstrFifoHandler); |
| } else { |
| u32Error = 1; |
| } |
| return u32Error; |
| } |
| |
| u32 FIFO_ReadBytes(tHANDLE hFifo, u8 *pu8Buffer, u32 u32BytesToRead, u32 *pu32BytesRead) |
| { |
| u32 u32Error = 0; |
| tstrFifoHandler *pstrFifoHandler = (tstrFifoHandler *) hFifo; |
| if (pstrFifoHandler && pu32BytesRead) { |
| if (pstrFifoHandler->u32TotalBytes) { |
| down(&pstrFifoHandler->SemBuffer); |
| |
| if (u32BytesToRead > pstrFifoHandler->u32TotalBytes) { |
| *pu32BytesRead = pstrFifoHandler->u32TotalBytes; |
| } else { |
| *pu32BytesRead = u32BytesToRead; |
| } |
| if ((pstrFifoHandler->u32ReadOffset + u32BytesToRead) <= pstrFifoHandler->u32BufferLength) { |
| WILC_memcpy(pu8Buffer, pstrFifoHandler->pu8Buffer + pstrFifoHandler->u32ReadOffset, |
| *pu32BytesRead); |
| /* update read offset and total bytes */ |
| pstrFifoHandler->u32ReadOffset += u32BytesToRead; |
| pstrFifoHandler->u32TotalBytes -= u32BytesToRead; |
| |
| } else { |
| u32 u32FirstPart = |
| pstrFifoHandler->u32BufferLength - pstrFifoHandler->u32ReadOffset; |
| WILC_memcpy(pu8Buffer, pstrFifoHandler->pu8Buffer + pstrFifoHandler->u32ReadOffset, |
| u32FirstPart); |
| WILC_memcpy(pu8Buffer + u32FirstPart, pstrFifoHandler->pu8Buffer, |
| u32BytesToRead - u32FirstPart); |
| /* update read offset and total bytes */ |
| pstrFifoHandler->u32ReadOffset = u32BytesToRead - u32FirstPart; |
| pstrFifoHandler->u32TotalBytes -= u32BytesToRead; |
| } |
| up(&pstrFifoHandler->SemBuffer); |
| } else { |
| u32Error = 1; |
| } |
| } else { |
| u32Error = 1; |
| } |
| return u32Error; |
| } |
| |
| u32 FIFO_WriteBytes(tHANDLE hFifo, u8 *pu8Buffer, u32 u32BytesToWrite, bool bForceOverWrite) |
| { |
| u32 u32Error = 0; |
| tstrFifoHandler *pstrFifoHandler = (tstrFifoHandler *) hFifo; |
| if (pstrFifoHandler) { |
| if (u32BytesToWrite < pstrFifoHandler->u32BufferLength) { |
| if ((pstrFifoHandler->u32TotalBytes + u32BytesToWrite) <= pstrFifoHandler->u32BufferLength || |
| bForceOverWrite) { |
| down(&pstrFifoHandler->SemBuffer); |
| if ((pstrFifoHandler->u32WriteOffset + u32BytesToWrite) <= pstrFifoHandler->u32BufferLength) { |
| WILC_memcpy(pstrFifoHandler->pu8Buffer + pstrFifoHandler->u32WriteOffset, pu8Buffer, |
| u32BytesToWrite); |
| /* update read offset and total bytes */ |
| pstrFifoHandler->u32WriteOffset += u32BytesToWrite; |
| pstrFifoHandler->u32TotalBytes += u32BytesToWrite; |
| |
| } else { |
| u32 u32FirstPart = |
| pstrFifoHandler->u32BufferLength - pstrFifoHandler->u32WriteOffset; |
| WILC_memcpy(pstrFifoHandler->pu8Buffer + pstrFifoHandler->u32WriteOffset, pu8Buffer, |
| u32FirstPart); |
| WILC_memcpy(pstrFifoHandler->pu8Buffer, pu8Buffer + u32FirstPart, |
| u32BytesToWrite - u32FirstPart); |
| /* update read offset and total bytes */ |
| pstrFifoHandler->u32WriteOffset = u32BytesToWrite - u32FirstPart; |
| pstrFifoHandler->u32TotalBytes += u32BytesToWrite; |
| } |
| /* if data overwriten */ |
| if (pstrFifoHandler->u32TotalBytes > pstrFifoHandler->u32BufferLength) { |
| /* adjust read offset to the oldest data available */ |
| pstrFifoHandler->u32ReadOffset = pstrFifoHandler->u32WriteOffset; |
| /* data availabe is the buffer length */ |
| pstrFifoHandler->u32TotalBytes = pstrFifoHandler->u32BufferLength; |
| } |
| up(&pstrFifoHandler->SemBuffer); |
| } else { |
| u32Error = 1; |
| } |
| } else { |
| u32Error = 1; |
| } |
| } else { |
| u32Error = 1; |
| } |
| return u32Error; |
| } |