]> oss.titaniummirror.com Git - tinyos-2.x.git/commitdiff
Allow possibly multiple slaves for the Atmega128 SPI bus.
authormmaroti <mmaroti>
Thu, 24 Apr 2008 22:31:25 +0000 (22:31 +0000)
committermmaroti <mmaroti>
Thu, 24 Apr 2008 22:31:25 +0000 (22:31 +0000)
Move the slave select logic from the HPL SPI to the user of the resouce.
This touched the MicaZ SPI access (but not the mica2 which uses its own logic)

tos/chips/atm128/spi/Atm128SpiC.nc
tos/chips/atm128/spi/Atm128SpiP.nc
tos/chips/atm128/spi/HplAtm128SpiP.nc
tos/chips/rf230/RF230LayerP.nc
tos/platforms/iris/chips/rf230/HplRF230C.nc
tos/platforms/micaz/chips/cc2420/HplCC2420SpiC.nc
tos/platforms/micaz/chips/cc2420/HplCC2420SpiP.nc [new file with mode: 0644]

index 637232fd33219e9366e3801d7814ec9bf918afc0..c10a9f573c9b6af3ee18b0831692554cde603ee9 100644 (file)
@@ -70,7 +70,6 @@ configuration Atm128SpiC {
 }
 implementation {
   components Atm128SpiP as SpiMaster, HplAtm128SpiC as HplSpi;
-  components HplAtm128GeneralIOC as IO;
   components new SimpleFcfsArbiterC("Atm128SpiC.Resource") as Arbiter;
   components McuSleepC;
   
@@ -81,7 +80,7 @@ implementation {
   Resource     = SpiMaster;
 
   SpiMaster.ResourceArbiter -> Arbiter;
-  SpiMaster.ArbiterInfo    -> Arbiter;
+  SpiMaster.ArbiterInfo     -> Arbiter;
   SpiMaster.Spi             -> HplSpi;
   SpiMaster.McuPowerState   -> McuSleepC;
 }
index 1c94d6923bc51b38db27a5da89e66165e42afbfa..da7f06298d3b02dede343f8bf047c908969a9d66 100644 (file)
@@ -101,7 +101,6 @@ implementation {
   command error_t Init.init() {
     return SUCCESS;
   }
-  bool started;
   
   void startSpi() {
     call Spi.enableSpi(FALSE);
@@ -119,7 +118,6 @@ implementation {
 
   void stopSpi() {
     call Spi.enableSpi(FALSE);
-    started = FALSE;
     atomic {
       call Spi.sleep();
     }
index b29396d1598df2de7feb701db8e75b5d5037fd6a..17c003f7bbe58c1788bb60c754cfed212e903eb2 100644 (file)
@@ -80,10 +80,9 @@ implementation {
     call MOSI.makeOutput();
     call MISO.makeInput();
     call SCK.makeOutput();
-    call SS.makeOutput();
     call SPI.setMasterBit(TRUE);
-    call SS.clr();
   }
+
   async command void SPI.initSlave() {
     call MISO.makeOutput();
     call MOSI.makeInput();
@@ -93,7 +92,7 @@ implementation {
   }
   
   async command void SPI.sleep() {
-    call SS.set();
+//    call SS.set();   // why was this needed?
   }
   
   async command uint8_t SPI.read()        { return SPDR; }
index 153b9ee1679f665cd58288b7f4f5729022c2ef35..d9d06d5e0fd2de04b0bdd1280437ad8fe5a2a1db 100644 (file)
@@ -236,6 +236,7 @@ implementation
        event void SpiResource.granted()
        {
                // TODO: this should not be here, see my comment in HplRF230C.nc
+               call SELN.makeOutput();
                call SELN.set();
 
                if( state == STATE_P_ON )
@@ -255,6 +256,7 @@ implementation
                if( call SpiResource.immediateRequest() == SUCCESS )
                {
                        // TODO: this should not be here, see my comment in HplRF230C.nc
+                       call SELN.makeOutput();
                        call SELN.set();
 
                        return TRUE;
index 113d47cd7030e53747e70d313afa0b0a4a30b055..91962f7ea93d366f6f3cc12b3033be748c73693c 100644 (file)
@@ -49,8 +49,6 @@ implementation
        HplRF230P.PortCLKM -> IO.PortD6;
        HplRF230P.PortIRQ -> IO.PortD4;
        
-       // TODO: Ask why the HplAtm128SpiC does SlaveSelect via PortB0
-       // TODO: Remove the unused started field from Atm128SpiP
        components Atm128SpiC as SpiC;
        SpiResource = SpiC.Resource[unique("Atm128SpiC.Resource")];
        SpiByte = SpiC;
index 03f283f59f67aee5cd6493b92c13679f0f5bf5fc..2d92cafa226a7fbabb2d99c5be228dd802cbf38b 100644 (file)
@@ -46,10 +46,12 @@ generic configuration HplCC2420SpiC() {
 
 implementation {
 
-  components Atm128SpiC;
+  components Atm128SpiC, HplCC2420SpiP, HplAtm128GeneralIOC as IO;
 
   Init = Atm128SpiC;
-  Resource = Atm128SpiC.Resource[ unique("Atm128SpiC.Resource") ];
+  Resource = HplCC2420SpiP;
+  HplCC2420SpiP.SubResource -> Atm128SpiC.Resource[ unique("Atm128SpiC.Resource") ];
+  HplCC2420SpiP.SS -> IO.PortB0;  // Slave set line
   SpiByte = Atm128SpiC;
   SpiPacket = Atm128SpiC;
 
diff --git a/tos/platforms/micaz/chips/cc2420/HplCC2420SpiP.nc b/tos/platforms/micaz/chips/cc2420/HplCC2420SpiP.nc
new file mode 100644 (file)
index 0000000..9b66317
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2005 Arch Rock Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the
+ *   distribution.
+ * - Neither the name of the Arch Rock Corporation nor the names of
+ *   its contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE
+ */
+
+/**
+ * Automatic slave select update for the SpiResource
+ *
+ * @author Miklos Maroti
+ */
+
+module HplCC2420SpiP
+{
+       provides interface Resource;
+  
+       uses
+       {
+               interface Resource as SubResource;      // raw SPI resource
+               interface GeneralIO as SS;                      // Slave set line
+       }
+}
+
+implementation
+{
+       async command error_t Resource.request()
+       {
+               return call SubResource.request();
+       }
+
+       async command error_t Resource.immediateRequest()
+       {
+               error_t error = call SubResource.immediateRequest();
+               if( error == SUCCESS )
+               {
+                       call SS.makeOutput();
+                       call SS.clr();
+               }
+               return error;
+       }
+
+       event void SubResource.granted()
+       {
+               call SS.makeOutput();
+               call SS.clr();
+
+               signal Resource.granted();
+       }
+       
+       async command error_t Resource.release()
+       {
+               if( call SubResource.isOwner() )
+                       call SS.set();
+
+               return call SubResource.release();
+       }
+
+       async command bool Resource.isOwner()
+       {
+               return call SubResource.isOwner();
+       }
+}