aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorafanofosc2011-07-09 04:45:14 +0000
committerNicolas Schodet2012-02-01 00:20:04 +0100
commit7514a2c489b810faf022a04321c894645e67f3df (patch)
treeea6a6f09095c5bb6f841bbbfaa389a775bc72ed8
parentb0472321014e8fcb110f4cecad734bb6a7e27ae0 (diff)
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
-rw-r--r--AT91SAM7S256/Source/c_cmd.c56
-rw-r--r--AT91SAM7S256/Source/c_comm.c38
-rw-r--r--AT91SAM7S256/Source/c_comm.iom11
-rw-r--r--AT91SAM7S256/Source/d_hispeed.c10
-rw-r--r--AT91SAM7S256/Source/d_hispeed.h7
-rw-r--r--AT91SAM7S256/Source/d_hispeed.r20
-rw-r--r--AT91SAM7S256/Source/d_loader.h2
7 files changed, 96 insertions, 48 deletions
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 <string.h>
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