[3c90xutil] Update bromutil.c and cromutil.c.
[people/pcmattman/gpxe.git] / contrib / 3c90xutil / ocromutil.c
1 /*
2  * 3c905cutil.c - perform various control ops on the 3C905C bios rom
3  *             which we assume to be an AT49BV512
4  *
5  */
6
7 #ifndef __i386__
8 #  error "This program can't compile or run on non-intel computers"
9 #else
10
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <unistd.h>
14 #include <sys/io.h>
15 #include <string.h>
16
17 int main(int argc, char **argv)
18 {
19   unsigned int ioaddr, i, n;
20   unsigned char b;
21
22   setuid(0); /* if we're setuid, do it really */
23   if (argc != 3) {
24     printf("Usage: romid ioaddr [erase|id|read >file|prog <file]\n");
25     exit(-1);
26   }
27   if (iopl(3)) {
28     perror("iopl()");
29     exit(1);
30   }
31   sscanf(argv[1],"%x",&ioaddr);
32
33   /* Set the register window to 0 for the 3C905C */
34   outw(0x800, ioaddr+0xe);
35
36   if (strcmp(argv[2], "erase") == 0) {
37     /* do the funky chicken to erase the rom contents */
38     outl(0x5555, ioaddr+0x4);
39     outb(0xaa, ioaddr+0x8);
40     outl(0x2aaa, ioaddr+0x4);
41     outb(0x55, ioaddr+0x8);
42     outl(0x5555, ioaddr+0x4);
43     outb(0x80, ioaddr+0x8);
44     outl(0x5555, ioaddr+0x4);
45     outb(0xaa, ioaddr+0x8);
46     outl(0x2aaa, ioaddr+0x4);
47     outb(0x55, ioaddr+0x8);
48     outl(0x5555, ioaddr+0x4);
49     outb(0x10, ioaddr+0x8);
50     sleep (1);
51     printf("Bios ROM at %04x has been erased\n", ioaddr);
52   } else if (strcmp(argv[2], "id") == 0) {
53     outl(0x5555, ioaddr+0x4);
54     outb(0xaa, ioaddr+0x8);
55     outl(0x2aaa, ioaddr+0x4);
56     outb(0x55, ioaddr+0x8);
57     outl(0x5555, ioaddr+0x4);
58     outb(0x90, ioaddr+0x8);
59     /* 10ms delay needed */
60     printf("Manufacturer ID - ");
61     /* manuf. id */
62     outl(0x0000, ioaddr+0x4);
63     printf("%02x\n", inb(ioaddr+0x8));
64     /* device id */
65     outl(0x0001, ioaddr+0x4);
66     printf("Device ID - %02x\n", inb(ioaddr+0x8));
67     /* undo the funky chicken */
68     outl(0x5555, ioaddr+0x4);
69     outb(0xaa, ioaddr+0x8);
70     outl(0x2aaa, ioaddr+0x4);
71     outb(0x55, ioaddr+0x8);
72     outl(0x5555, ioaddr+0x4);
73     outb(0xf0, ioaddr+0x8);
74   } else if (strcmp(argv[2], "read") == 0) {
75     for (i = 0; i < 65536; i++) {
76       outl(i, ioaddr+0x4);
77       b = inb(ioaddr+0x8);
78       write(1, &b, 1);
79     }
80   } else if (strcmp(argv[2], "prog") == 0) {
81     for (i = 0; i < 65536; i++) {
82       n = read(0, &b, 1);
83       if (n == 0)
84         break;
85       if (n < 0) {
86         perror("File Error");
87         exit(-3);
88       }
89       outl(0x5555, ioaddr+0x4);
90       outb(0xaa, ioaddr+0x8);
91       outl(0x2aaa, ioaddr+0x4);
92       outb(0x55, ioaddr+0x8);
93       outl(0x5555, ioaddr+0x4);
94       outb(0xA0, ioaddr+0x8);
95       outl(i, ioaddr+0x4);
96       outb(b, ioaddr+0x8);
97       while (inb(ioaddr+0x8) != b)
98         ;
99     }
100   }
101   return 0;
102 }
103
104 #endif /* __i386__ */