]> oss.titaniummirror.com Git - tinyos-2.x.git/commitdiff
Fixed bug: SSSR register gives fifo length + 1
authorkusy <kusy>
Tue, 27 May 2008 17:28:32 +0000 (17:28 +0000)
committerkusy <kusy>
Tue, 27 May 2008 17:28:32 +0000 (17:28 +0000)
tos/chips/pxa27x/ssp/HalPXA27xSpiPioM.nc

index 2fc7b766067e3bd9b6851aaf964760f266d3e3e6..b2b9234667ae25e1442dc208af6673792a3c90c6 100644 (file)
@@ -47,6 +47,7 @@
  * 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
@@ -63,29 +64,17 @@ generic module HalPXA27xSpiPioM(uint8_t valFRF, uint8_t valSCR, uint8_t valDSS,
 \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
@@ -93,25 +82,21 @@ implementation
     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
@@ -124,133 +109,99 @@ implementation
   }\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