[Tinyos-2-commits] CVS: tinyos-2.x/tos/chips/pxa27x/i2c HalPXA27xI2CMasterP.nc, 1.1.2.1, 1.1.2.2 HplPXA27xI2C.nc, 1.1.2.1, 1.1.2.2 HplPXA27xI2CP.nc, 1.1.2.2, 1.1.2.3

Philip Buonadonna philipb at users.sourceforge.net
Fri Jun 16 11:57:07 PDT 2006


Update of /cvsroot/tinyos/tinyos-2.x/tos/chips/pxa27x/i2c
In directory sc8-pr-cvs10.sourceforge.net:/tmp/cvs-serv17103

Modified Files:
      Tag: tinyos-2_0_devel-BRANCH
	HalPXA27xI2CMasterP.nc HplPXA27xI2C.nc HplPXA27xI2CP.nc 
Log Message:
Updates to PXA27x I2C components

Index: HalPXA27xI2CMasterP.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/tos/chips/pxa27x/i2c/Attic/HalPXA27xI2CMasterP.nc,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -C2 -d -r1.1.2.1 -r1.1.2.2
*** HalPXA27xI2CMasterP.nc	1 Mar 2006 03:28:42 -0000	1.1.2.1
--- HalPXA27xI2CMasterP.nc	16 Jun 2006 18:57:05 -0000	1.1.2.2
***************
*** 36,45 ****
   */
  
