Skip to content

Commit 2ceb5a0

Browse files
committed
Changed Handshake pin to 7. Add some spi stats
1 parent bdc4d0a commit 2ceb5a0

File tree

4 files changed

+91
-77
lines changed

4 files changed

+91
-77
lines changed

wifiHD/src/ard_spi.c

+82-77
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ extern bool scanNetCompleted;
8080

8181
static char buf[CMD_MAX_LEN];
8282
static char reply[REPLY_MAX_LEN];
83+
static uint16_t cmdCorr = 0;
8384
static uint16_t count = 0;
8485
static uint16_t replyCount = 0;
8586
static 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

134137
void 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

147151
cmd_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-
11171121
cmd_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-
11681150
cmd_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-
11851166
cmd_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+
12521256
int 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;

wifiHD/src/ard_spi.h

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ typedef enum {
3939

4040
#define TIMEOUT_SPI 200
4141
#define SPI_ALIGN_ERROR 0xF0
42+
#define SPI_OVERRIDE_ERROR 0xF1
4243
#define DUMMY_DATA 0xFF
4344

4445
typedef int (*cmd_spi_cb_t)(int numParam, char* buf, void* ctx);

wifiHD/src/ard_utils.h

+6
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,12 @@
210210
statSpi.lastError = SPI_ALIGN_ERROR; \
211211
statSpi.status = spi_getStatus(ARD_SPI);
212212

213+
#define STATSPI_OVERRIDE_ERROR() \
214+
statSpi.overrideFrame++; \
215+
statSpi.rxErr++; \
216+
statSpi.lastError = SPI_OVERRIDE_ERROR; \
217+
statSpi.status = spi_getStatus(ARD_SPI);
218+
213219
#define STATSPI_TX_TIMEOUT_ERROR() \
214220
statSpi.timeoutErr++; \
215221
statSpi.txErr++; \

wifiHD/src/wifi_spi.h

+2
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,13 @@ enum {
5555
GET_HOST_BY_NAME_CMD= 0x35,
5656
START_SCAN_NETWORKS = 0x36,
5757
GET_FW_VERSION_CMD = 0x37,
58+
GET_TEST_CMD = 0x38,
5859

5960
// All command with DATA_FLAG 0x40 send a 16bit Len
6061

6162
SEND_DATA_TCP_CMD = 0x44,
6263
GET_DATABUF_TCP_CMD = 0x45,
64+
6365
};
6466

6567
#if 0

0 commit comments

Comments
 (0)