ようやくやる気になってきたので試してみた。アドレスは0x50から0x57だ。LM75と似たような感じで、バイトアクセスするとよい。それが本当のやり方かどうかはわからないが。つまり、
0x5004にデバイスの番号を2倍+1を書く。(例えば0xa1)
0x5003に読みたいSPDレジスタの番号を書く。
0x5002に0x48を書く。
0x5005にデータが出てくる。
実のところ0x5002に書くアクセス方法を何にするべきなのかがよくわかっていない。というか、それぞれのアクセス方法の違いがわかっていない(PIIX4の仕様書にも詳しくは出ていない)。まあこれで読めるのでいいだろう。
これを128バイト分、手で入れるのはさすがにつらいのでプログラムを作ってみた。コンソールアプリで、実行するとSPDデータ128バイトを8つ読み取る。エラーになった場合は飛ばしている。たぶん出てくるのは実装メモリのスロット数分だけで、他はエラーになると思われる。Windows95のDOS窓だけで動作確認している。読むだけなので、システムへの影響はほとんどない。
SPDREAD.EXE
やはり、再配布は禁止しておく。
DVA = 50 0000 : 80 08 04 0C 09 02 40 00 01 A0 80 00 80 08 00 01 0010 : 0F 04 06 01 01 00 06 F0 90 00 00 1E 14 1E 3C 10 0020 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0030 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 CB 0040 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0050 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0060 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0070 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 66 06
使えそうなデータは
0x02 Fundamental memory type (FPM, EDO, SDRAM..)
0x0B DIMM Configuration type (non-parity, ECC)
0x11 # of Banks on Each SDRAM Device
0x12 CAS# Latencies Supported
0x09 SDRAM Cycle time , CL=X (highest CAS latency)
0x0A SDRAM Access from Clock (highest CAS latency)
0x17 Min SDRAM Cycle time at CL X-1 (2nd highest CAS latency)
0x18 SDRAM Access from Clock at CL X-1 (2nd highest CAS latency)
0x19 Min SDRAM Cycle time at CL X-2 (3rd highest CAS latency)
0x1A Max SDRAM Access from Clock at CL X-2 (3nd highest CAS latency)
0x13 CS# Latency
0x14 Write Latency
0x1B Min Row Precharge Time (Trp)
0x1C Min Row Active to Row Active (Trrd)
0x1D Min RAS to CAS Delay (Trcd)
0x24-0x29 Access Time from Clock for CAS# Latency 1 through 7
0x7E Intel specification frequency
0x7F Intel Specification CAS# Latency support
辺りか。
詳しくはSPDの仕様書P.11からとか、440BXの仕様書のP.106あたりを見て欲しい。
これはSPD(というROM)にそう書かれているというだけで、実際のメモリの仕様を必ずしも示しているわけではないし、今のBIOSの設定などには全く関係していないことに注意。まあBIOSもこれだけを頼りにメモリ設定しているわけではないので、そんなに気にするようなものではないのかもしれない。
おっと、プログラムソースは次の通り。ああ、とっても簡単。
#include <conio.h> #include <stdio.h> #define SMBAdd 0x5000 void dump( char *, int); void main() { char data[ 256]; int Regadd; int tmp; int dva; for( dva=0x50; dva<0x58; dva++) { for( Regadd=0; Regadd < 128; Regadd++) { _outp( SMBAdd, 0x01); _outp( SMBAdd, 0x01); _outp( SMBAdd, 0x02); _outp( SMBAdd, 0x02); _outp( SMBAdd, 0x04); _outp( SMBAdd, 0x04); _outp( SMBAdd+4, ( dva<<1) + 1); _outp( SMBAdd+3, Regadd); _outp( SMBAdd+2, 0x48); while( 1) { tmp = _inp( SMBAdd); if( tmp & 0x06) break; } if( tmp == 0x04) goto next; data[ Regadd] = _inp( SMBAdd+5); } printf("DVA = %02X\n", dva); dump( data, 128); next:; } } void dump( char *memadd, int size) { int i,j; for( i=0; i<(size/16); i++) { printf("%04X : ", i*16); for( j=0; j<16; j++) { printf("%02X ", memadd[ i*16+j] & 0x00FF); } printf("\n"); } }
http://www10.plala.or.jp/p205tb16/spd.html
坂井瑞穂