@@ -80,6 +80,7 @@ extern bool scanNetCompleted;
80
80
81
81
static char buf [CMD_MAX_LEN ];
82
82
static char reply [REPLY_MAX_LEN ];
83
+ static uint16_t cmdCorr = 0 ;
83
84
static uint16_t count = 0 ;
84
85
static uint16_t replyCount = 0 ;
85
86
static cmd_spi_state_t state = SPI_CMD_IDLE ;
@@ -111,6 +112,7 @@ typedef struct sStatSpi
111
112
int rxErr ;
112
113
int wrongFrame ;
113
114
int frameDisalign ;
115
+ int overrideFrame ;
114
116
int lastCmd ;
115
117
int lastError ;
116
118
unsigned long status ;
@@ -129,6 +131,7 @@ void initStatSpi()
129
131
statSpi .timeoutIntErr = 0 ;
130
132
statSpi .wrongFrame = 0 ;
131
133
statSpi .frameDisalign = 0 ;
134
+ statSpi .overrideFrame = 0 ;
132
135
}
133
136
134
137
void printStatSpi ()
@@ -142,6 +145,7 @@ void printStatSpi()
142
145
printk ("spiTmoIntErr\t: 0x%x\n" , statSpi .timeoutIntErr );
143
146
printk ("wrongFrame\t: 0x%x\n" , statSpi .wrongFrame );
144
147
printk ("disalFrame\t: 0x%x\n" , statSpi .frameDisalign );
148
+ printk ("overrideFrame\t: 0x%x\n" , statSpi .overrideFrame );
145
149
}
146
150
147
151
cmd_state_t
@@ -286,10 +290,11 @@ int write_stream(volatile avr32_spi_t *spi, const char *stream, uint16_t len)
286
290
else
287
291
{
288
292
stream ++ ;
293
+ _len ++ ;
289
294
spi_read (spi ,& dummy );
290
295
}
291
296
//SIGN1_UP();
292
- }while ((!streamExit )&& (_len ++ <= len ));
297
+ }while ((!streamExit )&& (_len <= len ));
293
298
294
299
if (!streamExit )
295
300
{
@@ -1113,7 +1118,6 @@ cmd_spi_state_t get_client_state_tcp_cmd_cb(char* recv, char* reply, void* ctx,
1113
1118
return SPI_CMD_DONE ;
1114
1119
}
1115
1120
1116
-
1117
1121
cmd_spi_state_t avail_data_tcp_cmd_cb (char * recv , char * reply , void * ctx , uint16_t * count ) {
1118
1122
1119
1123
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)
1143
1147
return SPI_CMD_DONE ;
1144
1148
}
1145
1149
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
-
1168
1150
cmd_spi_state_t data_sent_tcp_cmd_cb (char * recv , char * reply , void * ctx , uint16_t * count ) {
1169
1151
1170
1152
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_
1181
1163
return SPI_CMD_DONE ;
1182
1164
}
1183
1165
1184
-
1185
1166
cmd_spi_state_t get_data_tcp_cmd_cb (char * recv , char * reply , void * ctx , uint16_t * count ) {
1186
1167
1187
1168
uint8_t data ;
@@ -1249,6 +1230,29 @@ cmd_spi_state_t get_firmware_version_cmd_cb(char* recv, char* reply, void* ctx,
1249
1230
return SPI_CMD_DONE ;
1250
1231
}
1251
1232
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
+
1252
1256
int sendReply (int cmdIdx , char * recv , char * reply , void * resultCmd )
1253
1257
{
1254
1258
uint16_t _count = 0 ;
@@ -1286,14 +1290,14 @@ unsigned char* getStartCmdSeq(unsigned char* _recv, int len, int *offset)
1286
1290
if (i != 0 )
1287
1291
{
1288
1292
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 ]);
1290
1294
}
1291
1295
* offset = i ;
1292
1296
return & _recv [i ];
1293
1297
}
1294
1298
}
1295
1299
DEB_PIN_DN ();
1296
- WARN ("Disall. %d\n" , i );
1300
+ WARN ("%d] Disall. %d\n" , cmdCorr , i );
1297
1301
1298
1302
return NULL ;
1299
1303
}
@@ -1406,6 +1410,7 @@ void init_spi_cmds() {
1406
1410
spi_add_cmd (GET_DATABUF_TCP_CMD , ack_cmd_cb , get_databuf_tcp_cmd_cb , NULL , CMD_GET_FLAG );
1407
1411
spi_add_cmd (GET_CLIENT_STATE_TCP_CMD , ack_cmd_cb , get_client_state_tcp_cmd_cb , NULL , CMD_GET_FLAG );
1408
1412
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 );
1409
1414
}
1410
1415
1411
1416
@@ -1473,7 +1478,7 @@ bool checkMsgFormat(uint8_t* _recv, int len, int* offset)
1473
1478
{
1474
1479
return true;
1475
1480
}else {
1476
- WARN ("Not found end cmd: 0x%x\n" , * p );
1481
+ WARN ("%d] Not found end cmd: 0x%x\n" , cmdCorr , * p );
1477
1482
}
1478
1483
}
1479
1484
return false;
@@ -1492,6 +1497,7 @@ void spi_poll(struct netif* netif) {
1492
1497
{
1493
1498
startReply = false;
1494
1499
int offset = 0 ;
1500
+ DISABLE_SPI_INT ();
1495
1501
if (checkMsgFormat (_receiveBuffer , receivedChars , & offset ))
1496
1502
{
1497
1503
state = SPI_CMD_INPROGRESS ;
@@ -1500,7 +1506,9 @@ void spi_poll(struct netif* netif) {
1500
1506
count = CMD_MAX_LEN ;
1501
1507
memcpy (buf , & _receiveBuffer [offset ], count );
1502
1508
1503
- DISABLE_SPI_INT ();
1509
+ //mark as buffer used
1510
+ _receiveBuffer [0 ] = 0 ;
1511
+
1504
1512
int err = call_reply_cb (buf , & reply [0 ]);
1505
1513
if (err != REPLY_NO_ERR )
1506
1514
{
@@ -1514,11 +1522,13 @@ void spi_poll(struct netif* netif) {
1514
1522
else
1515
1523
{
1516
1524
sendError ();
1517
- WARN ("Check format msg failed!\n" );
1525
+ WARN ("%d] Check format msg failed!\n" , cmdCorr );
1518
1526
if (enableDebug & INFO_WARN_FLAG )
1519
1527
dump ((char * )_receiveBuffer , receivedChars );
1520
1528
state = SPI_CMD_IDLE ;
1521
1529
count = 0 ;
1530
+ //mark as buffer used
1531
+ _receiveBuffer [0 ] = 0 ;
1522
1532
}
1523
1533
CLEAR_SPI_INT ();
1524
1534
//Enable Spi int to receive a new command
@@ -1530,56 +1540,53 @@ void spi_poll(struct netif* netif) {
1530
1540
#ifdef _SPI_STATS_
1531
1541
if (statSpi .lastError != 0 )
1532
1542
{
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 );
1534
1544
statSpi .lastError = 0 ;
1535
1545
}
1536
1546
#endif
1537
1547
}
1538
1548
1539
- // ****TEMPORARY
1540
- /*inline*/ int spi_slaveReceiveInt (volatile avr32_spi_t * spi , bool startRecvd )
1549
+ inline int spi_slaveReceiveInt (volatile avr32_spi_t * spi )
1541
1550
{
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 {
1569
1577
#ifdef _SPI_STATS_
1570
- STATSPI_TIMEOUT_ERROR ();
1578
+ STATSPI_TIMEOUT_ERROR ();
1571
1579
#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
+ }
1580
1582
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 ;
1583
1590
}
1584
1591
1585
1592
#if defined (__GNUC__ )
@@ -1591,19 +1598,17 @@ static void spi_int_handler(void)
1591
1598
{
1592
1599
volatile avr32_spi_t * spi = ARD_SPI ;
1593
1600
//DEB_PIN_DN();
1594
- //eic_clear_interrupt_line(&AVR32_EIC, AVR32_SPI0_IRQ);
1595
- AVAIL_FOR_SPI ();
1601
+ //AVAIL_FOR_SPI();
1596
1602
DISABLE_SPI_INT ();
1597
1603
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 )
1601
1605
{
1602
- int err = spi_slaveReceiveInt (ARD_SPI , dummy == START_CMD );
1606
+ int err = spi_slaveReceiveInt (ARD_SPI );
1603
1607
if (err == SPI_OK )
1604
1608
{
1605
1609
BUSY_FOR_SPI ();
1606
1610
startReply = true;
1611
+ ++ cmdCorr ;
1607
1612
//maintain disable interrupt to send the reply command
1608
1613
//DEB_PIN_UP();
1609
1614
return ;
0 commit comments