123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483 |
- #include <string.h>
- #include <gfambrtucom.h>
- #include "driverlib/sw_crc.h"
- /////////////////////////////////////////////////////////////////////////////
- #define FIFO_COUNT 2
- #define FIFO_BUFFER_SIZE 256
- #define FIFO_BUFFER_MASK (FIFO_BUFFER_SIZE - 1)
- /////////////////////////////////////////////////////////////////////////////
- typedef struct _FIFOHDR
- {
- volatile size_t nReadPtr;
- volatile size_t nWritePtr;
- volatile size_t nCbData;
- size_t nCbSize;
- size_t nBufferMask;
- volatile uint32_t nFlags;
- GFA_FIFO_BACKEND backend;
- }FIFOHDR, *LPFIFOHDR;
- typedef const FIFOHDR *LPCFIFOHDR;
- /////////////////////////////////////////////////////////////////////////////
- typedef struct _FIFO
- {
- FIFOHDR hdr;
- uint8_t fifo[FIFO_BUFFER_SIZE];
- }FIFO, *LPFIFO;
- typedef const FIFO *LPCFIFO;
- /////////////////////////////////////////////////////////////////////////////
- static FIFO g_fifo[FIFO_COUNT];
- /////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////////
- static int _IsPowerOf2(size_t x)
- {
- return x && !(x & (x - 1));
- }
- /////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////////
- HFIFO GfaMbFifoCreate(int nFifoIndex, LPCGFA_FIFO_BACKEND pBackend)
- {
- LPFIFO p;
- if((nFifoIndex < 0) || (nFifoIndex >= FIFO_COUNT))
- return NULL;
- if(!_IsPowerOf2(FIFO_BUFFER_SIZE))
- return NULL;
- p = &g_fifo[nFifoIndex];
- memset(p, 0, sizeof(FIFO));
- p->hdr.nCbSize = FIFO_BUFFER_SIZE;
- p->hdr.nBufferMask = FIFO_BUFFER_MASK;
- memcpy(&p->hdr.backend, pBackend, sizeof(GFA_FIFO_BACKEND));
- return (HFIFO)p;
- }
- /////////////////////////////////////////////////////////////////////////////
- void GfaMbFifoRelease(HFIFO hFifo)
- {
- }
- /////////////////////////////////////////////////////////////////////////////
- void GfaMbFifoReset(HFIFO hFifo, bool bLock)
- {
- bool bPrevLocked;
- register LPFIFO pf = (LPFIFO)hFifo;
- if(bLock && pf->hdr.backend.pfnLockBackend)
- bPrevLocked = (*pf->hdr.backend.pfnLockBackend)(false);
- pf->hdr.nReadPtr = 0;
- pf->hdr.nWritePtr = 0;
- pf->hdr.nCbData = 0;
- if(bLock && pf->hdr.backend.pfnLockBackend)
- (*pf->hdr.backend.pfnLockBackend)(bPrevLocked);
- }
- /////////////////////////////////////////////////////////////////////////////
- size_t GfaMbFifoRead(HFIFO hFifo, void *pData, size_t nCbData, bool bLock)
- {
- size_t nToRead;
- uint8_t *pByte = (uint8_t*)pData;
- register LPFIFO pf = (LPFIFO)hFifo;
- if(bLock && pf->hdr.backend.pfnLockBackend)
- (*pf->hdr.backend.pfnLockBackend)(false);
- for(nToRead = nCbData; nCbData; --nCbData)
- {
- if((pf->hdr.nWritePtr == pf->hdr.nReadPtr) && !pf->hdr.nCbData)
- break;
- *pByte++ = pf->fifo[pf->hdr.nReadPtr++];
- pf->hdr.nReadPtr &= pf->hdr.nBufferMask;
- pf->hdr.nCbData--;
- }
- if(bLock && pf->hdr.backend.pfnLockBackend)
- (*pf->hdr.backend.pfnLockBackend)(true);
- return nToRead - nCbData;
- }
- /////////////////////////////////////////////////////////////////////////////
- size_t GfaMbFifoWrite(HFIFO hFifo, const void *pData, size_t nCbData, bool bLock)
- {
- size_t nToWrite;
- const uint8_t *pByte = (const uint8_t*)pData;
- register LPFIFO pf = (LPFIFO)hFifo;
- if(bLock && pf->hdr.backend.pfnLockBackend)
- (*pf->hdr.backend.pfnLockBackend)(false);
- for(nToWrite = nCbData; nCbData; --nCbData)
- {
- if((pf->hdr.nCbData == pf->hdr.nCbSize))
- break;
- pf->fifo[pf->hdr.nWritePtr++] = *pByte++;
- pf->hdr.nWritePtr &= pf->hdr.nBufferMask;
- pf->hdr.nCbData++;
- }
- if(bLock && pf->hdr.backend.pfnLockBackend)
- (*pf->hdr.backend.pfnLockBackend)(true);
- return nToWrite - nCbData;
- }
- /////////////////////////////////////////////////////////////////////////////
- bool GfaMbFifoPop(HFIFO hFifo, uint8_t *b, bool bLock)
- {
- bool bRet;
- register LPFIFO pf = (LPFIFO)hFifo;
- if(bLock && pf->hdr.backend.pfnLockBackend)
- {
- (*pf->hdr.backend.pfnLockBackend)(false);
- if((bRet = !!pf->hdr.nCbData))
- {
- *b = pf->fifo[pf->hdr.nReadPtr++];
- pf->hdr.nReadPtr &= pf->hdr.nBufferMask;
- pf->hdr.nCbData--;
- }
- (*pf->hdr.backend.pfnLockBackend)(true);
- }
- else
- {
- if((bRet = !!pf->hdr.nCbData))
- {
- *b = pf->fifo[pf->hdr.nReadPtr++];
- pf->hdr.nReadPtr &= pf->hdr.nBufferMask;
- pf->hdr.nCbData--;
- }
- }
- return bRet;
- }
- /////////////////////////////////////////////////////////////////////////////
- bool GfaMbFifoPush(HFIFO hFifo, uint8_t b, bool bLock)
- {
- bool bRet;
- register LPFIFO pf = (LPFIFO)hFifo;
- if(bLock && pf->hdr.backend.pfnLockBackend)
- {
- (*pf->hdr.backend.pfnLockBackend)(false);
- if((bRet = (pf->hdr.nCbData < pf->hdr.nCbSize)))
- {
- pf->fifo[pf->hdr.nWritePtr++] = b;
- pf->hdr.nWritePtr &= pf->hdr.nBufferMask;
- pf->hdr.nCbData++;
- }
- (*pf->hdr.backend.pfnLockBackend)(true);
- }
- else
- {
- if((bRet = (pf->hdr.nCbData < pf->hdr.nCbSize)))
- {
- pf->fifo[pf->hdr.nWritePtr++] = b;
- pf->hdr.nWritePtr &= pf->hdr.nBufferMask;
- pf->hdr.nCbData++;
- }
- }
- return bRet;
- }
- /////////////////////////////////////////////////////////////////////////////
- size_t GfaMbFifoPeek(HFIFO hFifo, bool bLock)
- {
- bool bPrevLocked;
- size_t nAvail;
- register LPFIFO pf = (LPFIFO)hFifo;
- if(bLock && pf->hdr.backend.pfnLockBackend)
- {
- bPrevLocked = (*pf->hdr.backend.pfnLockBackend)(false);
- nAvail = pf->hdr.nCbData;
- if(bPrevLocked)
- (*pf->hdr.backend.pfnLockBackend)(true);
- return nAvail;
- }
- else
- return pf->hdr.nCbData;
- }
- /////////////////////////////////////////////////////////////////////////////
- bool GfaMbFifoCanWrite(HFIFO hFifo, bool bLock)
- {
- bool bPrevLocked, bCanWrite;
- register LPFIFO pf = (LPFIFO)hFifo;
- if(bLock && pf->hdr.backend.pfnLockBackend)
- {
- bPrevLocked = (*pf->hdr.backend.pfnLockBackend)(false);
- bCanWrite = (pf->hdr.nWritePtr != pf->hdr.nReadPtr) || !pf->hdr.nCbData;
- if(bPrevLocked)
- (*pf->hdr.backend.pfnLockBackend)(true);
- return bCanWrite;
- }
- else
- return (pf->hdr.nWritePtr != pf->hdr.nReadPtr) || !pf->hdr.nCbData;
- }
- /////////////////////////////////////////////////////////////////////////////
- bool GfaMbFifoEmpty(HFIFO hFifo, bool bLock)
- {
- bool bPrevLocked, bEmpty;
- register LPFIFO pf = (LPFIFO)hFifo;
- if(bLock && pf->hdr.backend.pfnLockBackend)
- {
- bPrevLocked = (*pf->hdr.backend.pfnLockBackend)(false);
- bEmpty = !pf->hdr.nCbData;
- if(bPrevLocked)
- (*pf->hdr.backend.pfnLockBackend)(true);
- return bEmpty;
- }
- else
- return !pf->hdr.nCbData;
- }
- /////////////////////////////////////////////////////////////////////////////
- bool GfaMbFifoRxPrepare(HFIFO hFifo, bool bLock)
- {
- bool bPrevLocked, bRet = false;
- register LPFIFO pf = (LPFIFO)hFifo;
- if(pf->hdr.backend.pfnRxPrepare)
- {
- if(bLock && pf->hdr.backend.pfnLockBackend)
- {
- bPrevLocked = (*pf->hdr.backend.pfnLockBackend)(false);
- bRet = (*pf->hdr.backend.pfnRxPrepare)();
- if(bPrevLocked)
- (*pf->hdr.backend.pfnLockBackend)(true);
- }
- else
- bRet = (*pf->hdr.backend.pfnRxPrepare)();
- }
- return bRet;
- }
- /////////////////////////////////////////////////////////////////////////////
- void GfaMbFifoRxStart(HFIFO hFifo, bool bLock)
- {
- bool bPrevLocked;
- register LPFIFO pf = (LPFIFO)hFifo;
- if(pf->hdr.backend.pfnRxStart)
- {
- if(bLock && pf->hdr.backend.pfnLockBackend)
- {
- bPrevLocked = (*pf->hdr.backend.pfnLockBackend)(false);
- (*pf->hdr.backend.pfnRxStart)();
- if(bPrevLocked)
- (*pf->hdr.backend.pfnLockBackend)(true);
- }
- else
- (*pf->hdr.backend.pfnRxStart)();
- }
- }
- /////////////////////////////////////////////////////////////////////////////
- bool GfaMbFifoRxFinalize(HFIFO hFifo, bool bLock)
- {
- bool bPrevLocked, bRet = false;
- register LPFIFO pf = (LPFIFO)hFifo;
- if(pf->hdr.backend.pfnRxFinalize)
- {
- if(bLock && pf->hdr.backend.pfnLockBackend)
- {
- bPrevLocked = (*pf->hdr.backend.pfnLockBackend)(false);
- bRet = (*pf->hdr.backend.pfnRxFinalize)();
- if(bPrevLocked)
- (*pf->hdr.backend.pfnLockBackend)(true);
- }
- else
- bRet = (*pf->hdr.backend.pfnRxFinalize)();
- }
- return bRet;
- }
- /////////////////////////////////////////////////////////////////////////////
- bool GfaMbFifoTxPrepare(HFIFO hFifo, bool bLock)
- {
- bool bPrevLocked, bRet = false;
- register LPFIFO pf = (LPFIFO)hFifo;
- if(pf->hdr.backend.pfnTxPrepare)
- {
- if(bLock && pf->hdr.backend.pfnLockBackend)
- {
- bPrevLocked = (*pf->hdr.backend.pfnLockBackend)(false);
- bRet = (*pf->hdr.backend.pfnTxPrepare)();
- if(bPrevLocked)
- (*pf->hdr.backend.pfnLockBackend)(true);
- }
- else
- bRet = (*pf->hdr.backend.pfnTxPrepare)();
- }
- return bRet;
- }
- /////////////////////////////////////////////////////////////////////////////
- void GfaMbFifoTxStart(HFIFO hFifo, bool bLock)
- {
- bool bPrevLocked;
- register LPFIFO pf = (LPFIFO)hFifo;
- if(pf->hdr.backend.pfnTxStart)
- {
- if(bLock && pf->hdr.backend.pfnLockBackend)
- {
- bPrevLocked = (*pf->hdr.backend.pfnLockBackend)(false);
- (*pf->hdr.backend.pfnTxStart)();
- if(bPrevLocked)
- (*pf->hdr.backend.pfnLockBackend)(true);
- }
- else
- (*pf->hdr.backend.pfnTxStart)();
- }
- }
- /////////////////////////////////////////////////////////////////////////////
- bool GfaMbFifoTxFinalize(HFIFO hFifo, bool bLock)
- {
- bool bPrevLocked, bRet = false;
- register LPFIFO pf = (LPFIFO)hFifo;
- if(pf->hdr.backend.pfnTxFinalize)
- {
- if(bLock && pf->hdr.backend.pfnLockBackend)
- {
- bPrevLocked = (*pf->hdr.backend.pfnLockBackend)(false);
- bRet = (*pf->hdr.backend.pfnTxFinalize)();
- if(bPrevLocked)
- (*pf->hdr.backend.pfnLockBackend)(true);
- }
- else
- bRet = (*pf->hdr.backend.pfnTxFinalize)();
- }
- return bRet;
- }
- /////////////////////////////////////////////////////////////////////////////
- void GfaMbFifoSetFlags(HFIFO hFifo, uint32_t nFlags, bool bLock)
- {
- bool bPrevLocked;
- register LPFIFO pf = (LPFIFO)hFifo;
- if(bLock && pf->hdr.backend.pfnLockBackend)
- {
- bPrevLocked = (*pf->hdr.backend.pfnLockBackend)(false);
- pf->hdr.nFlags |= nFlags;
- if(bPrevLocked)
- (*pf->hdr.backend.pfnLockBackend)(true);
- }
- else
- pf->hdr.nFlags |= nFlags;
- }
- /////////////////////////////////////////////////////////////////////////////
- void GfaMbFifoClearFlags(HFIFO hFifo, uint32_t nFlags, bool bLock)
- {
- bool bPrevLocked;
- register LPFIFO pf = (LPFIFO)hFifo;
- if(bLock && pf->hdr.backend.pfnLockBackend)
- {
- bPrevLocked = (*pf->hdr.backend.pfnLockBackend)(false);
- pf->hdr.nFlags &= ~nFlags;
- if(bPrevLocked)
- (*pf->hdr.backend.pfnLockBackend)(true);
- }
- else
- pf->hdr.nFlags &= ~nFlags;
- }
- /////////////////////////////////////////////////////////////////////////////
- uint32_t GfaMbFifoGetFlags(HFIFO hFifo, bool bLock)
- {
- uint32_t nFlags;
- bool bPrevLocked;
- register LPFIFO pf = (LPFIFO)hFifo;
- if(bLock && pf->hdr.backend.pfnLockBackend)
- {
- bPrevLocked = (*pf->hdr.backend.pfnLockBackend)(false);
- nFlags = pf->hdr.nFlags;
- if(bPrevLocked)
- (*pf->hdr.backend.pfnLockBackend)(true);
- return nFlags;
- }
- else
- return pf->hdr.nFlags;
- }
- bool GfaMbFifoMatchFlags(HFIFO hFifo, uint32_t nFlags, bool bLock)
- {
- bool bMatch;
- bool bPrevLocked;
- register LPFIFO pf = (LPFIFO)hFifo;
- if(bLock && pf->hdr.backend.pfnLockBackend)
- {
- bPrevLocked = (*pf->hdr.backend.pfnLockBackend)(false);
- bMatch = (pf->hdr.nFlags & nFlags) == nFlags;
- if(bPrevLocked)
- (*pf->hdr.backend.pfnLockBackend)(true);
- return bMatch;
- }
- else
- return (pf->hdr.nFlags & nFlags) == nFlags;
- }
- uint16_t GfaMbFifoCalcCRC(HFIFO hFifo, bool bLock)
- {
- bool bPrevLocked = false;
- register LPFIFO pf = (LPFIFO)hFifo;
- if(bLock && pf->hdr.backend.pfnLockBackend)
- bPrevLocked = (*pf->hdr.backend.pfnLockBackend)(false);
- if(!pf->hdr.nCbData)
- {
- if(bLock && pf->hdr.backend.pfnLockBackend)
- (*pf->hdr.backend.pfnLockBackend)(bPrevLocked);
- return 0;
- }
- size_t nCbData = pf->hdr.nCbData;
- size_t nReadPtr = pf->hdr.nReadPtr;
- uint8_t b;
- uint16_t nCrcSw = 0xFFFF;
- while(nCbData--) // calculate the CRC
- {
- b = pf->fifo[nReadPtr++];
- nReadPtr &= pf->hdr.nBufferMask;
- nCrcSw = Crc16(nCrcSw, &b, 1);
- }
- if(bLock && pf->hdr.backend.pfnLockBackend)
- (*pf->hdr.backend.pfnLockBackend)(bPrevLocked);
- return nCrcSw;
- }
|