From 7514a2c489b810faf022a04321c894645e67f3df Mon Sep 17 00:00:00 2001 From: afanofosc Date: Sat, 9 Jul 2011 04:45:14 +0000 Subject: RS485 changes. Also changed ARROP to use the type of the output parameter rather than the input array type to determine float/signed/unsigned calculations. git-svn-id: https://mindboards.svn.sourceforge.net/svnroot/mindboards/lms_nbcnxc/branches/version_131@41 c9361245-7fe8-9947-84e8-057757c4e366 --- AT91SAM7S256/Source/c_cmd.c | 56 +++++++++++++++++++++++------------------ AT91SAM7S256/Source/c_comm.c | 38 ++++++++++++++++++++-------- AT91SAM7S256/Source/c_comm.iom | 11 +++++++- AT91SAM7S256/Source/d_hispeed.c | 10 ++++++-- AT91SAM7S256/Source/d_hispeed.h | 7 +++++- AT91SAM7S256/Source/d_hispeed.r | 20 ++++++++------- AT91SAM7S256/Source/d_loader.h | 2 +- 7 files changed, 96 insertions(+), 48 deletions(-) (limited to 'AT91SAM7S256') diff --git a/AT91SAM7S256/Source/c_cmd.c b/AT91SAM7S256/Source/c_cmd.c index 112d13a..4a619f2 100644 --- a/AT91SAM7S256/Source/c_cmd.c +++ b/AT91SAM7S256/Source/c_cmd.c @@ -7364,7 +7364,7 @@ NXT_STATUS cCmdInterpOther(CODE_WORD * const pCode) (Arg1 == OPARR_SUMSQR) || (Arg1 == OPARR_STD)) { pArg2 = cCmdResolveDataArg(Arg2, 0, &TypeCode2); - if (TypeCode3 == TC_FLOAT) + if (TypeCode2 == TC_FLOAT) { fval = 0; for (i = 0; i < MinCount; i++) @@ -7380,7 +7380,7 @@ NXT_STATUS cCmdInterpOther(CODE_WORD * const pCode) else if (Arg1 != OPARR_STD) cCmdSetValFlt(pArg2, TypeCode2, fval); } - else if (IS_SIGNED_TYPE(TypeCode3) && (Arg1 != OPARR_SUMSQR)) + else if (IS_SIGNED_TYPE(TypeCode2) && (Arg1 != OPARR_SUMSQR)) { sval = 0; for (i = 0; i < MinCount; i++) @@ -7400,7 +7400,7 @@ NXT_STATUS cCmdInterpOther(CODE_WORD * const pCode) for (i = 0; i < MinCount; i++) { pArg3 = cCmdResolveDataArg(INC_ID(Arg3), ARRAY_ELEM_OFFSET(DVIndex3, ArgVal4 + i), NULL); - if (IS_SIGNED_TYPE(TypeCode3)) + if (IS_SIGNED_TYPE(TypeCode2)) { // this can only be the SUMSQR operation (given the IF statement above) svaltmp = cCmdGetVal(pArg3, TypeCode3); @@ -7423,9 +7423,9 @@ NXT_STATUS cCmdInterpOther(CODE_WORD * const pCode) if (Arg1 == OPARR_STD) { float avg, delta, sumSqr; - if (TypeCode3 == TC_FLOAT) + if (TypeCode2 == TC_FLOAT) avg = fval/numElements; - else if (IS_SIGNED_TYPE(TypeCode3)) + else if (IS_SIGNED_TYPE(TypeCode2)) avg = (float)sval/numElements; else avg = (float)uval/numElements; @@ -7433,18 +7433,18 @@ NXT_STATUS cCmdInterpOther(CODE_WORD * const pCode) for (i = 0; i < MinCount; i++) { pArg3 = cCmdResolveDataArg(INC_ID(Arg3), ARRAY_ELEM_OFFSET(DVIndex3, ArgVal4 + i), NULL); - if (TypeCode3 == TC_FLOAT) + if (TypeCode2 == TC_FLOAT) delta = cCmdGetValFlt(pArg3, TypeCode3) - avg; - if (IS_SIGNED_TYPE(TypeCode3)) + else if (IS_SIGNED_TYPE(TypeCode2)) delta = (float)(SLONG)cCmdGetVal(pArg3, TypeCode3) - avg; else // unsigned types delta = (float)cCmdGetVal(pArg3, TypeCode3) - avg; sumSqr += (delta*delta); } delta = sqrtf(sumSqr / (numElements - (float)1.0)); - if (TypeCode3 == TC_FLOAT) + if (TypeCode2 == TC_FLOAT) cCmdSetValFlt(pArg2, TypeCode2, delta); - else if (IS_SIGNED_TYPE(TypeCode3)) + else if (IS_SIGNED_TYPE(TypeCode2)) cCmdSetVal(pArg2, TypeCode2, (SLONG)delta); else cCmdSetVal(pArg2, TypeCode2, (ULONG)delta); @@ -7453,7 +7453,7 @@ NXT_STATUS cCmdInterpOther(CODE_WORD * const pCode) else if ((Arg1 == OPARR_MIN) || (Arg1 == OPARR_MAX)) { pArg2 = cCmdResolveDataArg(Arg2, 0, &TypeCode2); - if (TypeCode3 == TC_FLOAT) + if (TypeCode2 == TC_FLOAT) { if (Arg1 == OPARR_MIN) fval = FLT_MAX; @@ -7469,7 +7469,7 @@ NXT_STATUS cCmdInterpOther(CODE_WORD * const pCode) } cCmdSetValFlt(pArg2, TypeCode2, fval); } - else if (IS_SIGNED_TYPE(TypeCode3)) + else if (IS_SIGNED_TYPE(TypeCode2)) { if (Arg1 == OPARR_MIN) sval = LONG_MAX; @@ -9531,13 +9531,26 @@ NXT_STATUS cCmdWrapCommHSControl(UBYTE * ArgV[]) return (NO_ERR); } +//cCmdHSCalcBytesReady +//Calculate true number of bytes available in the inbound HS buffer +UBYTE cCmdHSCalcBytesReady() +{ + SWORD Tmp = pMapComm->HsInBuf.InPtr - pMapComm->HsInBuf.OutPtr; + if (Tmp < 0) + Tmp = (pMapComm->HsInBuf.InPtr + (SIZE_OF_HSBUF - pMapComm->HsInBuf.OutPtr)); + return (UBYTE)(Tmp); +} + //cCmdWrapCommHSCheckStatus //ArgV[0]: SendingData, UBYTE out //ArgV[1]: DataAvailable, UBYTE out NXT_STATUS cCmdWrapCommHSCheckStatus(UBYTE * ArgV[]) { - *(ArgV[0]) = (pMapComm->HsOutBuf.InPtr != pMapComm->HsOutBuf.OutPtr) || (pMapComm->HsState == HS_SEND_DATA); - *(ArgV[1]) = (pMapComm->HsInBuf.InPtr != pMapComm->HsInBuf.OutPtr); + *(ArgV[0]) = (pMapComm->HsState > HS_BYTES_REMAINING) ? + (pMapComm->HsState - HS_BYTES_REMAINING) : + 0; + *(ArgV[1]) = cCmdHSCalcBytesReady(); + return (NO_ERR); } @@ -9581,13 +9594,7 @@ NXT_STATUS cCmdWrapCommHSWrite(UBYTE * ArgV[]) //ArgV[1]: Buffer, out NXT_STATUS cCmdWrapCommHSRead(UBYTE * ArgV[]) { - //Normally, bytes available is a simple difference. - SLONG Tmp = pMapComm->HsInBuf.InPtr - pMapComm->HsInBuf.OutPtr; - - //If InPtr is actually behind OutPtr, circular buffer has wrapped. Account for wrappage... - if (Tmp < 0) - Tmp = (pMapComm->HsInBuf.InPtr + (SIZE_OF_HSBUF - pMapComm->HsInBuf.OutPtr)); - + UBYTE Tmp = cCmdHSCalcBytesReady(); //Resolve array arguments // output buffer DV_INDEX DVIndex = *(DV_INDEX *)(ArgV[1]); @@ -9596,10 +9603,9 @@ NXT_STATUS cCmdWrapCommHSRead(UBYTE * ArgV[]) if (IS_ERR(Status)) return Status; UBYTE* pBuf = cCmdDVPtr(DVIndex); - ArgV[1] = pBuf; //If the bytes we want to read wrap around the end, we must first read the end, then reset back to the beginning - UBYTE BytesToRead = (UBYTE)Tmp; + UBYTE BytesToRead = Tmp; if (pMapComm->HsInBuf.OutPtr + BytesToRead >= SIZE_OF_HSBUF) { BytesToRead = SIZE_OF_HSBUF - pMapComm->HsInBuf.OutPtr; @@ -9609,8 +9615,10 @@ NXT_STATUS cCmdWrapCommHSRead(UBYTE * ArgV[]) BytesToRead = Tmp - BytesToRead; } - memcpy(pBuf, pMapComm->HsInBuf.Buf + pMapComm->HsInBuf.OutPtr, BytesToRead); - pMapComm->HsInBuf.OutPtr += BytesToRead; + if (BytesToRead > 0) { + memcpy(pBuf, pMapComm->HsInBuf.Buf + pMapComm->HsInBuf.OutPtr, BytesToRead); + pMapComm->HsInBuf.OutPtr += BytesToRead; + } return (NO_ERR); } diff --git a/AT91SAM7S256/Source/c_comm.c b/AT91SAM7S256/Source/c_comm.c index c760b84..651e309 100644 --- a/AT91SAM7S256/Source/c_comm.c +++ b/AT91SAM7S256/Source/c_comm.c @@ -256,7 +256,9 @@ void cCommCtrl(void) { case HS_INITIALISE: { - dHiSpeedSetupUart(IOMapComm.HsSpeed, IOMapComm.HsMode); + dHiSpeedSetupUart(IOMapComm.HsSpeed, + IOMapComm.HsMode & HS_MODE_MASK, + IOMapComm.HsMode & HS_UART_MASK ? 0 : 1); IOMapComm.HsState = HS_INIT_RECEIVER; IOMapComm.HsFlags |= HS_UPDATE; } @@ -266,13 +268,14 @@ void cCommCtrl(void) { dHiSpeedInitReceive(VarsComm.HsModuleInBuf.Buf); VarsComm.HsState = 0x01; + IOMapComm.HsState = HS_DEFAULT; } break; case HS_SEND_DATA: { cCommSendHiSpeedData(); - IOMapComm.HsState = HS_DEFAULT; // do not leave this in HS_SEND_DATA state + IOMapComm.HsState = HS_BYTES_REMAINING + IOMapComm.HsOutBuf.InPtr; } break; @@ -280,6 +283,7 @@ void cCommCtrl(void) { VarsComm.HsState = 0x00; dHiSpeedExit(); + IOMapComm.HsState = HS_DEFAULT; } break; @@ -287,11 +291,26 @@ void cCommCtrl(void) { if (VarsComm.HsState == 0) dHiSpeedInit(); + IOMapComm.HsState = HS_DEFAULT; } break; } } + // update the HsState if there are bytes remaining to be sent + if (IOMapComm.HsState >= HS_BYTES_REMAINING) + { + UWORD bts = 0; + dHiSpeedBytesToSend(&bts); + if (bts == 0) + { + IOMapComm.HsState = HS_DEFAULT; + IOMapComm.HsOutBuf.OutPtr = IOMapComm.HsOutBuf.InPtr; + } + else + IOMapComm.HsState = HS_BYTES_REMAINING + bts; + } + if (VarsComm.HsState != 0) { cCommReceivedHiSpeedData(); @@ -1497,12 +1516,10 @@ void cCommCopyFileName(UBYTE *pDst, UBYTE *pSrc) void cCommSendHiSpeedData(void) { VarsComm.HsModuleOutBuf.OutPtr = 0; - for (VarsComm.HsModuleOutBuf.InPtr = 0; VarsComm.HsModuleOutBuf.InPtr < IOMapComm.HsOutBuf.InPtr; VarsComm.HsModuleOutBuf.InPtr++) - { - VarsComm.HsModuleOutBuf.Buf[VarsComm.HsModuleOutBuf.InPtr] = IOMapComm.HsOutBuf.Buf[IOMapComm.HsOutBuf.OutPtr]; - IOMapComm.HsOutBuf.OutPtr++; - } - dHiSpeedSendData(VarsComm.HsModuleOutBuf.Buf, (VarsComm.HsModuleOutBuf.InPtr - VarsComm.HsModuleOutBuf.OutPtr)); + memcpy(VarsComm.HsModuleOutBuf.Buf, IOMapComm.HsOutBuf.Buf, IOMapComm.HsOutBuf.InPtr); + VarsComm.HsModuleOutBuf.InPtr = IOMapComm.HsOutBuf.InPtr; + dHiSpeedSendData(VarsComm.HsModuleOutBuf.Buf, VarsComm.HsModuleOutBuf.InPtr); +// IOMapComm.HsOutBuf.OutPtr = IOMapComm.HsOutBuf.InPtr; } void cCommReceivedHiSpeedData(void) @@ -1561,9 +1578,10 @@ void cCommReceivedHiSpeedData(void) { IOMapComm.HsOutBuf.Buf[0] = HS_ADDRESS_ALL; // reply is sent to "all" IOMapComm.HsOutBuf.InPtr++; - cCommSendHiSpeedData(); - IOMapComm.HsOutBuf.InPtr = 0; IOMapComm.HsOutBuf.OutPtr = 0; + // send the data the next time cCommCtrl is called + IOMapComm.HsState = HS_SEND_DATA; + IOMapComm.HsFlags = HS_UPDATE; } } } diff --git a/AT91SAM7S256/Source/c_comm.iom b/AT91SAM7S256/Source/c_comm.iom index 7f11837..9394328 100644 --- a/AT91SAM7S256/Source/c_comm.iom +++ b/AT91SAM7S256/Source/c_comm.iom @@ -73,7 +73,8 @@ enum HS_SEND_DATA, HS_DISABLE, HS_ENABLE, - HS_DEFAULT + HS_DEFAULT, + HS_BYTES_REMAINING = 0x10 }; // Constants reffering to hi-speed control syscall function @@ -105,6 +106,14 @@ enum HS_BAUD_921600 }; + +// HsMode UART mode (RS232 or RS485) +#define HS_MODE_UART_RS232 0x1 +#define HS_MODE_UART_RS485 0x0 + +#define HS_MODE_MASK 0xFFF0 +#define HS_UART_MASK 0x000F + // constants referring to HsMode (number of bits) #define HS_MODE_5_DATA 0x0000 #define HS_MODE_6_DATA 0x0040 diff --git a/AT91SAM7S256/Source/d_hispeed.c b/AT91SAM7S256/Source/d_hispeed.c index a764492..1e74612 100644 --- a/AT91SAM7S256/Source/d_hispeed.c +++ b/AT91SAM7S256/Source/d_hispeed.c @@ -16,6 +16,7 @@ #include "m_sched.h" #include "d_hispeed.h" #include "d_hispeed.r" +#include const ULONG SPEED_TO_BAUD[16] = { 1200L, @@ -46,10 +47,10 @@ void dHiSpeedSendData(UBYTE *OutputBuffer, UBYTE BytesToSend) HIGHSPEEDSendDmaData(OutputBuffer,BytesToSend); } -void dHiSpeedSetupUart(UBYTE speed, UWORD mode) +void dHiSpeedSetupUart(UBYTE speed, UWORD mode, UBYTE umode) { ULONG baud = SPEED_TO_BAUD[speed]; - HIGHSPEEDSetupUart(baud, ((unsigned int)mode)); + HIGHSPEEDSetupUart(speed, baud, ((unsigned int)mode), umode); } void dHiSpeedInitReceive(UBYTE *InputBuffer) @@ -66,3 +67,8 @@ void dHiSpeedExit(void) { HIGHSPEEDExit; } + +void dHiSpeedBytesToSend(UWORD *bts) +{ + BYTESToSend(*bts); +} diff --git a/AT91SAM7S256/Source/d_hispeed.h b/AT91SAM7S256/Source/d_hispeed.h index b9d8a30..ffdabfe 100644 --- a/AT91SAM7S256/Source/d_hispeed.h +++ b/AT91SAM7S256/Source/d_hispeed.h @@ -17,9 +17,14 @@ void dHiSpeedInit(void); void dHiSpeedSendData(UBYTE *OutputBuffer, UBYTE BytesToSend); -void dHiSpeedSetupUart(UBYTE speed, UWORD mode); +void dHiSpeedSetupUart(UBYTE speed, UWORD mode, UBYTE umode); void dHiSpeedInitReceive(UBYTE *InputBuffer); void dHiSpeedReceivedData(UWORD *ByteCnt); void dHiSpeedExit(void); +void dHiSpeedBytesToSend(UWORD *bts); +/* +int hs_send(U8 address, U8 control, U8 *data, int offset, int len, U16 *CRCTab); +int hs_recv(U8 *data, int len, U16 *CRCTab, int reset); +*/ #endif diff --git a/AT91SAM7S256/Source/d_hispeed.r b/AT91SAM7S256/Source/d_hispeed.r index 949f0f5..3c4c58a 100644 --- a/AT91SAM7S256/Source/d_hispeed.r +++ b/AT91SAM7S256/Source/d_hispeed.r @@ -52,7 +52,7 @@ static UBYTE InBufOutCnt; *AT91C_PIOA_CODR = HIGHSPEED_TX_PIN | HIGHSPEED_RTS_PIN | HIGHSPEED_RX_PIN; /* Set output low */\ } -#define HIGHSPEEDSetupUart(_baud, _mode) {\ +#define HIGHSPEEDSetupUart(_spd, _baud, _mode, _umode) {\ UBYTE Tmp;\ InBufInPtr = 0;\ for(Tmp = 0; Tmp < NO_OF_INBUFFERS; Tmp++)\ @@ -65,11 +65,11 @@ static UBYTE InBufOutCnt; *AT91C_PIOA_ASR = HIGHSPEED_TX_PIN | HIGHSPEED_RTS_PIN | HIGHSPEED_RX_PIN;; /* Enable Per. A on PA5, PA6 & PA7 */\ *AT91C_US0_CR = AT91C_US_RSTSTA; /* Resets pins on UART0 */\ *AT91C_US0_CR = AT91C_US_STTTO; /* Start timeout functionality after 1 byte */\ - *AT91C_US0_RTOR = ((_baud)/400); /* Approxitely 20 mS,x times bit time with 115200 bit pr s */\ + *AT91C_US0_RTOR = 2400+((15-(_spd))*4200); /* Approxitely 20 mS,x times bit time with 115200 bit pr s */\ *AT91C_US0_IDR = AT91C_US_TIMEOUT; /* Disable interrupt on timeout */\ *AT91C_AIC_IDCR = UART0_INQ; /* Disable UART0 interrupt */\ *AT91C_AIC_ICCR = UART0_INQ; /* Clear interrupt register */\ - *AT91C_US0_MR = AT91C_US_USMODE_RS485; /* Set UART to RUN RS485 Mode*/\ + *AT91C_US0_MR = (_umode); /* Set UART to RUN RS485 Mode*/\ *AT91C_US0_MR &= ~AT91C_US_SYNC; /* Set UART in asynchronous mode */\ *AT91C_US0_MR |= AT91C_US_CLKS_CLOCK; /* Clock setup MCK*/\ *AT91C_US0_MR |= AT91C_US_OVER; /* UART is using over sampling mode */\ @@ -157,14 +157,11 @@ static UBYTE InBufOutCnt; #define HIGHSPEEDSendDmaData(OutputBuffer, BytesToSend)\ {\ - UWORD Avail, Cnt;\ + UWORD Avail;\ AVAILOutBuf(Avail);\ - if (BytesToSend < (Avail - 1))\ + if (BytesToSend < ((SWORD)Avail - 1))\ {\ - for (Cnt = 0; Cnt < BytesToSend; Cnt++)\ - {\ - OutDma[DmaBufPtr][Cnt] = OutputBuffer[Cnt];\ - }\ + memcpy((PSZ)&(OutDma[DmaBufPtr][0]), OutputBuffer, BytesToSend);\ *AT91C_US0_TNPR = (unsigned int)&(OutDma[DmaBufPtr][0]);\ *AT91C_US0_TNCR = BytesToSend;\ DmaBufPtr = (DmaBufPtr + 1) % NO_OF_DMA_OUTBUFFERS;\ @@ -180,6 +177,11 @@ static UBYTE InBufOutCnt; } +#define BYTESToSend(Bts) {\ + (Bts) = *AT91C_US0_TNCR;\ + (Bts) += *AT91C_US0_TCR;\ + } + #endif #ifdef PCWIN diff --git a/AT91SAM7S256/Source/d_loader.h b/AT91SAM7S256/Source/d_loader.h index e380bb5..9ccd01c 100644 --- a/AT91SAM7S256/Source/d_loader.h +++ b/AT91SAM7S256/Source/d_loader.h @@ -19,7 +19,7 @@ #define STARTOFFILETABLE (0x140000L - (FILETABLE_SIZE*4)) #define FILEPTRTABLE ((const ULONG*)(0x140000L - (FILETABLE_SIZE*4))) #ifndef STRIPPED -#define STARTOFUSERFLASH (0x125800L)//(0x124600L) 1.31 == (0x122100L) +#define STARTOFUSERFLASH (0x125C00L)//(0x124600L) 1.31 == (0x122100L) #else #define STARTOFUSERFLASH (0x122400L)//(0x124600L) 1.31 == (0x122100L) #endif -- cgit v1.2.3