Initial revision
[etherboot.git] / contrib / 3c90xutil / cromutil.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
16 int main(int argc, char **argv)
17 {
18   unsigned int ioaddr, i, n;
19   unsigned char b;
20
21   setuid(0); /* if we're setuid, do it really */
22   if (argc != 3) {
23     printf("Usage: romid ioaddr [erase|id|read >file|prog <file]\n");
24     exit(-1);
25   }
26   if (iopl(3)) {
27     perror("iopl()");
28     exit(1);
29   }
30   sscanf(argv[1],"%x",&ioaddr);
31
32   /* Set the register window to 0 for the 3C905C */
33   outw(0x800, ioaddr+0xe);
34
35   if (strcmp(argv[2], "erase") == 0) {
36     /* do the funky chicken to erase the rom contents */
37     outl(0x5555, ioaddr+0x4);
38     outb(0xaa, ioaddr+0x8);
39     outl(0x2aaa, ioaddr+0x4);
40     outb(0x55, ioaddr+0x8);
41     outl(0x5555, ioaddr+0x4);
42     outb(0x80, ioaddr+0x8);
43     outl(0x5555, ioaddr+0x4);
44     outb(0xaa, ioaddr+0x8);
45     outl(0x2aaa, ioaddr+0x4);
46     outb(0x55, ioaddr+0x8);
47     outl(0x5555, ioaddr+0x4);
48     outb(0x10, ioaddr+0x8);
49     sleep (1);
50     printf("Bios ROM at %04x has been erased\n", ioaddr);
51   } else if (strcmp(argv[2], "id") == 0) {
52     outl(0x5555, ioaddr+0x4);
53     outb(0xaa, ioaddr+0x8);
54     outl(0x2aaa, ioaddr+0x4);
55     outb(0x55, ioaddr+0x8);
56     outl(0x5555, ioaddr+0x4);
57     outb(0x90, ioaddr+0x8);
58     /* 10ms delay needed */
59     printf("Manufacturer ID - ");
60     /* manuf. id */
61     outl(0x0000, ioaddr+0x4);
62     printf("%02x\n", inb(ioaddr+0x8));
63     /* device id */
64     outl(0x0001, ioaddr+0x4);
65     printf("Device ID - %02x\n", inb(ioaddr+0x8));
66     /* undo the funky chicken */
67     outl(0x5555, ioaddr+0x4);
68     outb(0xaa, ioaddr+0x8);
69     outl(0x2aaa, ioaddr+0x4);
70     outb(0x55, ioaddr+0x8);
71     outl(0x5555, ioaddr+0x4);
72     outb(0xf0, ioaddr+0x8);
73   } else if (strcmp(argv[2], "read") == 0) {
74     for (i = 0; i < 65536; i++) {
75       outl(i, ioaddr+0x4);
76       b = inb(ioaddr+0x8);
77       write(1, &b, 1);
78     }
79   } else if (strcmp(argv[2], "prog") == 0) {
80     for (i = 0; i < 65536; i++) {
81       n = read(0, &b, 1);
82       if (n == 0)
83         break;
84       if (n < 0) {
85         perror("File Error");
86         exit(-3);
87       }
88       outl(0x5555, ioaddr+0x4);
89       outb(0xaa, ioaddr+0x8);
90       outl(0x2aaa, ioaddr+0x4);
91       outb(0x55, ioaddr+0x8);
92       outl(0x5555, ioaddr+0x4);
93       outb(0xA0, ioaddr+0x8);
94       outl(i, ioaddr+0x4);
95       outb(b, ioaddr+0x8);
96       while (inb(ioaddr+0x8) != b)
97         ;
98     }
99   }
100   return 0;
101 }
102
103 #endif /* __i386__ */