Line 50... |
Line 50... |
|
|
// From my own library
|
// From my own library
|
#include "llcomms.h"
|
#include "llcomms.h"
|
#include "deppi.h"
|
#include "deppi.h"
|
|
|
DEPPI::DEPPI(char *szSel) {
|
FILE *dbgfp = stderr;
|
if (!DmgrOpen(&m_dev, szSel)) {
|
|
fprintf(stderr, "Open failed!\n");
|
DEPPI::DEPPI(const char *szSel) {
|
|
if ((!szSel)||(szSel[0] == '\0')) {
|
|
// Number of digilent devcies on a system
|
|
int pcdvc;
|
|
|
|
// Go fish and try to find the device
|
|
DmgrEnumDevices(&pcdvc);
|
|
|
|
if (pcdvc < 0) {
|
|
depperr();
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
//
|
|
int found = 0; // Number of devices found mtg our criteria
|
|
DVC dvcinfo; // A structure to receive device info
|
|
int foundid=-1; // The id number of the device we found
|
|
|
|
//
|
|
for(int devid=0; devid < pcdvc; devid++) {
|
|
DmgrGetDvc(devid, &dvcinfo);
|
|
// fprintf(dbgfp, "DEVICE NAME: %s\n", dvcinfo.szName);
|
|
if (strcmp(dvcinfo.szName, "CmodS6")==0) {
|
|
found++;
|
|
// fprintf(dbgfp, "Found a CMOD!\n");
|
|
foundid = devid;
|
|
}
|
|
}
|
|
|
|
if (found == 0) {
|
|
fprintf(stderr, "No CModS6 devices found\n");
|
|
exit(EXIT_FAILURE);
|
|
} else if (found > 1) {
|
|
fprintf(stderr, "More than one CModS6 device found. Please consider opening your\n");
|
|
fprintf(stderr, "device with a valid serial number instead.\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
DmgrGetDvc(foundid, &dvcinfo);
|
|
if (!DmgrOpen(&m_dev, dvcinfo.szConn)) {
|
|
fprintf(stderr, "Could not open device!\n");
|
|
depperr();
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
//
|
|
DmgrFreeDvcEnum();
|
|
} else if (!DmgrOpen(&m_dev, (char *)szSel)) {
|
|
// We know the device serial number, so go open that particular
|
|
// device
|
|
fprintf(stderr, "Named device open (DmgrOpen) failed!\n");
|
|
depperr();
|
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
}
|
}
|
|
|
if (!DeppEnable(m_dev)) {
|
if (!DeppEnable(m_dev)) {
|
fprintf(stderr, "Could not enable DEPP interface\n");
|
fprintf(stderr, "Could not enable DEPP interface to (opened) device\n");
|
|
|
|
depperr();
|
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
}
|
}
|
|
|
m_int = false, m_err = false;
|
m_int = false, m_err = false;
|
|
|
Line 81... |
Line 134... |
}
|
}
|
|
|
void DEPPI::depperr(void) {
|
void DEPPI::depperr(void) {
|
ERC erc = DmgrGetLastError();
|
ERC erc = DmgrGetLastError();
|
if(erc != ercNoErc) {
|
if(erc != ercNoErc) {
|
char scode[cchErcMax], msg[cchErcMsgMax];
|
char scode[cchErcMax], smsg[cchErcMsgMax];
|
DmgrSzFromErc(erc, scode, msg);
|
DmgrSzFromErc(erc, scode, smsg);
|
fprintf(stderr, "ErrCode : %s\n", scode);
|
fprintf(stderr, "ErrCode(%d): %s\n", erc, scode);
|
fprintf(stderr, "ErrMessage: %s\n", msg);
|
fprintf(stderr, "ErrMessage: %s\n", smsg);
|
|
|
|
if (erc == ercCapabilityConflict) {
|
|
fprintf(stderr, "Do you have the hardware manager in Vivado open?\n");
|
|
fprintf(stderr, "That could cause this conflict.\n");
|
|
}
|
close();
|
close();
|
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
}
|
}
|
}
|
}
|
|
|
void DEPPI::write(char *buf, int len) {
|
void DEPPI::write(char *buf, int len) {
|
bool good = true;
|
bool good = true;
|
|
const bool dbg = false;
|
|
|
if (false) {
|
if (dbg) {
|
// Debug code--write one at a time
|
// Debug code--write one at a time
|
fputs("WR: ", stdout);
|
fputs("WR: ", stdout);
|
for(int i=0; i<len; i++) {
|
for(int i=0; i<len; i++) {
|
good = good && DeppPutReg(m_dev, 0, (unsigned char)buf[i], false);
|
good = good && DeppPutReg(m_dev, 0, (unsigned char)buf[i], false);
|
fputc(buf[i], stdout);
|
fputc(buf[i], stdout);
|
Line 113... |
Line 172... |
}
|
}
|
|
|
int DEPPI::read(char *buf, int len, int timeout_ms) {
|
int DEPPI::read(char *buf, int len, int timeout_ms) {
|
int left = len, nr=0;
|
int left = len, nr=0;
|
struct timespec now, later;
|
struct timespec now, later;
|
|
const bool dbg = false;
|
|
|
clock_gettime(CLOCK_MONOTONIC, &now);
|
clock_gettime(CLOCK_MONOTONIC, &now);
|
|
|
// printf("USBI::read(%d) (FIFO is %d-%d)\n", len, m_rend, m_rbeg);
|
if (dbg) fprintf(dbgfp, "USBI::read(%d) (FIFO is %d-%d)\n", len, m_rend, m_rbeg);
|
nr = pop_fifo(buf, left);
|
nr = pop_fifo(buf, left);
|
left -= nr;
|
left -= nr;
|
|
|
while(left > 0) {
|
while(left > 0) {
|
raw_read(left, timeout_ms);
|
raw_read(left, timeout_ms);
|
nr = pop_fifo(&buf[len-left], left);
|
nr = pop_fifo(&buf[len-left], left);
|
left -= nr;
|
left -= nr;
|
|
|
// printf("\tWHILE (nr = %d, LEFT = %d, len=%d)\n", nr, left, len);
|
if (dbg) fprintf(dbgfp, "\tWHILE (nr = %d, LEFT = %d, len=%d)\n", nr, left, len);
|
if (nr == 0)
|
if (nr == 0)
|
break;
|
break;
|
#define TIMEOUT
|
#define TIMEOUT
|
#ifdef TIMEOUT
|
#ifdef TIMEOUT
|
if (timeout_ms == 0)
|
if (timeout_ms == 0)
|
Line 149... |
Line 209... |
break;
|
break;
|
}
|
}
|
#endif
|
#endif
|
}
|
}
|
|
|
// printf("READ %d characters (%d req, %d left)\n", len-left, len, left);
|
if(dbg) fprintf(dbgfp, "READ %d characters (%d req, %d left)\n", len-left, len, left);
|
return len-left;
|
return len-left;
|
}
|
}
|
|
|
void DEPPI::raw_read(const int clen, int timeout_ms) {
|
void DEPPI::raw_read(const int clen, int timeout_ms) {
|
int empty = RCV_BUFMASK - ((m_rbeg - m_rend)&(RCV_BUFMASK));
|
int empty = RCV_BUFMASK - ((m_rbeg - m_rend)&(RCV_BUFMASK));
|
int len = clen;
|
int len = clen;
|
bool good = true;
|
bool good = true;
|
|
const bool dbg = false;
|
|
|
|
|
|
if (dbg) fprintf(dbgfp, "DEPPI::raw_read(len=%d)\n", clen);
|
if (len > empty)
|
if (len > empty)
|
len = empty;
|
len = empty;
|
if (len > 0) {
|
if (len > 0) {
|
// Fill the tail of our buffer
|
// Fill the tail of our buffer
|
int ln = len;
|
int ln = len;
|
Line 175... |
Line 238... |
good = good && DeppGetReg(m_dev, 0, (unsigned char *)&m_rxbuf[i], false);
|
good = good && DeppGetReg(m_dev, 0, (unsigned char *)&m_rxbuf[i], false);
|
usleep(1);
|
usleep(1);
|
}
|
}
|
} else
|
} else
|
good = good && DeppGetRegRepeat(m_dev, 0, (unsigned char *)m_rxbuf, ln, false);
|
good = good && DeppGetRegRepeat(m_dev, 0, (unsigned char *)m_rxbuf, ln, false);
|
// fprintf(stdout, "Pushing to FIFO\n");
|
if(dbg) fprintf(dbgfp, "DEPP: Pushing to FIFO\n");
|
push_fifo(m_rxbuf, ln);
|
push_fifo(m_rxbuf, ln);
|
len -= ln;
|
len -= ln;
|
}
|
}
|
|
|
if (!good)
|
if (!good)
|
depperr();
|
depperr();
|
}
|
}
|
|
|
void DEPPI::flush_read(void) {
|
void DEPPI::flush_read(void) {
|
while(poll(4)) {
|
const bool dbg = false;
|
|
|
|
if (dbg) fprintf(dbgfp, "DEPPI::FLUSH-READ()\n");
|
|
|
|
do {
|
m_rbeg = m_rend = 0;
|
m_rbeg = m_rend = 0;
|
}
|
} while(poll(4));
|
|
|
|
if (dbg) fprintf(dbgfp, "DEPPI::FLUSH-READ() -- COMPLETE\n");
|
}
|
}
|
|
|
void DEPPI::push_fifo(char *buf, int len) {
|
void DEPPI::push_fifo(char *buf, int len) {
|
char last = 0;
|
char last = 0;
|
char *sptr = buf;
|
char *sptr = buf;
|
|
const bool dbg = false;
|
|
|
// fprintf(stdout, "PUSH(%d)\n", len);
|
if (dbg) fprintf(dbgfp, "DEPP::PUSH(%d)\n", len);
|
|
|
if (m_rbeg != m_rend)
|
if (m_rbeg != m_rend)
|
last = m_rbuf[(m_rbeg-1)&RCV_BUFMASK];
|
last = m_rbuf[(m_rbeg-1)&RCV_BUFMASK];
|
|
if (dbg) fprintf(dbgfp, "DEPPI::PUSH() last=%d, rbeg=%d, rend=%d\n", last, m_rbeg, m_rend);
|
for(int i=0; i<len; i++) {
|
for(int i=0; i<len; i++) {
|
char v = *sptr++;
|
char v = *sptr++;
|
if (((v & 0x80)||((unsigned char)v < 0x10))&&(v == last)) {
|
if (((v & 0x80)||((unsigned char)v < 0x10))&&(v == last)) {
|
// Skipp any stuff bytes
|
// Skipp any stuff bytes
|
// fprintf(stderr, "SKIPPING-1: %02x\n", v & 0x0ff);
|
if (dbg) fprintf(dbgfp, "SKIPPING-1: %02x\n", v & 0x0ff);
|
} else if ((unsigned char)v == 0x0ff) {
|
} else if ((unsigned char)v == 0x0ff) {
|
// Skipp any not-yet-ready bytes
|
// Skipp any not-yet-ready bytes
|
// fprintf(stdout, "SKIPPING-2: %02x\n", 0x0ff);
|
if (dbg) fprintf(dbgfp, "SKIPPING-2: %02x\n", 0x0ff);
|
} else {
|
} else {
|
m_rbuf[m_rbeg] = v;
|
m_rbuf[m_rbeg] = v;
|
// fprintf(stdout, "PUSHING: %02x %c\n", v&0x0ff,
|
if (dbg) fprintf(dbgfp, "PUSHING: 0x%02x \'%c\'\n",
|
// isprint(v)?v:'.');
|
v&0x0ff, isprint(v)?v:'.');
|
m_rbeg = (m_rbeg+1)&(RCV_BUFMASK);
|
m_rbeg = (m_rbeg+1)&(RCV_BUFMASK);
|
} last = v;
|
} last = v;
|
}
|
}
|
}
|
}
|
|
|
int DEPPI::pop_fifo(char *buf, int len) {
|
int DEPPI::pop_fifo(char *buf, int len) {
|
int avail = (m_rbeg - m_rend)&(RCV_BUFMASK);
|
int avail = (m_rbeg - m_rend)&(RCV_BUFMASK);
|
int left = len;
|
int left = len;
|
int nr = 0;
|
int nr = 0;
|
|
const bool dbg = false;
|
|
|
// printf("Attempting to pop %d items from FIFO (%d - %d)\n",
|
if (dbg) fprintf(dbgfp, "Attempting to pop %d items from FIFO (%d - %d)\n",
|
// len, m_rend, m_rbeg);
|
len, m_rend, m_rbeg);
|
while((avail > 0)&&(left > 0)) {
|
while((avail > 0)&&(left > 0)) {
|
int ln = RCV_BUFLEN-m_rend;
|
int ln = RCV_BUFLEN-m_rend;
|
if (ln > left)
|
if (ln > left)
|
ln = left;
|
ln = left;
|
if (ln > avail)
|
if (ln > avail)
|
Line 242... |
Line 314... |
}
|
}
|
|
|
bool DEPPI::poll(unsigned ms) {
|
bool DEPPI::poll(unsigned ms) {
|
int avail = (m_rbeg-m_rend)&(RCV_BUFMASK);
|
int avail = (m_rbeg-m_rend)&(RCV_BUFMASK);
|
bool r = true;
|
bool r = true;
|
|
const bool dbg = false;
|
|
|
// printf("POLL\n");
|
if (dbg) fprintf(dbgfp, "POLL\n");
|
if ((avail < 2)&&((avail<1)||(m_rbuf[m_rend]&0x80)||(m_rbuf[m_rend]<0x10))) {
|
if ((avail < 2)&&((avail<1)||(m_rbuf[m_rend]&0x80)||(m_rbuf[m_rend]<0x10))) {
|
// printf("POLL -- CALLS RAW READ\n");
|
if (dbg) fprintf(dbgfp, "POLL -- CALLS RAW READ\n");
|
raw_read(4,ms);
|
raw_read(4,ms);
|
avail = (m_rbeg-m_rend)&(RCV_BUFMASK);
|
avail = (m_rbeg-m_rend)&(RCV_BUFMASK);
|
|
|
if (avail != 0) {
|
if (avail != 0) {
|
// Read 'til there's nothing more to be read
|
// Read 'til there's nothing more to be read
|
Line 257... |
Line 330... |
while(((v&0x80)==0)&&((unsigned)v>=0x10)&&(avail < RCV_BUFMASK-32)) {
|
while(((v&0x80)==0)&&((unsigned)v>=0x10)&&(avail < RCV_BUFMASK-32)) {
|
raw_read(26,ms);
|
raw_read(26,ms);
|
if (avail == ((m_rbeg-m_rend)&(RCV_BUFMASK)))
|
if (avail == ((m_rbeg-m_rend)&(RCV_BUFMASK)))
|
break; // We didn't read anything more
|
break; // We didn't read anything more
|
avail = (m_rbeg-m_rend)&(RCV_BUFMASK);
|
avail = (m_rbeg-m_rend)&(RCV_BUFMASK);
|
// printf("POLL/LOOP -- %d available\n", avail);
|
if (dbg) fprintf(dbgfp, "POLL/LOOP -- %d available\n", avail);
|
}
|
}
|
if (avail < 1)
|
if (avail < 1)
|
r = false;
|
r = false;
|
else if ((avail==1)&&((m_rbuf[m_rend]&0x80)||(m_rbuf[m_rend]<0x10)))
|
else if ((avail==1)&&((m_rbuf[m_rend]&0x80)||(m_rbuf[m_rend]<0x10)))
|
r = false;
|
r = false;
|
} else r = false;
|
} else r = false;
|
}
|
}
|
// printf("POLL -- is %s\n", (r)?"true":"false");
|
if (dbg) fprintf(dbgfp, "POLL -- is %s\n", (r)?"true":"false");
|
|
|
return r;
|
return r;
|
}
|
}
|
|
|
No newline at end of file
|
No newline at end of file
|