xref: /csrg-svn/old/np100/npload.c (revision 26180)
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