* which requires that the transmitter send zeros (0) for this case.\r
* \r
* @author Phil Buonadonna\r
+ * @author Miklos Maroti, Brano Kusy\r
*/\r
\r
generic module HalPXA27xSpiPioM(uint8_t valFRF, uint8_t valSCR, uint8_t valDSS, bool enableRWOT) \r
\r
implementation\r
{\r
- // The BitBuckets need to be 8 bytes. \r
- norace unsigned long long txBitBucket, rxBitBucket;\r
- uint8_t *txCurrentBuf, *rxCurrentBuf, *txPtr, *rxPtr;\r
- uint8_t instanceCurrent;\r
- uint32_t lenCurrent, lenRemain, txInc, rxInc;\r
- norace uint32_t flagsSSCR0, flagsSSCR1;\r
-\r
- task void SpiPacketDone() {\r
- uint8_t *txBuf,*rxBuf;\r
- uint8_t instance;\r
- uint32_t len;\r
+ enum{\r
+ FLAGS_SSCR0 = SSCR0_SCR(valSCR) | SSCR0_FRF(/*0*/valFRF) | SSCR0_DSS(valDSS),\r
+ FLAGS_SSCR1 = 0\r
+ };\r
\r
- atomic {\r
- instance = instanceCurrent;\r
- len = lenCurrent;\r
- txBuf = txCurrentBuf;\r
- rxBuf = rxCurrentBuf;\r
- lenCurrent = 0;\r
- signal SpiPacket.sendDone[instance](txBuf,rxBuf,len,SUCCESS);\r
- }\r
- \r
- return;\r
- }\r
+ // The BitBuckets need to be 8 bytes.\r
+ norace unsigned long long txBitBucket, rxBitBucket;\r
+ norace uint8_t *txCurrentBuf, *rxCurrentBuf, *txPtr, *rxPtr;\r
+ norace uint8_t txInc, rxInc;\r
+ norace uint8_t instanceCurrent;\r
+ uint32_t lenCurrent, lenRemain;\r
\r
command error_t Init.init() {\r
\r
txCurrentBuf = rxCurrentBuf = NULL;\r
lenCurrent = 0 ;\r
instanceCurrent = 0;\r
- lenRemain = 0;\r
+ atomic lenRemain = 0;\r
\r
- flagsSSCR1 = 0;\r
- flagsSSCR0 = (SSCR0_SCR(valSCR) | SSCR0_FRF(/*0*/valFRF) | SSCR0_DSS(valDSS) );\r
-\r
- call SSP.setSSCR1(flagsSSCR1);\r
+ call SSP.setSSCR1(FLAGS_SSCR1);\r
call SSP.setSSTO(3500 /*96*8*/);\r
- call SSP.setSSCR0(flagsSSCR0);\r
- call SSP.setSSCR0(flagsSSCR0 | SSCR0_SSE);\r
+ call SSP.setSSCR0(FLAGS_SSCR0);\r
+ call SSP.setSSCR0(FLAGS_SSCR0 | SSCR0_SSE);\r
\r
return SUCCESS;\r
}\r
\r
async command uint8_t SpiByte.write(uint8_t tx) {\r
- volatile uint32_t tmp;\r
volatile uint8_t val;\r
#if 1\r
while ((call SSP.getSSSR()) & SSSR_RNE) {\r
- tmp = call SSP.getSSDR();\r
+ call SSP.getSSDR();\r
} \r
#endif\r
call SSP.setSSDR(tx); \r
}\r
\r
async command error_t SpiPacket.send[uint8_t instance](uint8_t* txBuf, uint8_t* rxBuf, uint16_t len) {\r
- uint32_t tmp,i;\r
- //uint8_t *txPtr,*rxPtr;\r
- //uint32_t txInc = 1,rxInc = 1;\r
- error_t error = FAIL;\r
+ uint32_t i;\r
\r
#if 1\r
while ((call SSP.getSSSR()) & SSSR_RNE) {\r
- tmp = call SSP.getSSDR();\r
+ call SSP.getSSDR();\r
}\r
#endif \r
\r
- atomic {\r
- txCurrentBuf = txBuf;\r
- rxCurrentBuf = rxBuf;\r
- lenCurrent = lenRemain = len;\r
- instanceCurrent = instance;\r
+ txCurrentBuf = txBuf;\r
+ rxCurrentBuf = rxBuf;\r
+ atomic lenCurrent = lenRemain = len;\r
+ instanceCurrent = instance;\r
+ \r
+ if (rxBuf == NULL) { \r
+ rxPtr = (uint8_t *)&rxBitBucket;\r
+ rxInc = 0;\r
+ }\r
+ else {\r
+ rxPtr = rxBuf;\r
+ rxInc = 1;\r
+ }\r
\r
- if (rxBuf == NULL) { \r
- rxPtr = (uint8_t *)&rxBitBucket; \r
- rxInc = 0;\r
- }\r
- else {\r
- rxPtr = rxBuf; \r
- rxInc = 1;\r
- }\r
- \r
- if (txBuf == NULL) {\r
- txPtr = (uint8_t *)&txBitBucket; \r
- txInc = 0;\r
- }\r
- else {\r
- txPtr = txBuf;\r
- txInc = 1;\r
- }\r
+ if (txBuf == NULL) {\r
+ txPtr = (uint8_t *)&txBitBucket;\r
+ txInc = 0;\r
+ }\r
+ else {\r
+ txPtr = txBuf;\r
+ txInc = 1;\r
}\r
\r
- atomic {\r
- if ((txBuf == NULL) && (enableRWOT == TRUE)) {\r
- \r
- call SSP.setSSCR0(flagsSSCR0);\r
- call SSP.setSSCR1(flagsSSCR1 | SSCR1_RWOT);\r
- call SSP.setSSCR0(flagsSSCR0 | SSCR0_SSE);\r
- while (len > 0) {\r
- while (!(call SSP.getSSSR() & SSSR_RNE));\r
- *rxPtr = call SSP.getSSDR();\r
- rxPtr += rxInc;\r
- len--;\r
- }\r
- call SSP.setSSCR0(flagsSSCR0);\r
- call SSP.setSSCR1(flagsSSCR1);\r
- call SSP.setSSCR0(flagsSSCR0 | SSCR0_SSE);\r
- }\r
- else {\r
- uint8_t burst = (len < 16) ? len : 16;\r
- for (i = 0;i < burst; i++) {\r
- call SSP.setSSDR(*txPtr);\r
- txPtr += txInc;\r
- }\r
- call SSP.setSSCR1(flagsSSCR1 | SSCR1_TINTE | SSCR1_RIE);\r
- /*\r
- while (len > 16) {\r
- for (i = 0;i < 16; i++) {\r
- call SSP.setSSDR(*txPtr);\r
- txPtr += txInc;\r
- }\r
- while (call SSP.getSSSR() & SSSR_BSY);\r
- for (i = 0;i < 16;i++) {\r
- *rxPtr = call SSP.getSSDR();\r
- rxPtr += rxInc;\r
- }\r
- len -= 16;\r
- }\r
- for (i = 0;i < len; i++) {\r
- call SSP.setSSDR(*txPtr);\r
- txPtr += txInc;\r
- }\r
- while (call SSP.getSSSR() & SSSR_BSY);\r
- for (i = 0;i < len;i++) {\r
- *rxPtr = call SSP.getSSDR();\r
- rxPtr += rxInc;\r
- }\r
- */\r
- }\r
+ if ((txBuf == NULL) && (enableRWOT == TRUE)) {\r
+ call SSP.setSSCR0(FLAGS_SSCR0);\r
+ call SSP.setSSCR1(FLAGS_SSCR1 | SSCR1_RWOT);\r
+ call SSP.setSSCR0(FLAGS_SSCR0 | SSCR0_SSE);\r
+ while (len > 0) {\r
+ while (!(call SSP.getSSSR() & SSSR_RNE));\r
+ *rxPtr = call SSP.getSSDR();\r
+ rxPtr += rxInc;\r
+ len--;\r
+ }\r
+ call SSP.setSSCR0(FLAGS_SSCR0);\r
+ call SSP.setSSCR1(FLAGS_SSCR1);\r
+ call SSP.setSSCR0(FLAGS_SSCR0 | SSCR0_SSE);\r
+ }\r
+ else {\r
+ uint8_t burst = (len < 16) ? len : 16;\r
+ for (i = 0;i < burst; i++) {\r
+ call SSP.setSSDR(*txPtr);\r
+ txPtr += txInc;\r
+ }\r
+ call SSP.setSSCR1(FLAGS_SSCR1 | SSCR1_TINTE | SSCR1_RIE);\r
}\r
- //post SpiPacketDone();\r
- \r
- error = SUCCESS;\r
\r
- return error;\r
+ return SUCCESS;\r
}\r
\r
async event void SSP.interruptSSP() {\r
- // For this Hal, we should never get here normally\r
- // Perhaps we should signal any weird errors? For now, just clear the interrupts\r
uint32_t i, uiStatus, uiFifoLevel;\r
uint32_t burst;\r
\r
uiStatus = call SSP.getSSSR();\r
call SSP.setSSSR(SSSR_TINT);\r
\r
- uiFifoLevel = ((uiStatus & SSSR_RFL) >> 12) | 0xFUL;\r
+ uiFifoLevel = (((uiStatus & SSSR_RFL) >> 12) | 0xF) + 1;\r
+ uiFifoLevel = (uiFifoLevel > lenRemain) ? lenRemain : uiFifoLevel;\r
\r
- if ((uiFifoLevel < 0xF) || (uiStatus & SSSR_RNE)) {\r
- //uiFifoLevel = (uiFifoLevel == 0) ? 16 : uiFifoLevel;\r
- uiFifoLevel = (uiFifoLevel > lenRemain) ? lenRemain : uiFifoLevel;\r
- for (i = 0;i < uiFifoLevel;i++) {\r
- *rxPtr = call SSP.getSSDR();\r
- rxPtr += rxInc;\r
- }\r
+ if( !(uiStatus & SSSR_RNE))\r
+ return;\r
+\r
+ for (i = 0; i < uiFifoLevel; i++) {\r
+ *rxPtr = call SSP.getSSDR();\r
+ rxPtr += rxInc;\r
+ }\r
+\r
+ atomic {\r
lenRemain -= uiFifoLevel;\r
+ burst = (lenRemain < 16) ? lenRemain : 16;\r
}\r
- if (lenRemain > 0) {\r
- burst = (lenRemain < uiFifoLevel) ? lenRemain : uiFifoLevel;\r
+\r
+ if (burst > 0) {\r
for (i = 0;i < burst;i++) {\r
- call SSP.setSSDR(*txPtr);\r
- txPtr += txInc;\r
+ call SSP.setSSDR(*txPtr);\r
+ txPtr += txInc;\r
}\r
}\r
else {\r
uint32_t len = lenCurrent;\r
- call SSP.setSSCR1(flagsSSCR1);\r
+ call SSP.setSSCR1(FLAGS_SSCR1);\r
lenCurrent = 0;\r
signal SpiPacket.sendDone[instanceCurrent](txCurrentBuf, rxCurrentBuf,len,SUCCESS);\r
}\r
\r
- /*call SSP.setSSSR(SSSR_BCE | SSSR_TUR | SSSR_EOC | SSSR_TINT | \r
- SSSR_PINT | SSSR_ROR ); */\r
return;\r
}\r
\r