找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 11412|回复: 2

Intel ICH9 Memory SPD读取

[复制链接]
发表于 2009-7-21 09:57:34 | 显示全部楼层 |阅读模式
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
# y; M1 U) B" {3 ^( [8 m
* A+ \3 `1 O, A) S  .model small
& `# {: g) A+ H: A# X; F3 G" E  .386' @- ~8 H. z) W9 {6 y$ \* p* o
  CFG_ADDR EQU 0CF8h
# I* ~, B- u  O& `1 Q* v  CFG_DATA EQU 0CFCh3 H- I3 g4 `6 p; ~/ O+ r
  SMBUS_BUS EQU 0
" d/ l: N9 n. F5 x  SMBUS_DEVICE EQU 31
3 I6 x! ^% j4 Z% c  SMBUS_FUNC EQU 3
: A) P" ]6 U, z+ z  
, u* w! P3 C+ K; U* L5 s  K* A5 Z$ f  .stack 100h
6 a4 |* _- c- B" R3 \# Q; P; j! N. `  .data0 V! ~9 V3 j1 j
base dw ?  ;smbus I/O space
2 Y# B* n+ S, K1 k  B- Onum  db 0  ;byte select
+ e# i5 N7 E  w1 p( zSmbStatus db ?
# \$ n  }/ }; I. K
3 u( b: {1 x: ?) B  .code
* J/ }; J/ g" v" x" T9 N ! w3 x8 M- ?8 D/ ?1 B1 S
LF_CR MACRO8 m3 T& f  i4 @/ j  \; [/ K
  pusha
! c( x$ S% c( g. d5 T) o) a' x: O  mov     dl,0dh      2 Y+ ?+ ~: [, J% m
mov     ah,2
* H! t3 S: B& _5 R  int     21h
" _, K8 m+ q! I% M  mov     dl,0ah   ;next line   
7 y/ ^. S$ ]* u2 I/ P6 V. C  mov     ah,2
3 b' o+ W; L: A# f" A' C/ ?  int     21h( j, {& G9 M$ y/ c# s5 O
  popa  
7 ]& |) R0 b# H# p+ g     ENDM
, i# p4 P! P/ `3 V) b
0 N1 ^8 F3 z. }" z; r
9 D% W0 u1 `- H) Smain proc far
/ T+ t; q5 T( B# V4 S' P mov ax,@data# c. M# G8 b: z0 i& {8 z! [3 w
mov ds,ax
1 W. n- @5 t( ^) h% F* Y- b# I , P! }8 Q8 W" f4 P6 ^# J
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h! h- h! X7 S9 b$ F. c" T6 M# H* r
mov dx,CFG_ADDR# s5 k. T: r1 K( i+ _8 x" f6 S% V
out dx,eax* y! ]1 }) w5 T; y3 O- E; v
mov dx,CFG_DATA
& W! C. t- j' [+ c/ V in eax,dx
8 |3 C. \' s% Y8 S- ^. t  ! N0 K$ [2 P- {
shr ax,5     ;bit 15-5,the base address; w% ^7 G5 o- r  o# X: |4 l
and ax,0000011111111111b
+ W$ g- C8 t6 R; |8 G5 C. b mov base,ax* t9 m' i3 W: j8 f4 x4 j5 L' i/ i
  
- Q* l% K+ a- r  H5 }6 e: e call ReadSpd8 Y6 O7 C5 H$ G" A  a* `# c
exit:
. r- Z' f: {5 P* ^ mov ax,4c00h5 M% x" z6 G- H- p8 C
int 21h! B7 G( D, F8 }0 {1 e! J9 W
main endp* o( {* j; w& F3 L- M7 Z6 v% r
+ ^6 Z% n3 H0 D

& T2 Q4 h& m3 b3 e, W" F. ?$ x- [+ e; G: T1 z1 k
ReadSpd proc
$ [. J- p$ }9 R# N3 f; n, I" j pusha
: D/ ~2 e/ D* [/ j5 q7 u3 uAgain:
% D& }8 v" [- ~& m mov ah,num
) h6 i0 Q# r8 A1 {  and ah,00001111b3 [! s- O3 j1 P5 C: X+ X
.if(ah==15d) ;CR_LF
" ~- E2 K; x' v6 o$ C* b5 H  LF_CR
9 v. b* A+ a; ]/ c* P# C( O0 ?  j .endif
1 V  V! J: [; x: `; n) T1 E5 u/ B3 M / P5 `6 k# K5 }/ v; Z/ a. R1 b- a
.repeat0 r9 q( R7 P* C" R6 j9 m1 ~6 L5 {
  mov dx,base   ;reset host,claim host in use
: Q, Z* i7 `7 a( ]* y% E/ g. g) q  add dx,0
- R2 y" u5 A2 u% `- V# K  mov al,40h1 `& P4 ^/ _4 U- Z# G! q
  out dx,al
* @2 {. ^" U2 }1 T2 P% k8 K  & ?2 \/ J5 R; Z# K* L% M
  mov dx,base   1 [1 ^  l) I0 a  q) `) \* u. V! y
  in al,dx/ e" j5 I, @# Y7 `. M- q9 n+ V
  mov SmbStatus,al
; g/ i" n( x* Z' N% ], G  2 Y' I0 H' N9 k) ~5 T9 O9 G
  mov dx,base   ;clear all status bits4 f4 W; ]3 \4 o& S" I) i3 f
  mov al,1Eh   ;host status register
7 s  N$ e1 m% `3 O1 _  out dx,al
( k' z+ s  U! Z8 p" |$ l  / R, m2 b* x! B1 e1 y/ [* ~
  mov dx,base   ;set offset to read
) p5 l8 ?9 z1 I5 e7 Y, I# ?  add dx,3    ;host command register
/ T( Z+ P% \5 H/ L0 ?  mov al,num" ~9 g, v2 g( a: B0 r
  out dx,al
8 [* z$ |  Y* h) B7 D! N* Q) |  
: @. _# A0 |% h( ?  mov dx,base   ;Transimit Slave Address register
1 O6 O  ^+ u" a5 c( S" r1 z) h  add dx,4! t5 c4 s' j, ?. X8 x
  mov al,0a1h
& t' [8 [% @% v* h  out dx,al2 p: b' B6 y) N
  
- L+ C" u! H1 j) s) }; M  mov dx,base   ;set "Read Word" protocol and start bit
$ J1 J8 {2 B( Z7 ^; Z/ o) n  add dx,2    ;Host Control register
# m$ m2 _! ~0 w( l; |  mov al,48h  ; n7 A& S0 O0 }; q
  out dx,al0 L  ]& F, u) ~
$ b+ I4 x4 s  ~1 c; j

1 I3 a: @/ s! |# n% u3 e  ; {  _6 B& l& W8 o2 r, D
  mov dx,base
. b( k7 `9 {# v% v% R! [! J  in al,dx
* D5 A9 l- x3 z  mov SmbStatus,al1 H0 u' G# k6 |# U* k+ q0 d
  and al,1Eh- g6 h$ a7 E6 s( s
  .while (al==0) ;check repeatly until any of
1 F" r( ?3 s* l* s) H' ^    mov dx,base      ;FAIL,BERR,DERR,INTR
" Q- s, Q9 W6 }0 l: k    in al,dx, T6 w& [0 l+ X& Z& R
    mov SmbStatus,al
( E( X( B; G+ I2 |& \    and al,1Eh
' ]6 i+ D( k* ?0 m# q  .ENDW
- G, z2 e& y8 c3 k% t  
% l- w) F. b9 N: i$ c* w  mov al,SmbStatus   
9 J, ]0 Y) w) u8 o! @1 w$ m  and al,1Ch
2 Y; v0 M6 j& o: v/ x' Y; H  .if (al!=0)    ;check for errors  7 O+ ~0 Y/ M0 F' D& Y
   mov al,SmbStatus
% |3 j1 M7 Q( @6 A0 I/ c   and al,08h   / y! N% X: v$ Y8 G2 x' b
   .continue .if (al!=0)  4 Y4 z8 x; H) b* K9 ]" z3 G
   jmp @F    \; ~* @6 ~, [9 k0 i& o: |
.else9 k5 m6 G$ {% _/ e/ B
  mov dx,base
$ D+ o* n: Z: \; P4 Q. N; w  g  add dx,5h
$ R$ ~$ |/ Z) `  in al,dx  
0 k3 n) I& S0 l. P: t: }" ^$ C  call binhex ( E6 E) a) T; ^! P0 s: ~
  .break
8 F. }; i4 a- l .endif8 Y% r  R. q& N: }* \6 H4 k
  ) b( h0 X6 J8 g/ G
  .until (0) " B. p: G, K0 _# W  d' e6 y! j" i
  ) j$ Z, K6 a# H1 z& b+ [
. P' Z  f% U1 D
' g4 \  ]9 t6 U& y
mov dl,20h ;output a space0 x  a2 W7 C  z! D
mov ah,2
" U8 f4 t  e* R pusha" J2 V2 w& W, @* r# D+ x1 A. n4 s
int 21h
- k0 \4 h6 S: O7 P popa
  h2 Z) ^4 S5 s4 o1 W  j inc num
: G! b+ U* d: w" a) f0 e9 V7 B- K; ]8 F" u. U% Z
cmp num,80h ;get first spd 128 bytes 4 T( S" x! t& l+ D
jnz Again
. m+ O  w% S3 f
/ n6 F3 I6 r! ^& R/ `8 Y2 T@@:5 }7 j( n8 T/ e0 I: b" y
popa
, s" P, w0 H8 P  V4 T' f( ^3 r ret, l: z, q- n% z' M" |9 h
ReadSpd endp# A4 f6 @- l; l" o+ c5 P+ q
5 f' g5 b& t" c+ Z1 I9 l4 l. B

) l! r9 a5 e7 R% d$ v. ~1 t. R* f' B6 O) y
binhex proc
! o  o: z; [  G& \0 X7 c1 H) @ pusha ! N$ `: v9 }1 e( l7 A% k

5 w+ c% {: T) v$ v0 a: H0 U- s mov ch,2 ;2 hexadecimal digits to be printed1 X0 ~* v% }( A& s0 y
loop3:' @7 z6 r: h$ o  A' H( c
mov cl,4 ;bits to be shifted0 X( X/ [) \; L# T, h0 K
rol al,cl
. F4 v& v, z/ ]8 h. L; {4 d2 } mov bl,al
+ m  E4 j; r0 K: g! D' e9 ~8 E4 q and bl,0fh ;mask the 4-bit Msb
4 z2 W8 _5 Z$ g7 l: Q! I, q add bl,30h3 G0 y1 |1 i2 w4 c# G, o; t+ h
cmp bl,3ah
  Q5 C# c, Z9 s1 Q, ? jl next1  ;number or alpha?
, }* D+ R6 u& h# O6 g3 e% ? add bl,7
' B+ a( w/ k9 gnext1:   Y8 G2 @' t* R9 Q5 ?
mov ah,2  ;print one hexadecimal digit
3 |* x6 i9 Q, a mov dl,bl
9 V+ K$ a/ y; j/ w$ `- S pusha
8 X8 `  i: H" n3 P  c# M int 21h7 B4 K) a& I2 k& m
popa# p- Z; d: x" G! D9 r! N
dec ch  @, b. F: O, w5 V4 o& b
jnz loop3  y0 ]& [. {& D, g0 ^9 m+ j
popa& W2 a- B  x2 G1 L
ret2 i* l/ y/ H0 `2 b
binhex endp: K/ ^1 h" e( W, K  R0 a
   end main
 楼主| 发表于 2009-7-21 12:30:37 | 显示全部楼层
问题已解决
回复

使用道具 举报

发表于 2009-7-21 13:40:23 | 显示全部楼层
我做过一个可以支持SIS968/962/961 VIA8235 Intel ICHx/ICH7/8/9 ATI SB400/600 NV CK804的SPD tool.  ICH9的读法应该是和ICH7/8一致的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2026-10-12 08:06 , Processed in 0.052165 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表