@@ -80,6 +80,7 @@ extern bool scanNetCompleted;
8080
8181static char buf [CMD_MAX_LEN ];
8282static char reply [REPLY_MAX_LEN ];
83+ static uint16_t cmdCorr = 0 ;
8384static uint16_t count = 0 ;
8485static uint16_t replyCount = 0 ;
8586static cmd_spi_state_t state = SPI_CMD_IDLE ;
@@ -111,6 +112,7 @@ typedef struct sStatSpi
111112 int rxErr ;
112113 int wrongFrame ;
113114 int frameDisalign ;
115+ int overrideFrame ;
114116 int lastCmd ;
115117 int lastError ;
116118 unsigned long status ;
@@ -129,6 +131,7 @@ void initStatSpi()
129131 statSpi .timeoutIntErr = 0 ;
130132 statSpi .wrongFrame = 0 ;
131133 statSpi .frameDisalign = 0 ;
134+ statSpi .overrideFrame = 0 ;
132135}
133136
134137void printStatSpi ()
@@ -142,6 +145,7 @@ void printStatSpi()
142145 printk ("spiTmoIntErr\t: 0x%x\n" , statSpi .timeoutIntErr );
143146 printk ("wrongFrame\t: 0x%x\n" , statSpi .wrongFrame );
144147 printk ("disalFrame\t: 0x%x\n" , statSpi .frameDisalign );
148+ printk ("overrideFrame\t: 0x%x\n" , statSpi .overrideFrame );
145149}
146150
147151cmd_state_t
@@ -286,10 +290,11 @@ int write_stream(volatile avr32_spi_t *spi, const char *stream, uint16_t len)
286290 else
287291 {
288292 stream ++ ;
293+ _len ++ ;
289294 spi_read (spi ,& dummy );
290295 }
291296 //SIGN1_UP();
292- }while ((!streamExit )&& (_len ++ <= len ));
297+ }while ((!streamExit )&& (_len <= len ));
293298
294299 if (!streamExit )
295300 {
@@ -1113,7 +1118,6 @@ cmd_spi_state_t get_client_state_tcp_cmd_cb(char* recv, char* reply, void* ctx,
11131118 return SPI_CMD_DONE ;
11141119}
11151120
1116-
11171121cmd_spi_state_t avail_data_tcp_cmd_cb (char * recv , char * reply , void * ctx , uint16_t * count ) {
11181122
11191123 CHECK_ARD_NETIF (recv , reply , count );
@@ -1143,28 +1147,6 @@ cmd_spi_state_t test_cmd_cb(char* recv, char* reply, void* ctx, uint16_t* count)
11431147 return SPI_CMD_DONE ;
11441148}
11451149
1146-
1147-
1148- /*
1149- cmd_spi_state_t ack_data_sent_reply_cb(char* recv, char* reply, void* ctx, uint16_t* count) {
1150-
1151- CHECK_ARD_NETIF(recv, reply, count);
1152-
1153- CREATE_HEADER_REPLY(reply, recv, PARAM_NUMS_1);
1154- uint8_t dataSent = 0;
1155- if ((recv[3]==1)&&(recv[4]>=0)&&(recv[4]<MAX_SOCK_NUM))
1156- {
1157- int timeout = 0;
1158- do {
1159- dataSent = isDataSent(mapSockTCP[(uint8_t)recv[4]]);
1160- }while ((dataSent == 0)&&(timeout++ < TIMEOUT_SENT_REPLY));
1161- }
1162- PUT_DATA_BYTE(dataSent, reply, 3);
1163- END_HEADER_REPLY(reply, 5, *count);
1164- return SPI_CMD_DONE;
1165- }
1166- */
1167-
11681150cmd_spi_state_t data_sent_tcp_cmd_cb (char * recv , char * reply , void * ctx , uint16_t * count ) {
11691151
11701152 CHECK_ARD_NETIF (recv , reply , count );
@@ -1181,7 +1163,6 @@ cmd_spi_state_t data_sent_tcp_cmd_cb(char* recv, char* reply, void* ctx, uint16_
11811163 return SPI_CMD_DONE ;
11821164}
11831165
1184-
11851166cmd_spi_state_t get_data_tcp_cmd_cb (char * recv , char * reply , void * ctx , uint16_t * count ) {
11861167
11871168 uint8_t data ;
@@ -1249,6 +1230,29 @@ cmd_spi_state_t get_firmware_version_cmd_cb(char* recv, char* reply, void* ctx,
12491230 return SPI_CMD_DONE ;
12501231}
12511232
1233+ cmd_spi_state_t get_test_cmd_cb (char * recv , char * reply , void * ctx , uint16_t * count ) {
1234+
1235+ uint8_t buffer [255 ] = {0 };
1236+
1237+ CHECK_ARD_NETIF (recv , reply , count );
1238+
1239+ CREATE_HEADER_REPLY (reply , recv , 1 );
1240+ uint8_t len = 0 ;
1241+ if ((recv [3 ]== 1 )&& (recv [4 ]>=0 )&& (recv [4 ]< 0xFF ))
1242+ {
1243+ len = recv [4 ];
1244+ int i = 0 ;
1245+ for (; i < len ; ++ i ) buffer [i ]= i ;
1246+ PUT_BUFDATA_BYTE (buffer , len , reply , 3 );
1247+ }else {
1248+ len = strlen (fwVersion );
1249+ PUT_BUFDATA_BYTE (fwVersion , len , reply , 3 );
1250+ }
1251+ END_HEADER_REPLY (reply , 3 + len + 1 , * count );
1252+
1253+ return SPI_CMD_DONE ;
1254+ }
1255+
12521256int sendReply (int cmdIdx , char * recv , char * reply , void * resultCmd )
12531257{
12541258 uint16_t _count = 0 ;
@@ -1286,14 +1290,14 @@ unsigned char* getStartCmdSeq(unsigned char* _recv, int len, int *offset)
12861290 if (i != 0 )
12871291 {
12881292 DEB_PIN_DN ();
1289- WARN ("Disall. %d/%d cmd:%d\n" , i , len ,_recv [i + 1 ]);
1293+ WARN ("%d] Disall. %d/%d cmd:%d\n" , cmdCorr , i , len ,_recv [i + 1 ]);
12901294 }
12911295 * offset = i ;
12921296 return & _recv [i ];
12931297 }
12941298 }
12951299 DEB_PIN_DN ();
1296- WARN ("Disall. %d\n" , i );
1300+ WARN ("%d] Disall. %d\n" , cmdCorr , i );
12971301
12981302 return NULL ;
12991303}
@@ -1406,6 +1410,7 @@ void init_spi_cmds() {
14061410 spi_add_cmd (GET_DATABUF_TCP_CMD , ack_cmd_cb , get_databuf_tcp_cmd_cb , NULL , CMD_GET_FLAG );
14071411 spi_add_cmd (GET_CLIENT_STATE_TCP_CMD , ack_cmd_cb , get_client_state_tcp_cmd_cb , NULL , CMD_GET_FLAG );
14081412 spi_add_cmd (GET_FW_VERSION_CMD , ack_cmd_cb , get_firmware_version_cmd_cb , NULL , CMD_GET_FLAG );
1413+ spi_add_cmd (GET_TEST_CMD , ack_cmd_cb , get_test_cmd_cb , NULL , CMD_GET_FLAG );
14091414}
14101415
14111416
@@ -1473,7 +1478,7 @@ bool checkMsgFormat(uint8_t* _recv, int len, int* offset)
14731478 {
14741479 return true;
14751480 }else {
1476- WARN ("Not found end cmd: 0x%x\n" , * p );
1481+ WARN ("%d] Not found end cmd: 0x%x\n" , cmdCorr , * p );
14771482 }
14781483 }
14791484 return false;
@@ -1492,6 +1497,7 @@ void spi_poll(struct netif* netif) {
14921497 {
14931498 startReply = false;
14941499 int offset = 0 ;
1500+ DISABLE_SPI_INT ();
14951501 if (checkMsgFormat (_receiveBuffer , receivedChars , & offset ))
14961502 {
14971503 state = SPI_CMD_INPROGRESS ;
@@ -1500,7 +1506,9 @@ void spi_poll(struct netif* netif) {
15001506 count = CMD_MAX_LEN ;
15011507 memcpy (buf , & _receiveBuffer [offset ], count );
15021508
1503- DISABLE_SPI_INT ();
1509+ //mark as buffer used
1510+ _receiveBuffer [0 ] = 0 ;
1511+
15041512 int err = call_reply_cb (buf , & reply [0 ]);
15051513 if (err != REPLY_NO_ERR )
15061514 {
@@ -1514,11 +1522,13 @@ void spi_poll(struct netif* netif) {
15141522 else
15151523 {
15161524 sendError ();
1517- WARN ("Check format msg failed!\n" );
1525+ WARN ("%d] Check format msg failed!\n" , cmdCorr );
15181526 if (enableDebug & INFO_WARN_FLAG )
15191527 dump ((char * )_receiveBuffer , receivedChars );
15201528 state = SPI_CMD_IDLE ;
15211529 count = 0 ;
1530+ //mark as buffer used
1531+ _receiveBuffer [0 ] = 0 ;
15221532 }
15231533 CLEAR_SPI_INT ();
15241534 //Enable Spi int to receive a new command
@@ -1530,56 +1540,53 @@ void spi_poll(struct netif* netif) {
15301540#ifdef _SPI_STATS_
15311541 if (statSpi .lastError != 0 )
15321542 {
1533- WARN ("[E( 0x%x) spiStatus:0x%x] \n" , statSpi .lastError , statSpi .status );
1543+ WARN ("%d] Errot= 0x%x spiStatus:0x%x\n" , cmdCorr , statSpi .lastError , statSpi .status );
15341544 statSpi .lastError = 0 ;
15351545 }
15361546#endif
15371547}
15381548
1539- // ****TEMPORARY
1540- /*inline*/ int spi_slaveReceiveInt (volatile avr32_spi_t * spi , bool startRecvd )
1549+ inline int spi_slaveReceiveInt (volatile avr32_spi_t * spi )
15411550{
1542- receivedChars = 0 ;
1543- int index = 0 ;
1544- int err = SPI_OK ;
1545- state = SPI_CMD_INPUT ;
1546- unsigned int timeout = SPI_TIMEOUT ;
1547- if (startRecvd )
1548- {
1549- TOGGLE_SIG0 ();
1550- _receiveBuffer [index ]= START_CMD ;
1551- ++ receivedChars ;
1552- ++ index ;
1553- }
1554- do {
1555- err = SPI_OK ;
1556-
1557- while ((spi -> sr & (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK )) !=
1558- (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK )) {
1559- if ((timeout -- )== 0 ) {
1560- err = SPI_ERROR_TIMEOUT ;
1561- break ;
1562- }
1563- }
1564- _receiveBuffer [index ] = (spi -> rdr >> AVR32_SPI_RDR_RD_OFFSET ) & 0x00ff ;
1565- if (err == SPI_OK ) {
1566- ++ index ;
1567- ++ receivedChars ;
1568- }else {
1551+ receivedChars = 0 ;
1552+ int index = 0 ;
1553+ int err = SPI_OK ;
1554+ state = SPI_CMD_INPUT ;
1555+
1556+ if (_receiveBuffer [0 ] != 0 )
1557+ {
1558+ STATSPI_OVERRIDE_ERROR ();
1559+ }
1560+
1561+ do {
1562+ unsigned int timeout = SPI_TIMEOUT ;
1563+ err = SPI_OK ;
1564+
1565+ while ((spi -> sr & (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK )) !=
1566+ (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK )) {
1567+ if ((timeout -- )== 0 ) {
1568+ err = SPI_ERROR_TIMEOUT ;
1569+ break ;
1570+ }
1571+ }
1572+ _receiveBuffer [index ] = (spi -> rdr >> AVR32_SPI_RDR_RD_OFFSET ) & 0x00ff ;
1573+ if (err == SPI_OK ) {
1574+ ++ index ;
1575+ ++ receivedChars ;
1576+ }else {
15691577#ifdef _SPI_STATS_
1570- STATSPI_TIMEOUT_ERROR ();
1578+ STATSPI_TIMEOUT_ERROR ();
15711579#endif
1572- break ;
1573- }
1574-
1575- /* break on buffer overflow */
1576- if (receivedChars >= _BUFFERSIZE ) {
1577- err = SPI_ERROR_OVERRUN_AND_MODE_FAULT ;
1578- break ;
1579- }
1580+ break ;
1581+ }
15801582
1581- } while (_receiveBuffer [index - 1 ] != END_CMD );
1582- return err ;
1583+ /* break on buffer overflow */
1584+ if (receivedChars >= _BUFFERSIZE ) {
1585+ err = SPI_ERROR_OVERRUN_AND_MODE_FAULT ;
1586+ break ;
1587+ }
1588+ } while (_receiveBuffer [index - 1 ] != END_CMD );
1589+ return err ;
15831590}
15841591
15851592#if defined (__GNUC__ )
@@ -1591,19 +1598,17 @@ static void spi_int_handler(void)
15911598{
15921599 volatile avr32_spi_t * spi = ARD_SPI ;
15931600 //DEB_PIN_DN();
1594- //eic_clear_interrupt_line(&AVR32_EIC, AVR32_SPI0_IRQ);
1595- AVAIL_FOR_SPI ();
1601+ //AVAIL_FOR_SPI();
15961602 DISABLE_SPI_INT ();
15971603
1598- unsigned short dummy = 0 ;
1599-
1600- if (((spi -> sr & AVR32_SPI_SR_RDRF_MASK ) != 0 )|| (dummy == START_CMD ))
1604+ if ((spi -> sr & AVR32_SPI_SR_RDRF_MASK ) != 0 )
16011605 {
1602- int err = spi_slaveReceiveInt (ARD_SPI , dummy == START_CMD );
1606+ int err = spi_slaveReceiveInt (ARD_SPI );
16031607 if (err == SPI_OK )
16041608 {
16051609 BUSY_FOR_SPI ();
16061610 startReply = true;
1611+ ++ cmdCorr ;
16071612 //maintain disable interrupt to send the reply command
16081613 //DEB_PIN_UP();
16091614 return ;
0 commit comments