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

Intel ICH9 Memory SPD读取

[复制链接]
发表于 2009-7-21 09:57:34 | 显示全部楼层 |阅读模式
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
( X. P5 F- c9 ^* |  I9 m* i* V& ~! Y4 b1 |2 E! X
  .model small
( B. n  Q+ m* ~) G# b  .386
# x/ ?& M: k+ c0 X3 ?0 v" D  CFG_ADDR EQU 0CF8h' B5 r  G# u2 e- q& A6 z, p1 M3 p
  CFG_DATA EQU 0CFCh: v3 h4 P( j) a; b% `& |/ n
  SMBUS_BUS EQU 0
2 D+ R/ b1 f2 g  SMBUS_DEVICE EQU 31
, d3 N# X5 p1 `4 t6 v$ z  SMBUS_FUNC EQU 37 M- f" E) q6 y9 U0 ^" s
  
( B" F, r. t( G- M. K  .stack 100h
6 Z* g# y/ a( N' s  .data( |6 j% K% \! P( T" O1 j  s$ t
base dw ?  ;smbus I/O space, \7 W0 ^- @- X: P5 Q2 ^/ N5 }. g
num  db 0  ;byte select( A& Q( R$ R# F9 C% f. o8 U( l
SmbStatus db ?9 ~' W8 l# w" O
. A' [9 N& D$ K2 F/ q* F$ ^+ r
  .code
4 A4 `4 K2 V  f/ E * y' ^+ n( ?' L  {. o& |, c& K
LF_CR MACRO
$ B$ U) m/ z0 N  pusha9 f* u1 G) E) h: ^8 A
  mov     dl,0dh      
" j- h: {" n# ^, q mov     ah,2
( ]8 m3 M0 {* V+ m7 r  int     21h
: ~, S) J- G4 R: t$ D8 T  mov     dl,0ah   ;next line   
4 _4 H/ x6 l" R* y3 b5 X  N6 u  mov     ah,2
. h- i2 `7 r) G8 Y( f7 y  int     21h
, ?8 H* F4 |$ n  [  popa  . b. B1 p9 F% m2 n- z- d& Z- ^* m
     ENDM
/ o! G2 {1 h2 n& Y$ A( d% A8 X7 G3 T) W0 j* ^2 [: ^

; z& l" h' P7 b- qmain proc far
) [  C2 E1 v# E2 S1 L% l$ f mov ax,@data
4 \$ S% M' b# A( J0 W2 ?% c6 d  e8 @ mov ds,ax$ b" a0 O, m! B
, R& q: b4 j0 _7 l
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
- N# s6 n: j5 h8 J; q. V4 V mov dx,CFG_ADDR* [2 A5 e5 l0 x0 R
out dx,eax' h. i# r  |4 S! P% ^* [
mov dx,CFG_DATA$ m1 j. F6 a$ l2 @  j" t8 @
in eax,dx: \+ j2 R% Z2 K! Q3 h
  5 @! d- f" J9 n" U; e1 n3 D
shr ax,5     ;bit 15-5,the base address
' D/ @3 m3 s1 ^+ A/ Z' i" }! j! b and ax,0000011111111111b
8 d" w8 k$ {3 s/ c4 @ mov base,ax
% q# m/ H2 O& x) P; U0 y0 J4 B: l  
1 E' ]! Q, {5 K7 v* h call ReadSpd
( W/ }- t( e( N  {/ X0 J0 n4 @4 yexit:- ~$ ]# P. q6 ^( r6 b0 E9 T2 i  x
mov ax,4c00h, w* [; e6 ]0 X, F8 Z" R
int 21h
# \) a- b8 E' l7 dmain endp' j, M- `! H- a% _( `" U2 w
: i2 W: {3 w: d0 O

' |; u" W) w' g+ q, t' m! s( k- u6 Y7 \' B7 p1 Z+ b  e9 w
ReadSpd proc# n; c" }2 L8 g
pusha
5 J% x- S9 z. e- N$ ?) {Again:. i. k( D/ d- O, ^4 S# i5 C
mov ah,num0 K* I4 N4 P, `
  and ah,00001111b
; L3 T6 x/ }2 r- _3 V' `1 Q .if(ah==15d) ;CR_LF: D& M* U" o# J: Y
  LF_CR
7 s7 N5 x. X& x7 Z .endif
: r' M- r/ I2 Z. G$ Z( k1 D# T. b 1 W* x/ U# f5 f5 a0 Z
.repeat
3 a' O* S- Y) Q4 ~9 P5 C$ _  mov dx,base   ;reset host,claim host in use
/ R  e. ^6 r) u& {: [  add dx,09 }& c( @, c2 ?5 v3 ^4 N8 @$ H
  mov al,40h/ A) D% \) B( o7 [! O9 `
  out dx,al9 D" W- W* }( ?3 S' v
  
; u; x5 W6 T# V# ?1 b: t# E  mov dx,base   
' Y3 I$ p1 B6 z- i! J9 n  in al,dx
3 w4 h4 R8 i- O" Q$ x) M0 a6 w  mov SmbStatus,al5 B' F/ \0 A" u" r* Z1 ^
  
9 ~+ f6 W& J, @9 U0 f7 q6 u2 i  mov dx,base   ;clear all status bits2 y  M- U4 U# l9 K' h7 }7 @
  mov al,1Eh   ;host status register" s8 x* \* a2 B: Z& O; y% b
  out dx,al2 ]7 P" C0 N" O% Q7 e% K7 O' L
  + x: L: m: S) q9 @, Z7 Q
  mov dx,base   ;set offset to read 1 U- @, T  w" P, k( @5 t
  add dx,3    ;host command register' Z9 |  k! r) L6 ~$ h
  mov al,num
9 p1 Y3 U4 t7 Y3 h1 \7 G  out dx,al* c( L9 V: s' I) O4 \! j
  ) O. F' r5 k# F0 O0 L. ?, @+ `: v
  mov dx,base   ;Transimit Slave Address register
# B/ d; S/ y7 U/ |: _  p) N# C  add dx,4- m3 p* N. F0 u4 T% C" n  T' r
  mov al,0a1h
& Q4 P: Y0 c/ B& N) p  out dx,al- ?5 L& `4 V/ N. O: l" u9 E2 L
  
; c2 P, O' O1 M- ~  mov dx,base   ;set "Read Word" protocol and start bit
$ B  P& r( O% e0 ]6 O8 x7 S  add dx,2    ;Host Control register
) ?5 Y/ H4 x9 N" v, s  mov al,48h  7 i* u. _- t9 c- i  x$ E5 w
  out dx,al. ^, T! b4 U* y- E  D0 @' W4 x
  r) f( _, Q3 b! D8 f# |5 ]* q. D( ~

  t0 A' V/ f& V; f8 e  % Y* H4 t  p" X/ D* |
  mov dx,base
& S5 o9 z3 S7 s& B; v4 S  in al,dx2 I6 B- G  D1 `( R& E
  mov SmbStatus,al/ `$ }+ b! B' C" U  W
  and al,1Eh4 o1 }+ a' Y" J& K
  .while (al==0) ;check repeatly until any of8 p( P! y& d; N" [* J, ~
    mov dx,base      ;FAIL,BERR,DERR,INTR9 l6 [2 e4 [* _( A% q
    in al,dx
8 a- r/ l& b- ^* D% @  }) x    mov SmbStatus,al
/ D( N( ~4 G! D3 U    and al,1Eh * @/ I2 I, g( O# B" r  b) S/ F$ c* X# ^
  .ENDW
( H2 o# p+ ?. g" U- q( X" i  
% o* l8 S) J& ?( g: H! D0 P  mov al,SmbStatus   . [& ~0 i3 d( m
  and al,1Ch
! W1 c6 @8 j, N9 O  .if (al!=0)    ;check for errors  4 V+ p* D* K) {
   mov al,SmbStatus+ B7 o5 r. G1 s) t
   and al,08h   
! s+ ?  y) s! P4 _6 B   .continue .if (al!=0)  # a4 }# G4 z5 q; c& K
   jmp @F  
& M* ~2 o& d% {: b& r$ M .else
/ B- T) t& X& M2 K5 H( j/ Q  mov dx,base7 t9 |2 P3 D7 t* R% b) }2 v
  add dx,5h8 S8 S6 {8 I! j: A2 R1 O" L
  in al,dx  - H8 ?; Q1 h4 x
  call binhex ( S1 r7 j; j4 I' [; v0 Q( }; n6 Z
  .break
6 x6 O+ @+ `2 y3 p9 v3 ]/ r8 a .endif  D8 A* h9 g! L. }' i
  $ f3 M6 u  @" T; k
  .until (0) 7 u# |2 g3 E4 J0 }8 w
  3 c3 K7 k8 T3 l# Z

+ |) W" ~1 ^* H$ M4 L* n" V 7 z9 y+ O; }% D( T( k
mov dl,20h ;output a space
+ R8 J" c& G9 B4 h1 `* l/ r mov ah,25 g% n4 o" v6 a4 M6 `
pusha1 q# i) M0 g& D  }
int 21h! w6 K5 U# g7 m% e" W
popa! [, c2 B, B2 F- u
inc num
- l- t, S: _3 ]9 u( k. c4 g0 I# `" ]3 X$ f" x. m. Z. z) P
cmp num,80h ;get first spd 128 bytes 0 Z+ h" j- f7 W2 J8 p0 B0 O. g4 d
jnz Again' F2 ^) G$ w0 e

, D. ^1 E# `9 S5 d: j* A2 M& ]) Q@@:8 ]0 O$ B8 q: f  K0 L# U; F; @
popa
" Y7 w; ?% p$ ^  }/ G' z* p: f ret
7 q7 b3 n% D4 W; T2 J' P/ @ReadSpd endp
# H2 z6 f" @6 l8 q9 h! b
$ D, Y* W. _1 a. p8 H% Z; ^
/ u5 @- o: P/ F: s% W1 c
) }2 P! [; C6 \" w) h  L* L9 pbinhex proc / z$ t3 S, P! |) `1 {6 i2 k
pusha
( m( W- x* I3 c6 b8 Z: S. p% ` $ C  |0 p8 R  z- c# o
mov ch,2 ;2 hexadecimal digits to be printed
0 ^4 A% ?& K. H  x; I/ E8 {loop3:
  Q) l' V1 o; o2 D% k$ F mov cl,4 ;bits to be shifted
5 a, G7 G3 @- F rol al,cl' X* P' Q, c) V( Y- x" A& E. ~
mov bl,al
3 ?- s, n* l; T. t4 l and bl,0fh ;mask the 4-bit Msb6 W# `9 y0 {1 T8 p0 H
add bl,30h
# b& h" P6 f* a& N9 M/ N# v' z cmp bl,3ah6 ?# P0 o: y7 l/ l0 L" f
jl next1  ;number or alpha?
$ U( ~- V% Z1 C/ U+ z add bl,7 $ I- V+ W5 m7 j7 Q, Z
next1:
% M) f' M* c  M. k mov ah,2  ;print one hexadecimal digit
' a% }. A0 J/ P0 w4 C mov dl,bl
# U: Y& w5 v: p1 y& o pusha
: U% d* o$ t0 j$ [ int 21h. K/ @: b' n' p* i
popa
/ i' d4 I1 ]- S( M% C- c% `* O dec ch8 U9 l4 R, G+ O
jnz loop37 d( I2 G; d+ Z. r8 p
popa+ O" S) w# r& l: t- ~! V/ L& w
ret
4 Y  `5 `/ Y+ p  Dbinhex endp
, k8 k, {" `7 a7 r   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-6-29 04:07 , Processed in 0.331566 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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