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

Subversion Repositories xulalx25soc

[/] [xulalx25soc/] [trunk/] [sw/] [ttybus.cpp] - Diff between revs 5 and 11

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

Rev 5 Rev 11
Line 66... Line 66...
#define TTYC_ERR        '5'
#define TTYC_ERR        '5'
 
 
const   unsigned TTYBUS::MAXRDLEN = 1024;
const   unsigned TTYBUS::MAXRDLEN = 1024;
const   unsigned TTYBUS::MAXWRLEN = 32;
const   unsigned TTYBUS::MAXWRLEN = 32;
 
 
#define DBGPRINTF       null
// #define      DBGPRINTF       null
// #define      DBGPRINTF       printf
// #define      DBGPRINTF       printf
void    null(...) {}
// void null(...) {}
 
#define DBGPRINTF       filedump
 
 
 
#include <stdarg.h>
 
// #include <varargs.h>
 
void    filedump(const char *fmt, ...) {
 
        static  FILE *dbgfp = NULL;
 
        va_list args;
 
 
 
        if (!dbgfp)
 
                dbgfp = fopen("debug.txt", "w");
 
        va_start(args, fmt);
 
        vfprintf(dbgfp, fmt, args);
 
        va_end(args);
 
        fflush(dbgfp);
 
}
 
 
char    TTYBUS::charenc(const int sixbitval) {
char    TTYBUS::charenc(const int sixbitval) {
        if (sixbitval < 10)
        if (sixbitval < 10)
                return '0' + sixbitval;
                return '0' + sixbitval;
        else if (sixbitval < 10+26)
        else if (sixbitval < 10+26)
Line 263... Line 278...
TTYBUS::BUSW    TTYBUS::readio(const TTYBUS::BUSW a) {
TTYBUS::BUSW    TTYBUS::readio(const TTYBUS::BUSW a) {
        BUSW    v;
        BUSW    v;
 
 
        // I/O reads are now the same as vector reads, but with a vector length
        // I/O reads are now the same as vector reads, but with a vector length
        // of one.
        // of one.
 
        DBGPRINTF("READIO(0x%08x)\n", a);
        try {
        try {
                readv(a, 0, 1, &v);
                readv(a, 0, 1, &v);
        } catch(BUSERR b) {
        } catch(BUSERR b) {
                throw BUSERR(a);
                throw BUSERR(a);
        }
        }
Line 310... Line 326...
                        *ptr++ = charenc((diffaddr>>12) & 0x03f);
                        *ptr++ = charenc((diffaddr>>12) & 0x03f);
                        *ptr++ = charenc((diffaddr>> 6) & 0x03f);
                        *ptr++ = charenc((diffaddr>> 6) & 0x03f);
                        *ptr++ = charenc( diffaddr      & 0x03f);
                        *ptr++ = charenc( diffaddr      & 0x03f);
                }
                }
                *ptr = '\0';
                *ptr = '\0';
                // DBGPRINTF("DIF-ADDR: (%ld) \'%s\'\n", ptr-m_buf, m_buf);
                DBGPRINTF("DIF-ADDR: (%ld) \'%s\'\n", ptr-m_buf, m_buf);
        }
        }
 
 
        {
        {
                // Encode an absolute (low memory) address
                // Encode an absolute (low memory) address
                // Prefer absolute address encoding over differential encoding,
                // Prefer absolute address encoding over differential encoding,
Line 323... Line 339...
                if ((addr <= 0x03f)&&((ptr == m_buf)||(ptr >= &m_buf[2]))) {
                if ((addr <= 0x03f)&&((ptr == m_buf)||(ptr >= &m_buf[2]))) {
                        ptr = m_buf;
                        ptr = m_buf;
                        *ptr++ = charenc(0x08);
                        *ptr++ = charenc(0x08);
                        *ptr++ = charenc(addr);
                        *ptr++ = charenc(addr);
                } else if((addr <= 0x0fff)&&((ptr == m_buf)||(ptr >= &m_buf[3]))) {
                } else if((addr <= 0x0fff)&&((ptr == m_buf)||(ptr >= &m_buf[3]))) {
                        // DBGPRINTF("Setting ADDR.3 to %08x\n", addr);
                        DBGPRINTF("Setting ADDR.3 to %08x\n", addr);
                        ptr = m_buf;
                        ptr = m_buf;
                        *ptr++ = charenc(0x0a);
                        *ptr++ = charenc(0x0a);
                        *ptr++ = charenc((addr>> 6) & 0x03f);
                        *ptr++ = charenc((addr>> 6) & 0x03f);
                        *ptr++ = charenc( addr      & 0x03f);
                        *ptr++ = charenc( addr      & 0x03f);
                } else if((addr <= 0x03ffff)&&((ptr == m_buf)||(ptr >= &m_buf[4]))) {
                } else if((addr <= 0x03ffff)&&((ptr == m_buf)||(ptr >= &m_buf[4]))) {
                        // DBGPRINTF("Setting ADDR.4 to %08x\n", addr);
                        DBGPRINTF("Setting ADDR.4 to %08x\n", addr);
                        ptr = m_buf;
                        ptr = m_buf;
                        *ptr++ = charenc(0x0c);
                        *ptr++ = charenc(0x0c);
                        *ptr++ = charenc((addr>>12) & 0x03f);
                        *ptr++ = charenc((addr>>12) & 0x03f);
                        *ptr++ = charenc((addr>> 6) & 0x03f);
                        *ptr++ = charenc((addr>> 6) & 0x03f);
                        *ptr++ = charenc( addr      & 0x03f);
                        *ptr++ = charenc( addr      & 0x03f);
                } else if((addr <= 0x0ffffff)&&((ptr == m_buf)||(ptr >= &m_buf[5]))) {
                } else if((addr <= 0x0ffffff)&&((ptr == m_buf)||(ptr >= &m_buf[5]))) {
                        // DBGPRINTF("Setting ADDR.5 to %08x\n", addr);
                        DBGPRINTF("Setting ADDR.5 to %08x\n", addr);
                        ptr = m_buf;
                        ptr = m_buf;
                        *ptr++ = charenc(0x0e);
                        *ptr++ = charenc(0x0e);
                        *ptr++ = charenc((addr>>18) & 0x03f);
                        *ptr++ = charenc((addr>>18) & 0x03f);
                        *ptr++ = charenc((addr>>12) & 0x03f);
                        *ptr++ = charenc((addr>>12) & 0x03f);
                        *ptr++ = charenc((addr>> 6) & 0x03f);
                        *ptr++ = charenc((addr>> 6) & 0x03f);
Line 351... Line 367...
                        ptr+=6;
                        ptr+=6;
                }
                }
        }
        }
 
 
        *ptr = '\0';
        *ptr = '\0';
        // DBGPRINTF("ADDR-CMD: (%ld) \'%s\'\n", ptr-m_buf, m_buf);
        DBGPRINTF("ADDR-CMD: (%ld) \'%s\'\n", ptr-m_buf, m_buf);
        m_rdaddr = 0;
        m_rdaddr = 0;
 
 
        return ptr;
        return ptr;
}
}
 
 
char    *TTYBUS::readcmd(const int inc, const int len, char *buf) {
char    *TTYBUS::readcmd(const int inc, const int len, char *buf) {
        char    *ptr = buf;
        char    *ptr = buf;
 
 
        // DBGPRINTF("READCMD: LEN = %d\n", len);
        DBGPRINTF("READCMD: LEN = %d\n", len);
        assert(len < 520);
        assert(len < 520);
        assert(len > 0);
        assert(len > 0);
 
 
        if ((len < 8)||((len == 8)&&(inc))) {
        if ((len < 8)||((len == 8)&&(inc))) {
                *ptr++ = charenc(0x20 + (((len-1)&0x07)<<1) + (inc?1:0));
                *ptr++ = charenc(0x20 + (((len-1)&0x07)<<1) + (inc?1:0));
Line 382... Line 398...
        // TTYBUS::BUSW addr = a;
        // TTYBUS::BUSW addr = a;
        char    *ptr = m_buf;
        char    *ptr = m_buf;
 
 
        if (len <= 0)
        if (len <= 0)
                return;
                return;
        // DBGPRINTF("READV(%08x,%d,#%4d)\n", a, inc, len);
        DBGPRINTF("READV(%08x,%d,#%4d)\n", a, inc, len);
 
 
        ptr = encode_address(a);
        ptr = encode_address(a);
        try {
        try {
            while(cmdrd < len) {
            while(cmdrd < len) {
                // ptr = m_buf;
                // ptr = m_buf;
Line 412... Line 428...
        } catch(BUSERR b) {
        } catch(BUSERR b) {
                throw BUSERR(a+((inc)?nread:0));
                throw BUSERR(a+((inc)?nread:0));
        }
        }
 
 
        if ((unsigned)m_lastaddr != (a+((inc)?(len):0))) {
        if ((unsigned)m_lastaddr != (a+((inc)?(len):0))) {
 
                DBGPRINTF("TTYBUS::READV(a=%08x,inc=%d,len=%4x,x) ERR: (Last) %08x != %08x + %08x (Expected)\n", a, inc, len, m_lastaddr, a, (inc)?(len):0);
                printf("TTYBUS::READV(a=%08x,inc=%d,len=%4x,x) ERR: (Last) %08x != %08x + %08x (Expected)\n", a, inc, len, m_lastaddr, a, (inc)?(len):0);
                printf("TTYBUS::READV(a=%08x,inc=%d,len=%4x,x) ERR: (Last) %08x != %08x + %08x (Expected)\n", a, inc, len, m_lastaddr, a, (inc)?(len):0);
                sleep(1);
                sleep(1);
                assert((int)m_lastaddr == (a+(inc)?(len):0));
                assert((int)m_lastaddr == (a+(inc)?(len):0));
                exit(-3);
                exit(-3);
        }
        }
Line 432... Line 449...
TTYBUS::BUSW    TTYBUS::readword(void) {
TTYBUS::BUSW    TTYBUS::readword(void) {
        TTYBUS::BUSW    val = 0;
        TTYBUS::BUSW    val = 0;
        int             nr;
        int             nr;
        unsigned        sixbits;
        unsigned        sixbits;
 
 
        // DBGPRINTF("READ-WORD()\n");
        DBGPRINTF("READ-WORD()\n");
 
 
        bool    found_start = false;
        bool    found_start = false;
        do {
        do {
                // Blocking read (for now)
                // Blocking read (for now)
                do {
                do {
Line 479... Line 496...
                        val = (val<<6) | (chardec(m_buf[5]) & 0x03f);
                        val = (val<<6) | (chardec(m_buf[5]) & 0x03f);
 
 
                        m_addr_set = true;
                        m_addr_set = true;
                        m_lastaddr = val;
                        m_lastaddr = val;
 
 
                        // DBGPRINTF("RCVD ADDR: 0x%08x\n", val);
                        DBGPRINTF("RCVD ADDR: 0x%08x\n", val);
                } else if (0x0c == (sixbits & 0x03c)) { // Set 32-bit address,compressed
                } else if (0x0c == (sixbits & 0x03c)) { // Set 32-bit address,compressed
                        int nw = (sixbits & 0x03) + 2;
                        int nw = (sixbits & 0x03) + 2;
                        do {
                        do {
                                nr += lclreadcode(&m_buf[nr], nw-nr);
                                nr += lclreadcode(&m_buf[nr], nw-nr);
                        } while (nr < nw);
                        } while (nr < nw);
Line 504... Line 521...
                                val = (val<<6) | (chardec(m_buf[4]) & 0x03f);
                                val = (val<<6) | (chardec(m_buf[4]) & 0x03f);
                        }
                        }
 
 
                        m_addr_set = true;
                        m_addr_set = true;
                        m_lastaddr = val;
                        m_lastaddr = val;
                        // DBGPRINTF("RCVD ADDR: 0x%08x (%d bytes)\n", val, nw+1);
                        DBGPRINTF("RCVD ADDR: 0x%08x (%d bytes)\n", val, nw+1);
                } else
                } else
                        found_start = true;
                        found_start = true;
        } while(!found_start);
        } while(!found_start);
 
 
        int     rdaddr;
        int     rdaddr;
Line 561... Line 578...
                        m_dev->close();
                        m_dev->close();
                        exit(-1);
                        exit(-1);
                } for(int i=0; i<nr; i++) {
                } for(int i=0; i<nr; i++) {
                        if (m_buf[i] == TTYC_INT) {
                        if (m_buf[i] == TTYC_INT) {
                                m_interrupt_flag = true;
                                m_interrupt_flag = true;
                                // DBGPRINTF("!!!!!!!!!!!!!!!!! ----- INTERRUPT!\n");
                                DBGPRINTF("!!!!!!!!!!!!!!!!! ----- INTERRUPT!\n");
                        } else if (m_buf[i] == TTYC_IDLE) {
                        } else if (m_buf[i] == TTYC_IDLE) {
                                // DBGPRINTF("Interface is now idle\n");
                                DBGPRINTF("Interface is now idle\n");
                        } else if (m_buf[i] == TTYC_WRITE) {
                        } else if (m_buf[i] == TTYC_WRITE) {
                        } else if (m_buf[i] == TTYC_RESET) {
                        } else if (m_buf[i] == TTYC_RESET) {
                                // DBGPRINTF("Bus was RESET!\n");
                                DBGPRINTF("Bus was RESET!\n");
                        } else if (m_buf[i] == TTYC_ERR) {
                        } else if (m_buf[i] == TTYC_ERR) {
                                DBGPRINTF("Bus error\n");
                                DBGPRINTF("Bus error\n");
                        } else if (m_buf[i] == TTYC_BUSY) {
                        } else if (m_buf[i] == TTYC_BUSY) {
                                // DBGPRINTF("Interface is ... busy ??\n");
                                DBGPRINTF("Interface is ... busy ??\n");
                        }
                        }
                        // else if (m_buf[nr] == 'Q')
                        // else if (m_buf[nr] == 'Q')
                        // else if (m_buf[nr] == 'W')
                        // else if (m_buf[nr] == 'W')
                        // else if (m_buf[nr] == '\n')
                        // else if (m_buf[nr] == '\n')
                }
                }

powered by: WebSVN 2.1.0

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