1*26180Ssklower /* 2*26180Ssklower * Copyright (c) 1986 MICOM-Interlan, Inc., Foxborough Mass. 3*26180Ssklower * 4*26180Ssklower * This software is furnished under a license and may only be used 5*26180Ssklower * or copied in accordance with the terms of that license. 6*26180Ssklower * 7*26180Ssklower */ 8*26180Ssklower #ifndef lint 9*26180Ssklower char copyright[] = 10*26180Ssklower "@(#) Copyright (c) 1986 MICOM-Interlan, Inc., Foxborough Mass.\n\ 11*26180Ssklower All rights reserved.\n"; 12*26180Ssklower #endif not lint 13*26180Ssklower 14*26180Ssklower #ifndef lint 15*26180Ssklower static char sccsid[] = "@(#)npload.c 6.1 (Berkeley) 02/14/86"; 16*26180Ssklower #endif not lint 17*26180Ssklower 18*26180Ssklower #include <stdio.h> 19*26180Ssklower #include <fcntl.h> 20*26180Ssklower #include "npcmd.h" 21*26180Ssklower #include <sys/ioctl.h> 22*26180Ssklower 23*26180Ssklower extern int errno; 24*26180Ssklower 25*26180Ssklower main(argc,argv) 26*26180Ssklower int argc; 27*26180Ssklower char **argv; 28*26180Ssklower { 29*26180Ssklower 30*26180Ssklower int ret; 31*26180Ssklower int ed; 32*26180Ssklower int fd; 33*26180Ssklower int nbyte; 34*26180Ssklower char *fname; 35*26180Ssklower char ibuf[1024]; 36*26180Ssklower char obuf[1024]; 37*26180Ssklower long stadd = 0x400; 38*26180Ssklower char *devname = "/dev/np00"; 39*26180Ssklower 40*26180Ssklower switch (argc) { 41*26180Ssklower case 3: 42*26180Ssklower /* Pathname for device to be loaded */ 43*26180Ssklower devname = argv[2]; 44*26180Ssklower case 2: 45*26180Ssklower /* Name of the image file to be loaded */ 46*26180Ssklower fname = argv[1]; 47*26180Ssklower break; 48*26180Ssklower default: 49*26180Ssklower printf("usage: npload imagefile [device]\n"); 50*26180Ssklower exit(1); 51*26180Ssklower } 52*26180Ssklower /* Open the device to be loaded */ 53*26180Ssklower 54*26180Ssklower if((ed = open(devname,O_RDWR)) == -1) { 55*26180Ssklower char fullpath[50]; 56*26180Ssklower (void) sprintf(fullpath, "/dev/%s", devname); 57*26180Ssklower if((ed = open(devname,O_RDWR)) == -1) { 58*26180Ssklower fprintf(stderr, 59*26180Ssklower "%s unable to open device %s errno = %d\n", 60*26180Ssklower argv[0], devname, errno); 61*26180Ssklower exit(2); 62*26180Ssklower } 63*26180Ssklower } 64*26180Ssklower 65*26180Ssklower /* Open the image file */ 66*26180Ssklower 67*26180Ssklower if((fd = open(fname,O_RDONLY)) == -1) { 68*26180Ssklower fprintf(stderr,"%s: unable to open file %s errno = %d\n", 69*26180Ssklower argv[0],fname,errno); 70*26180Ssklower exit(3); 71*26180Ssklower } 72*26180Ssklower 73*26180Ssklower /* Reset the specified device */ 74*26180Ssklower 75*26180Ssklower if(ioctl(ed,NPRESET | IOC_VOID,&stadd) == -1) { 76*26180Ssklower fprintf(stderr,"unable to reset %s errno = %d\n",devname,errno); 77*26180Ssklower exit(4); 78*26180Ssklower } 79*26180Ssklower 80*26180Ssklower /* Seek to address 400 on the device */ 81*26180Ssklower 82*26180Ssklower if(lseek(ed,(long)0x400,0) == -1) { 83*26180Ssklower fprintf(stderr,"seek failed on %s errno = %d.\n",devname,errno); 84*26180Ssklower exit(5); 85*26180Ssklower } 86*26180Ssklower 87*26180Ssklower /* Seek to address 400 on the image file */ 88*26180Ssklower 89*26180Ssklower if(lseek(fd,(long)0x400,0) == -1) { 90*26180Ssklower fprintf(stderr,"seek failed on %s errno = %d.\n",fname,errno); 91*26180Ssklower exit(6); 92*26180Ssklower } 93*26180Ssklower 94*26180Ssklower /* Read from the image file and write to the device */ 95*26180Ssklower 96*26180Ssklower while((nbyte = read(fd,ibuf,1024)) > 0) { 97*26180Ssklower 98*26180Ssklower if((ret = write(ed,ibuf,nbyte)) == -1) { 99*26180Ssklower fprintf(stderr,"Bad write to %s errno = %d\n", 100*26180Ssklower argv[0],errno); 101*26180Ssklower exit(7); 102*26180Ssklower } 103*26180Ssklower } 104*26180Ssklower 105*26180Ssklower /* Issue a begin execution command to the device */ 106*26180Ssklower 107*26180Ssklower if(ioctl(ed,NPSTART | IOC_VOID,&stadd) == -1) { 108*26180Ssklower fprintf(stderr,"Start error on %s errno = %d.\n",devname,errno); 109*26180Ssklower exit(8); 110*26180Ssklower } 111*26180Ssklower 112*26180Ssklower close(fd); 113*26180Ssklower close(ed); 114*26180Ssklower 115*26180Ssklower exit(0); 116*26180Ssklower } 117