利用8139C网卡读写EPROM
最后编辑:2010-5-25(修改错别字)
一. 27C256引脚和模式
只读存储器随着技术的发展,主要经历了ROM、PROM、EPROM、EEPROM等。EPROM的擦除只能借助于长时间暴露于紫外线,使用不太方便,常用于产品开发阶段。常用的EPROM大小有:128K位、256K位、512K位等等。由于我手上只有128K和256K大小的EPROM,所以本文主要以256K的EPROM来讲述的。
所谓256K位的EPROM,是指它有256*1024位(BIT),也就是32K字节的EPROM。它是一个28插脚的芯片。DIP封装的27C256的管脚图如下:
图9 27C256
| Q0~Q7:数据脚 A0~A14:地址线 VSS:接地端 VPP:编程电压+12V VCC:+5V电压 E:片选线 G:输出允许
|
下面是它的操作模式:
模式 | E | G | A9 | VPP | Q7~Q0 |
读出 | VIL | VIL | 任意 | VCC | 数据输出 |
禁止输出 | VIL | VIH | 任意 | VCC | 高阻 |
编程 | VIL脉冲 | VIH | 任意 | VPP | 输入数据 |
校验 | VIH | VIL | 任意 | VPP | 输出数据 |
禁止编程 | VIH | VIH | 任意 | VPP | 高阻 |
维持 | VIH | 任意 | 任意 | VCC | 高阻 |
电子标志 | VIL | VIL | VPP | VCC | 标志 |
二. 8139C引脚和ROM插槽
我们在前言部分看到了8139C网卡的实物图,根据网卡的核心部件就是中间部分的8139C芯片(如图10)。
图10 8139C
8139C共有128脚,这些引脚中与网卡上扩展ROM插槽连接的情况如下:
插槽(27C256脚) | 网卡上28针插座与8139C的连接 | 插槽(27C256脚) | |
1(VPP) | 69( MA15) | 46(VDD)+3.3V | 28(VCC)+5V |
2(A12) | 66(MA12) | 68(MA14) | 27(A14) |
3(A7) | 60(MA7) | 67(MA13) | 26(A13) |
4(A6) | 57(MA6) | 61(MA8) | 25(A8) |
5(A5) | 53(MA5) | 63(MA9) | 24(A9) |
6(A4) | 52(MA4) | 65(MA11) | 23(A11) |
7(A3) | 51(MA3) | 接地 | 22(G) |
8(A2) | 49(MA2) | 64(MA10) | 21(A10) |
9(A1) | 48(MA1) | 110(CS) | 20(E) |
10(A0) | 47(MA0) | 100(MD7) | 19(D7) |
11(Q0) | 108(MD0) | 101(MD6) | 18(D6) |
12(Q1) | 107(MD1) | 102(MD5) | 17(D5) |
13(Q2) | 105(MD2) | 103(MD4) | 16(D4) |
14(VSS)GND | 接地 | 104(MD3) | 15(D3) |
8139C利用一个32位寄存器来读写和扩展ROM有关的引脚,该寄存器地址在存储器空间的偏移00D4H~00D7H。所以寄存器读写地址为存储器基地址加00D4H。寄存器格式如下:
位 | 读/写 | 定义 | 描述 |
31-24 | R/W | Q7-Q0 | 反映数据线状态,当外部高阻时为输出,否则为输入 |
23-21 | - | - | 保留 |
20 | W(只写) | CS | 设置CS线,8139C的110线 |
19 | W | OE | 设置OE线,8139C的88线。很多8139C网卡并没有将其和插槽相连。 |
18 | W | WR | 设置WR线,8139C的89线。很多8139C网卡并没有将其和插槽相连。 |
17 | W | SWRWEn | 准许软件访问flash memory: 0: 不准许通过软件访问flash memory 1: 准许通过软件访问flash memory并且在通过软件访问flash memory期间不准许访问EEPROM(我也不太懂什么意思,不过似乎没什么用,下面是原文)
|
16-0 | W | A16-A0 | 设置地址线 |
好了,有了上面的资料,我们下面就开始来利用PCI网卡上的扩展ROM插槽来读写EPROM吧。
三. 27C256的读操作
当G和E脚都为低电平,而VCC和VPP脚都接5V电压时,27C256便进入到读操作模式下。由于网卡插槽上G总是低电平(接地),所以只需要E进入低电平即可。图11是27C256的读时序图:
图11 27C256读时序图
从读时序图中我们可以看到:在地址A0~A14有效tAVQV时间后、在E低电平tELQV时间后、在G低电平tGLQV时间后,输出脚Q0~Q7开始输出有效数据。
根据这个时序关系,我们写出写出了自己的读27C256程序(见附件R256.asm),这些读ROM并不是通过PCI的地址映射,而是直接通过ROM寄存器直接读写。需要注意的是:在我机器上扩展ROM的基地址为0EC00H,所以ROM的寄存器地址为0ECD4H,而读者在编译该程序之前,需要更新上自己机器上ROM寄存器的地址,千万不要忘了。
四. 27C256的写/编程操作
写操作的时序图如图12:
图12 27C256写/编程时序图
27C256的写操作最特别的一点是要在引脚1(VPP)上加上+12V的编程电压。而插槽中该引脚是对应在8139C的第69引线的,该引线是不会产生+12V电压的。所以我们必须手工给VPP加上+12V电压了。
我们知道,电脑的电压输出线中,黄色线输出电压就是12V,而红线为+5V。两条黑线为接地(如图13)。
图13 电源电压图
我们可以直接设计一个简单的连线,将电源上的+12V电压引向VPP引脚,于是我就设计了下面的电路(图14):
图14 27C256写电路图
根据上图连好线之后,再根据写时序图,便可以进行写了(源代码见附件W256.ASM)。有一点要注意:当一块EPROM经过紫外线擦除后,其内部所有的位都为“1”。写的过程只能是将需要改变的位从“1”变成“0”;而若想将“0”变成“1”,只能通过紫外线来擦除来实现。
五. 27128 EPROM的读写不同点
128K的EPROM读写由于其地址线比256K的少一条线,所以有稍许不同。图15是27128的插脚图。
图15 27128引脚图
将此引脚图和27C256的比较会发现:27128的P引脚在27C256上是A14引脚。而P脚专门来控制是否可以写(可编程):在读模式时,P脚是高电平;在写模式时,P脚是低电平。于是乎,8139C的ROM寄存器在读时需要第14位为1;在写时需要其为0。其实这也是我们第三章中用基址寄存器映射来访问ROM时,为什么说不能正确读128K EPROM的原因了。在读128K EPROM时,R256.ASM程序在偏移地址4000H后面的数据才是EPROM开始的数据呢。利用8139C读27128的源代码见附件R128.ASM,至于写27128的代码由读者自己完成吧。