! #include <I2CFlags.h>
  
  module HalPXA27xI2CMasterP
  {
    provides interface Init;
!   provides interface I2CPacketAdv;
  
    uses interface HplPXA27xI2C as I2C;
--- 36,45 ----
   */
  
! #include <I2C.h>
  
  module HalPXA27xI2CMasterP
  {
    provides interface Init;
!   provides interface I2CPacket<TI2CBasicAddr>;
  
    uses interface HplPXA27xI2C as I2C;
***************
*** 48,55 ****
  implementation
  {
    enum {
      I2C_STATE_IDLE,
      I2C_STATE_READSTART,
!     I2C_STATE_READDATA,
      I2C_STATE_READEND,
      I2C_STATE_WRITE,
--- 48,58 ----
  implementation
  {
+   // These states don't necessarily reflect the state of the I2C bus, rather the state of this
+   // module WRT an operation.  I.E. the module might be in STATE_IDLE, but the I2C bus still
+   // held by the master for a continued read.
    enum {
      I2C_STATE_IDLE,
      I2C_STATE_READSTART,
!     I2C_STATE_READ,
      I2C_STATE_READEND,
      I2C_STATE_WRITE,
***************
*** 63,66 ****
--- 66,104 ----
    i2c_flags_t mCurFlags;
    const uint32_t mBaseICRFlags = (ICR_FM | ICR_BEIE | ICR_IUE | ICR_SCLE);
+ 
+   static void readNextByte() {
+     if (mCurBufIndex >= (mCurBufLen - 1)) {
+       mI2CState = I2C_STATE_READEND;
+       if (mI2CFlags & I2C_STOP) {
+ 	call I2C.setICR((mBaseICRFlags) | (ICR_ALDIE | ICR_DRFIE | ICR_ACKNAK | ICR_TB | ICR_STOP));
+       }
+       else if (mI2C_FLAGS & I2C_ACK_END) {
+ 	call I2C.setICR((mBaseICRFlags) | (ICR_ALDIE | ICR_DRFIE | ICR_TB));
+       }
+       else {
+ 	call I2C.setICR((mBaseICRFlags) | (ICR_ALDIE | ICR_DRFIE | ICR_ACKNAK | ICR_TB));
+       }
+     }
+     else {
+       call I2C.setICR((mBaseICRFlags) | (ICR_ALDIE | ICR_DRFIE | ICR_TB));
+     }
+     return;
+   }
+ 
+   static void writeNextByte() {
+     if (mCurBufIndex >= mCurBufLen) {
+       mI2CState = I2C_STATE_WRITEEND;
+       if (mI2CFlags & I2C_STOP) {
+ 	call I2C.setICR((mBaseICRFlags) | (ICR_ALDIE | ICR_TB | ICR_STOP));
+       }
+       else {
+ 	call I2C.setICR((mBaseICRFlags) | (ICR_ALDIE | ICR_TB));
+       }
+     }
+     else {
+       call I2C.setICR((mBaseICRfFlags) | (ICR_ALDIE | ICR_TB));
+     }
+     return;
+   }
    
    static error_t startI2CTransact(uint8_t nextState, uint16_t addr, uint8_t length, uint8_t *data, 
***************
*** 90,106 ****
      }
  
!     if (call I2C.getISR() | ISR_UB) {
!       return EBUSY;
      }
- 
-     tmpAddr = (rRnW) ? 0x1 : 0x0;
-     tmpAddr |= ((addr << 1) & 0xFE);
- 
-     call I2C.setIDBR(tmpAddr);
-     call I2C.setICR( mBaseICRFlags | ICR_ITEIE | ICR_TB | ICR_START);
-     
      return error;
    }
  
    task void handleReadError() {
      call I2C.setISR(0x7F0);
--- 128,151 ----
      }
  
!     if (flags & I2C_START) {
!       tmpAddr = (rRnW) ? 0x1 : 0x0;
!       tmpAddr |= ((addr << 1) & 0xFE);
!       call I2C.setIDBR(tmpAddr);
!       call I2C.setICR( mBaseICRFlags | ICR_ITEIE | ICR_TB | ICR_START);
!     }
!     else if (bRnW) {
!       atomic {
! 	readNextByte();
!       }
!     }
!     else {
!       atomic {
! 	writeNextByte();
!       }
      }
      return error;
    }
  
+ 
    task void handleReadError() {
      call I2C.setISR(0x7F0);
***************
*** 110,114 ****
      mI2CState = I2C_STATE_IDLE;
      atomic {
!       signal I2CPacketAdv.readPacketDone(mCurTargetAddr,mCurBufLen,mCurBuf,FAIL);
      }
      return;
--- 155,159 ----
      mI2CState = I2C_STATE_IDLE;
      atomic {
!       signal I2CPacket.readDone(FAIL,mCurTargetAddr,mCurBufLen,mCurBuf);
      }
      return;
***************
*** 122,126 ****
      mI2CState = I2C_STATE_IDLE;
      atomic {
!       signal I2CPacketAdv.readPacketDone(mCurTargetAddr,mCurBufLen,mCurBuf,FAIL);
      }
      return;
--- 167,171 ----
      mI2CState = I2C_STATE_IDLE;
      atomic {
!       signal I2CPacket.readDone(FAIL,mCurTargetAddr,mCurBufLen,mCurBuf);
      }
      return;
***************
*** 133,149 ****
    }
  
!   async command error_t I2CPacketAdv.readPacket(uint16_t addr, uint8_t length, uint8_t* data, i2c_flags_t flags) {
      error_t error = SUCCESS;
      uint8_t tmpAddr;
  
!     error = startI2CTransact(I2C_STATE_READSTART,addr,length,data,flags,TRUE);
      return error;
    }
  
!   async command error_t I2CPacketAdv.writePacket(uint16_t addr, uint8_t length, uint8_t* data, i2c_flags_t flags) {
      error_t error = SUCCESS;
      uint8_t tmpAddr;
  
!     error = startI2CTransact(I2C_STATE_WRTESTART,addr,length,data,flags,FALSE);
      return error;
    }
--- 178,205 ----
    }
  
!   async command error_t I2CPacket.read(i2c_flags_t flags, uint16_t addr, uint8_t length, uint8_t* data) {
      error_t error = SUCCESS;
      uint8_t tmpAddr;
  
!     if ((flags & I2C_ACKEND) && (flags & I2C_STOP)) {
!       error = EINVAL;
!       return error;
!     }
! 
!     if (flags & I2C_START) {
!       error = startI2CTransact(I2C_STATE_READSTART,addr,length,data,flags,TRUE);
!     }
!     else {
!       error = startI2CTransact(I2C_STATE_READ,addr,length,data,flags,TRUE);
!     }
      return error;
    }
  
!   async command error_t I2CPacket.write(i2c_flags_t flags, uint16_t addr, uint8_t length, uint8_t* data) {
      error_t error = SUCCESS;
      uint8_t tmpAddr;
  
!     error = startI2CTransact(I2C_STATE_WRITE,addr,length,data,flags,FALSE);
! 
      return error;
    }
***************
*** 157,177 ****
      case I2C_STATE_IDLE:
        // Should never get here. Reset all pending interrupts.
-       call I2C.setISR(valISR);
        break;
  
      case I2C_STATE_READSTART:
!       call I2C.setISR(ISR_ITE | ISR_ALD);
!       if (call I2C.getISR() & ISR_BED) {
  	mI2CState = I2C_STATE_ERROR;
  	post handleReadError();
  	break;
        }
!       call I2C.setICR((mBaseICRFlags) | (ICR_ALDIE | ICR_DRFIE | ICR_TB)); 
!       mI2CState = I2C_STATE_READ;
        break;
  
      case I2C_STATE_READ:
!       call I2C.setISR(ISR_IRF);
!       if (call I2C.getISR() & (ISR_BED | ISR_ALD)) {
  	mI2CState = I2C_STATE_ERROR;
  	post handleReadError();
--- 213,229 ----
      case I2C_STATE_IDLE:
        // Should never get here. Reset all pending interrupts.
        break;
  
      case I2C_STATE_READSTART:
!       if (valISR & (ISR_BED | ISR_ALD)) {
  	mI2CState = I2C_STATE_ERROR;
  	post handleReadError();
  	break;
        }
!       readNextByte();
        break;
  
      case I2C_STATE_READ:
!       if (valISR & (ISR_BED | ISR_ALD)) {
  	mI2CState = I2C_STATE_ERROR;
  	post handleReadError();
***************
*** 180,195 ****
        mCurBuf[mCurBufIndex] = call I2C.getIDBR();
        mCurBufIndex++;
!       if (mCurBufIndex >= (mCurBufLen - 1)) {
! 	call I2C.setICR((mBaseICRFlags) | (ICR_ALDIE | ICR_DRFIE | ICR_ACKNAK | ICR_TB | ICR_STOP));
! 	mI2CState = I2C_STATE_READEND;
!       }
!       else {
! 	call I2C.setICR((mBaseICRFlags) | (ICR_ALDIE | ICR_DRFIE | ICR_TB));
!       }
        break;
  
      case I2C_STATE_READEND:
!       call I2C.setISR(ISR_IRF);
!       if (call I2C.getISR() & (ISR_BED | ISR_ALD)) {
  	mI2CState = I2C_STATE_ERROR;
  	post handleReadError();
--- 232,240 ----
        mCurBuf[mCurBufIndex] = call I2C.getIDBR();
        mCurBufIndex++;
!       readNextByte();
        break;
  
      case I2C_STATE_READEND:
!       if (valISR & (ISR_BED | ISR_ALD)) {
  	mI2CState = I2C_STATE_ERROR;
  	post handleReadError();
***************
*** 198,210 ****
        mCurBuf[mCurBufIndex] = call I2C.getIDBR();
        mI2CState = I2C_STATE_IDLE;
!       signal I2CPacketAdv.readPacketDone(mCurTargetAddr,mCurBufLen,mCurBuf,SUCCESS);
        break;
  
-     case I2C_STATE_WRITESTART:
-       call I2C.setISR(ISR_ALD);
-       // Fall through...
      case I2C_STATE_WRITE:
!       call I2C.setISR(ISR_ITE);
!       if (call I2C.getISR() & (ISR_BED | ISR_ALD)) {
  	mI2CState = I2C_STATE_ERROR;
  	post handleWriteError();
--- 243,251 ----
        mCurBuf[mCurBufIndex] = call I2C.getIDBR();
        mI2CState = I2C_STATE_IDLE;
!       signal I2CPacket.readDone(SUCCESS,mCurTargetAddr,mCurBufLen,mCurBuf);
        break;
  
      case I2C_STATE_WRITE:
!       if (valISR & (ISR_BED | ISR_ALD)) {
  	mI2CState = I2C_STATE_ERROR;
  	post handleWriteError();
***************
*** 213,229 ****
        call I2C.setIDBR(mCurBuf[mCurBufIndex]);
        mCurBufIndex++;
!       if (mCurBufIndex >= mCurBufLen) {
! 	call I2C.setICR((mBaseICRFlags) | (ICR_ALDIE | ICR_TB | ICR_STOP));
! 	mI2CState = I2C_STATE_WRITEEND;
!       }
!       else {
! 	call I2C.setICR((mBaseICRfFlags) | (ICR_ALDIE | ICR_TB | ICR_STOP));
! 	mI2CState = I2C_STATE_WRITE;
!       }
        break;
  
      case I2C_STATE_WRITEEND:
!       call I2C.setISR(ISR_ITE);
!       if (call I2C.getISR() & (ISR_BED | ISR_ALD)) {
  	mI2CState = I2C_STATE_ERROR;
  	post handleWriteError();
--- 254,262 ----
        call I2C.setIDBR(mCurBuf[mCurBufIndex]);
        mCurBufIndex++;
! 
        break;
  
      case I2C_STATE_WRITEEND:
!       if (valISR & (ISR_BED | ISR_ALD)) {
  	mI2CState = I2C_STATE_ERROR;
  	post handleWriteError();
***************
*** 231,240 ****
        }
        mI2CState= I2C_STATE_IDLE;
!       signal I2CPacketAdv.writePacketDone(mCurTargetAddr,mCurBufLen,mCurBuf,SUCCESS);
        break;
  
      default:
-       // Clear all pending interupts
-       call I2C.setISR(valISR);
        break;
      }
--- 264,271 ----
        }
        mI2CState= I2C_STATE_IDLE;
!       signal I2CPacket.writeDone(SUCCESS,mCurTargetAddr,mCurBufLen,mCurBuf);
        break;
  
      default:
        break;
      }
***************
*** 244,254 ****
    }
  
!   default async event void I2CPacketAdv.readPacketDone(uint16_t addr, uint8_t length, 
! 						    uint8_t* data, error_t error) {
      return;
    }
  
!   default async event void I2CPacketAdv.writePacketDone(uint16_t addr, uint8_t length, 
! 						     uint8_t* data, error_t error) { 
      return;
    }
--- 275,285 ----
    }
  
!   default async event void I2CPacket.readone(error_t error, uint16_t addr, 
! 					     uint8_t length, uint8_t* data) {
      return;
    }
  
!   default async event void I2CPacket.writePacketDone(error_t error, uint16_t addr, 
! 						     uint8_t length, uint8_t* data) { 
      return;
    }

Index: HplPXA27xI2C.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/tos/chips/pxa27x/i2c/Attic/HplPXA27xI2C.nc,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -C2 -d -r1.1.2.1 -r1.1.2.2
*** HplPXA27xI2C.nc	1 Feb 2006 23:54:24 -0000	1.1.2.1
--- HplPXA27xI2C.nc	16 Jun 2006 18:57:05 -0000	1.1.2.2
***************
*** 46,50 ****
    async command uint32_t getICR();
  
-   async command void setISR(uint32_t val);
    async command uint32_t getISR();
    
--- 46,49 ----

Index: HplPXA27xI2CP.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/tos/chips/pxa27x/i2c/Attic/HplPXA27xI2CP.nc,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -C2 -d -r1.1.2.2 -r1.1.2.3
*** HplPXA27xI2CP.nc	28 Mar 2006 02:16:02 -0000	1.1.2.2
--- HplPXA27xI2CP.nc	16 Jun 2006 18:57:05 -0000	1.1.2.3
***************
*** 121,134 ****
    }
  
!   async command void I2C.setISR(uint32_t val) {
!     switch(dev) {
!     case 0: ISR = val; break;
!     case 1: PISR = val; break;
!     default: break;
!     }
!     return;
!   }
! 
!   async command uint32_t I2C.getISR() { 
      switch(dev) {
      case 0: return ISR; break;
--- 121,125 ----
    }
  
!  async command uint32_t I2C.getISR() { 
      switch(dev) {
      case 0: return ISR; break;



More information about the Tinyos-2-commits mailing list