📄 ee_rom.c,v
字号:
head 1.2;access;symbols;locks dls:1.2; strict;comment @ * @;1.2date 97.09.21.19.25.55; author dls; state Dist;branches;next 1.1;1.1date 94.09.24.01.00.41; author dls; state Works;branches;next ;desc@@1.2log@pre-3e code@text@/* ee_rom - ee_romread */#include <conf.h>#include <kernel.h>#include <network.h>#include <i386.h>#include <ee.h>#define ROMDELAY() { delay(1); }/*------------------------------------------------------------------------ * ee_romread - read PROM data *------------------------------------------------------------------------ */unsigned shortee_romread(csr, from)int csr; /* base I/O address */int from; /* EEPROM offset (words) */{ unsigned char data, out; unsigned short rv; int i; outb(csr + EEC, EEC_586R); /* reset 586 */ ROMDELAY(); outb(csr + EEC, EEC_586R|EEC_GAR); /* board docs say wait 240us after reset; we use 500us to * be conservative. */ delay(50); outb(csr + EEC, EEC_586R); ROMDELAY(); outb(csr + EEC, 0); out = EEC_586R|EEC_CS; outb(csr + EEC, out); /* select PROM */ ROMDELAY(); ee_romwrite(csr, EEX_READ, 3); ee_romwrite(csr, from, 6); /* max 64 16-bit regs */ rv = 0; for (i=0; i<16; ++i) { outb(csr+EEC, out | EEC_SK); ROMDELAY(); data = inb(csr+EEC); data &= EEC_DO; rv <<= 1; rv |= ((unsigned short)data >> 3); outb(csr+EEC, out & ~EEC_SK); ROMDELAY(); } outb(csr + EEC, 0); /* clear 586 reset */ return rv;}ee_romwrite(csr, offset, nbits)int csr;int offset;int nbits;{ unsigned char x; unsigned short mask; x = EEC_586R | EEC_CS; for (mask = 1 << (nbits - 1); mask != 0; mask >>= 1) { x &= 0xFB; if ((offset & mask) != 0) x |= EEC_DI; outb(csr+EEC, x); ROMDELAY(); /* clock */ outb(csr+EEC, x | EEC_SK); ROMDELAY() outb(csr+EEC, x & ~EEC_SK); ROMDELAY(); } outb(csr+EEC, x & 0xFB);}struct etdev ee[Neth]; /* should be "Nee" */@1.1log@Initial revision@text@d9 1a9 1#define ROMDELAY() { DELAY(1); }d22 1a22 1 int i, j;d27 4a30 1 DELAY(500);d62 1a62 1 unsigned char x, eec;@
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -