OpenCores
URL https://opencores.org/ocsvn/s6soc/s6soc/trunk

Subversion Repositories s6soc

[/] [s6soc/] [trunk/] [sw/] [host/] [deppi.cpp] - Diff between revs 11 and 45

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 11 Rev 45
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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.