[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