ee_rom.c
来自「TCP-IP红宝书源代码」· C语言 代码 · 共 84 行
C
84 行
/* 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 short
ee_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" */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?