Annotation of 43BSD/contrib/X/libvs100/dl.c, revision 1.1.1.1

1.1       root        1: /* $Header: dl.c,v 10.3 86/02/01 15:46:40 tony Rel $ */
                      2: /* dl.c                downloads code into the vs100.  Routines are
                      3:  *
                      4:  *     DownLoad        Determines device version and downloads firmware
                      5:  *
                      6:  *     Takes an int which is the device to download and
                      7:  *             returns 0 if everything went well and -1 if
                      8:  *             there is some problem.
                      9:  *
                     10:  */
                     11: 
                     12: /****************************************************************************
                     13:  *                                                                         *
                     14:  *  Copyright (c) 1983, 1984 by                                                    *
                     15:  *  DIGITAL EQUIPMENT CORPORATION, Maynard, Massachusetts.                 *
                     16:  *  All rights reserved.                                                   *
                     17:  *                                                                         *
                     18:  *  This software is furnished on an as-is basis and may be used and copied *
                     19:  *  only with inclusion of the above copyright notice. This software or any *
                     20:  *  other copies thereof may be provided or otherwise made available to     *
                     21:  *  others only for non-commercial purposes.  No title to or ownership of   *
                     22:  *  the software is hereby transferred.                                            *
                     23:  *                                                                         *
                     24:  *  The information in this software is  subject to change without notice   *
                     25:  *  and  should  not  be  construed as  a commitment by DIGITAL EQUIPMENT   *
                     26:  *  CORPORATION.                                                           *
                     27:  *                                                                         *
                     28:  *  DIGITAL assumes no responsibility for the use  or  reliability of its   *
                     29:  *  software on equipment which is not supplied by DIGITAL.                *
                     30:  *                                                                         *
                     31:  *                                                                         *
                     32:  ****************************************************************************/
                     33: 
                     34: #include "vs100.h"
                     35: #include <sys/ioctl.h>
                     36: #include "vsioctl.h"
                     37: #include "vssite.h"
                     38: 
                     39: #define CODE_START_ADDRESS 0x1000
                     40: 
                     41: #define BUFSIZE 512            /* Why not?  Everyone uses 512 */
                     42: 
                     43: int HexArray[128];
                     44: #define Hex2(p)                ((HexArray[*(p)]<<4)+HexArray[*((p)+1)])
                     45: 
                     46: extern int vsdev;              /* File number of the workstation */
                     47: BitMap screen;                 /* The actual screen memory */
                     48: 
                     49: /* Determine what version of the vs we have and download the appropriate
                     50:  * firmware.  Determining the version is not trivial and as versions change
                     51:  * this may also have to change.
                     52:  */
                     53: 
                     54: int DownLoad ()
                     55: {
                     56:        FILE *fopen(), *fd;     /* The file descriptor */
                     57:        char *AllocateSpace();
                     58:        char *filename;         /* Name of download file */
                     59:        char *buf;              /* The input buffer */
                     60:        char inline[BUFSIZE];   /* The line from the file */
                     61:        int bufpos;             /* The current position in the buffer */
                     62:        int linesize;           /* The number of bytes represented by a line */
                     63:        int lineaddr;           /* The intended address of the line */
                     64:        int nextaddr;           /* The expected next address */
                     65:        int destaddr;           /* The destination for the current buffer */
                     66:        caddr_t pMem;           /* Program memory pointer */
                     67:        caddr_t startAddr;      /* Address to start microcode */
                     68:        MemArea programMemory;  /* Information about program memory */
                     69:        char textVersion[5];    /* The version number reported back */
                     70:        int version;
                     71:        char errmessage[BUFSIZE];       /* error message buffer */
                     72: 
                     73:        /* Initialize the device,
                     74:         * figure out just what version of the device we have, and
                     75:         * get the address to load the code into
                     76:         */
                     77: 
                     78:        if (PacketInit() ||
                     79:            ioctl (vsdev, (int) VSIOINIT, (caddr_t) NULL) ||
                     80:            ioctl (vsdev, (int) VSIOGETVER, (caddr_t) &version) ||
                     81:            ReportStatus ((int *) textVersion, (short *) NULL, (short *) NULL,
                     82:                          &screen, (MemArea *) NULL, &programMemory,
                     83:                          (MemArea *) NULL, 1)) {
                     84:                VSError ();
                     85:                return(-1);
                     86:        }
                     87: 
                     88:        switch (version) {
                     89:            case 8:
                     90: 
                     91:                /* Everyone in the world reports 8!  Fortunately I can
                     92:                   tell them apart by other means (Then why isn't that
                     93:                   the version???  You tell me!) */
                     94: 
                     95:                if (screen.bm_height != 800) filename = LOAD_FILE_3_8;
                     96:                else filename = LOAD_FILE_2B;
                     97:                break;
                     98: 
                     99:            case 1:     /* This is an SBO, I think!  */
                    100:                filename = LOAD_FILE_SBO;
                    101:                break;
                    102: 
                    103:            default:
                    104: 
                    105:                /* Assume we have a 3.10.  We may even be right */
                    106: 
                    107:                filename = LOAD_FILE_3_10;
                    108:                break;
                    109:        }
                    110: 
                    111:        pMem = *(caddr_t *) programMemory.m_base;
                    112:        startAddr = pMem + CODE_START_ADDRESS;
                    113: 
                    114:        /* Open the file in read mode */
                    115: 
                    116:        if ((fd = fopen (filename, "r")) == NULL) {
                    117:                sprintf(errmessage, "Xvs100: Can't open uCode file %s.\n",
                    118:                        filename);
                    119:                DeviceError(errmessage);
                    120:                return (-1);
                    121:        }
                    122: 
                    123:        InitHexArray();
                    124: 
                    125:        /* Read in the s-line file and copy to the workstation */
                    126: 
                    127:        bufpos = 0;
                    128:        buf = AllocateSpace (BUFSIZE);
                    129:        destaddr = 0;
                    130: 
                    131:        while (fgets (inline, BUFSIZE, fd) != NULL) {
                    132:            if (inline[0] == '\n') continue;
                    133:            if (ParseLine (inline, &linesize, &lineaddr)) break;
                    134:            if (destaddr == 0) destaddr = nextaddr = lineaddr;
                    135:            if (bufpos > 0 &&
                    136:                    (lineaddr != nextaddr || linesize + bufpos > BUFSIZE)) {
                    137:                if (MoveObjectDownRom (buf, pMem + destaddr, bufpos))
                    138:                    return (-1);
                    139:                buf = AllocateSpace (BUFSIZE);
                    140:                bufpos = 0;
                    141:                destaddr = nextaddr = lineaddr;
                    142:            }
                    143:            CopyLine (inline, buf, linesize, bufpos);
                    144:            bufpos += linesize;
                    145:            nextaddr += linesize;
                    146:        }
                    147: 
                    148:        /* Copy the last packet */
                    149: 
                    150:        if (bufpos > 0) {
                    151:            if (MoveObjectDownRom (buf, pMem + destaddr, bufpos))
                    152:                    return (-1);
                    153:        }
                    154: 
                    155:        fclose (fd);
                    156: 
                    157:        /* Sync the writes to make sure it's all been downloaded! */
                    158: 
                    159:        if (SynchWrites()) return (-1);
                    160: 
                    161:        /* Start microcode */
                    162: 
                    163:        if (ioctl (vsdev, (int) VSIOSTART, (caddr_t) &startAddr)) return (-1);
                    164: 
                    165:        return (VSMemInit());           /* Initialize memory allocator */
                    166: }
                    167: 
                    168: /* The following routines parse the so-called s-line format.  This was
                    169:  * lifted more or less verbatim from the vms software; I don't fully
                    170:  * understand it and you certainly don't want to even bother trying.
                    171:  */
                    172: 
                    173: ParseLine (line, linesize, lineaddr)
                    174:        char *line;
                    175:        int *linesize, *lineaddr;
                    176: {
                    177:        if (line[0] != 'S') DLError ("Invalid format", line);
                    178: 
                    179:        switch (line[1]) {
                    180:            case '0':
                    181:                break;
                    182:            case '1': case '2':
                    183: #ifdef notdef
                    184:                CheckLine (line);       /* Checks checksum */
                    185: #endif
                    186:                if (line[1] == '1') {
                    187:                    *linesize = Hex2(line+2) - 3;
                    188:                    *lineaddr = Hex (line+4, 4);
                    189:                } else {
                    190:                    *linesize = Hex2(line+2) - 4;
                    191:                    *lineaddr = Hex (line+4, 6);
                    192:                }
                    193:                break;
                    194:            case '9':
                    195:                return (-1);
                    196:            default:
                    197:                DLError ("Invalid format", line);
                    198:                break;
                    199:        }
                    200:        return (0);
                    201: }
                    202: 
                    203: CopyLine (line, buffer, count, pos)
                    204:        char *line, *buffer;
                    205:        register int count, pos;
                    206: {
                    207:        register char *start;
                    208: 
                    209:        if (line[1] == '1') start = line + 8;
                    210:        else start = line + 10;
                    211: 
                    212:        while (--count >= 0) {
                    213:            buffer[pos^1] = Hex2(start);
                    214:            pos++;
                    215:            start += 2;
                    216:        }
                    217: }
                    218: 
                    219: CheckLine (line)
                    220:        register char *line;
                    221: {
                    222:        register char *lp;
                    223:        register int count;
                    224:        register char checksum;
                    225: 
                    226:        lp = line + 2;
                    227:        count = Hex2(lp);
                    228:        checksum = 0;
                    229: 
                    230:        do {
                    231:            checksum += Hex2(lp);
                    232:            lp += 2;
                    233:        } while (--count >= 0);
                    234: 
                    235:        if (checksum != 0xff) DLError ("Bad checksum", line);
                    236: }
                    237: 
                    238: InitHexArray ()
                    239: {
                    240:     register char c;
                    241:     for (c = 'A'; c <= 'F'; c++) HexArray[c] = c - 'A' + 10;
                    242:     for (c = 'a'; c <= 'f'; c++) HexArray[c] = c - 'a' + 10;
                    243:     for (c= '0'; c <= '9'; c++) HexArray[c] = c - '0';
                    244: }
                    245: 
                    246: int Hex (cp, n)
                    247:        register char *cp;
                    248:        register int n;
                    249: {
                    250:        register int i = 0;
                    251:        while (--n >= 0)
                    252:            i = (i<<4) + HexArray[*cp++];
                    253:        return (i);
                    254: }
                    255: 
                    256: DLError (str1, str2)
                    257:        char *str1, *str2;
                    258: {
                    259:        fprintf (stderr, "Downloader: %s: %s\n", str1, str2);
                    260:        fflush (stderr);
                    261:        exit (1);
                    262: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.