2 * 3c905cutil.c - perform various control ops on the 3C905C bios rom
3 * which we assume to be an AT49BV512
8 # error "This program can't compile or run on non-intel computers"
16 int main(int argc, char **argv)
18 unsigned int ioaddr, i, n;
21 setuid(0); /* if we're setuid, do it really */
23 printf("Usage: romid ioaddr [erase|id|read >file|prog <file]\n");
30 sscanf(argv[1],"%x",&ioaddr);
32 /* Set the register window to 0 for the 3C905C */
33 outw(0x800, ioaddr+0xe);
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);
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 - ");
61 outl(0x0000, ioaddr+0x4);
62 printf("%02x\n", inb(ioaddr+0x8));
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++) {
79 } else if (strcmp(argv[2], "prog") == 0) {
80 for (i = 0; i < 65536; i++) {
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);
96 while (inb(ioaddr+0x8) != b)
103 #endif /* __i386__ */