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

Intel ICH9 Memory SPD读取

[复制链接]
发表于 2009-7-21 09:57:34 | 显示全部楼层 |阅读模式
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
9 x+ G: h  O9 s7 A* m8 _& z$ b) }6 d3 [, u3 ^  b
  .model small/ [8 {( s5 u1 k% m" g. g3 Q
  .386) [! D# R9 B8 j% v
  CFG_ADDR EQU 0CF8h
  @- V2 m/ W6 o) n: d  d/ ^' l8 O) I. D  CFG_DATA EQU 0CFCh) J/ q; O2 ?2 G  `0 X. p
  SMBUS_BUS EQU 0
% l2 V2 ]0 P1 w* |, L4 `+ t( L  SMBUS_DEVICE EQU 31, N7 d/ U- ]$ v8 D- L2 E
  SMBUS_FUNC EQU 3
$ R% `, n! T" K% c1 `; R! @$ _  1 t! p& {( c) v1 ~. f$ X6 M
  .stack 100h
* U, a: x8 ?( a  \" p( Z  .data
' F/ p0 [" w, o, F6 Ybase dw ?  ;smbus I/O space
( o) D& S! u. _, m! }num  db 0  ;byte select3 p4 H' ?$ N, b2 E
SmbStatus db ?; o7 e9 x0 t; o5 M+ ~2 @( Q% m/ L4 L
: V6 [+ s( L0 ^1 N/ I. z
  .code
6 u  j* Z8 j3 L- T
9 H8 E6 e8 ]. CLF_CR MACRO
3 V' f! C1 B" a- N8 F: w) i1 u  pusha
4 C: `) M4 }# c4 Z% i+ h/ ^( z. X  mov     dl,0dh      
- P! i, O3 [1 X mov     ah,27 A+ A& y' W) n3 _
  int     21h
0 [9 n5 C$ D- }( d, w! [; E4 A  mov     dl,0ah   ;next line   ! r1 e% ~! u" P! d" d+ R8 \
  mov     ah,2
9 C6 l3 ]/ \  `* N5 {) A" c8 e/ z  int     21h! i: v! S5 f5 W; d# a" i  t5 @
  popa  7 z2 O3 j  u: u" _
     ENDM; j) z/ i6 x% S4 ?' |! b
( y2 U3 v" c, U4 c# t4 \1 P/ Z
5 ^6 i( K( I% L/ c; `4 Y: J
main proc far
! Q8 W! n% K/ l mov ax,@data$ R. p' v) W6 U/ A* d
mov ds,ax
: i7 Y! O1 p+ R, n% G) e/ K( k$ [0 O " B! p" N$ R# k% j
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
/ T. k5 e) d( z5 a, t7 D" h; m mov dx,CFG_ADDR6 c0 D. O& [% p( A6 K1 h$ ?* h
out dx,eax6 a5 _2 \) T  W( U& N" u  t( W
mov dx,CFG_DATA) x, f2 s4 ?) O% Y2 T. j# z; H4 p
in eax,dx
& o6 U9 b" K" t) o2 E  W  2 Q) P6 L/ E: o2 m0 c2 ]5 j- k
shr ax,5     ;bit 15-5,the base address+ N# p3 n8 u- R
and ax,0000011111111111b( h8 `- _1 i+ ~& z; N: t) o. h
mov base,ax
6 s2 [: I8 B# K( K  
* A8 x( O' A- q! c! M+ n- z' `3 r call ReadSpd
4 u5 d; o4 ?+ {5 I& e, |/ dexit:
4 J7 }! {4 z7 K3 Y( f$ y* _ mov ax,4c00h1 l( H, s# t8 m% ]8 T
int 21h9 X5 \" o4 T+ s* s- c, k( Y3 _8 r
main endp
) F! f1 V' d- o! v% |; v1 u$ ?
* A% `) v4 Z# J. r  f1 O7 q+ m3 D: R
# `$ J8 s- _. M' W
5 v7 g0 W7 q1 ?$ ]( ]# X9 y) g& vReadSpd proc9 m# `1 G& G; P' V4 i3 I! O2 J
pusha
$ ^! e( ]! v( F( ?. PAgain:
2 F, W- N. I* A: J0 n+ ? mov ah,num
6 V9 n/ Q- ~- j  and ah,00001111b
( n4 s" U! J/ i; Q, H! z! e# q .if(ah==15d) ;CR_LF
, n, J" C' y% p3 \0 g. g5 t  LF_CR1 ^# I# |$ A8 w% u4 M: `$ X/ j2 a8 }
.endif+ i2 M) [: t, C" o
5 ~3 g. y% Z% W+ x0 V# o1 P+ U3 p
.repeat# ]. A/ ~/ a3 S- I, e
  mov dx,base   ;reset host,claim host in use
$ P  R+ @0 k3 R+ e8 P3 N: N# \  add dx,0( S5 K$ D5 Q  u0 a, p) g+ A/ @
  mov al,40h1 s4 R+ l& p0 }- r' V' q+ o5 B
  out dx,al% \/ W9 V# g/ e( O; K/ G
  1 C9 H: k( ^8 @3 E
  mov dx,base   
2 M% Y2 l3 L+ P7 N9 [+ f+ `  in al,dx3 w* ~; z6 i6 F" Z
  mov SmbStatus,al
3 h( P" r! O# [  
) y. e. I) e* }/ J& k' A/ B4 X8 Y  mov dx,base   ;clear all status bits
6 ~. c' f+ k( g  mov al,1Eh   ;host status register' o$ d* ^2 n) m/ T; k9 A9 j: V
  out dx,al2 E9 A% c7 N) c3 G
  ! n$ e# D1 L( g* n4 _
  mov dx,base   ;set offset to read
% n' o- }1 T+ u0 k5 B' p# q3 Y& L  add dx,3    ;host command register4 R/ h; ^( B) d8 ^, @$ }+ E
  mov al,num
2 G3 L. G/ j! f% A7 @! z7 Z7 v; P  out dx,al3 o6 f7 e  L, Y5 k: ^# h0 m
  4 b1 @# [. M/ w9 E2 V4 I9 A: T
  mov dx,base   ;Transimit Slave Address register9 `6 C, R: U. @3 F
  add dx,4
6 Q  H4 b  w, a3 V+ ^  mov al,0a1h
# n+ @7 T& r! W5 q  out dx,al
/ r4 a8 `) _- X4 ~8 L  7 @( V. x( U# S" V
  mov dx,base   ;set "Read Word" protocol and start bit" h! x, r  U: V8 A# E# `1 c& q  @( X# B/ I
  add dx,2    ;Host Control register& G" p( o  D" Y. w, e
  mov al,48h  3 q5 k; M! a, [: l2 T! w+ H
  out dx,al. c" E- U& k5 M

! i6 f) |0 f8 Q( w  x9 Z+ Z9 C1 W# k$ Q
  4 }) P$ Z  Q6 Z7 p2 j6 ]7 Q
  mov dx,base
" t+ f" |9 b6 R- i/ q. {  in al,dx
! h6 X: I: {5 V$ h5 t# J6 N  mov SmbStatus,al6 O8 }# p0 W4 o& Z
  and al,1Eh
' z3 x, ^! j  k, q& ~/ G6 q  .while (al==0) ;check repeatly until any of6 {$ v  w3 H& m4 ?
    mov dx,base      ;FAIL,BERR,DERR,INTR% f. Z% Y: f6 y- {
    in al,dx# k' L6 h, L$ P6 p1 ?  M
    mov SmbStatus,al2 t; `' y# }! R4 W' w2 z
    and al,1Eh ! \5 \8 g4 W- P8 O4 \8 f# p
  .ENDW
8 p; w$ C/ n% i! `: v9 x3 `/ f7 @  ) u9 a* Q+ X6 }  t2 R2 E  y
  mov al,SmbStatus   , n4 K0 h) H& Z# d
  and al,1Ch
' x0 J# Y5 |5 D0 U5 `5 i& C# i  .if (al!=0)    ;check for errors  
1 b3 \9 `! R6 g- B. x% d* w   mov al,SmbStatus5 H. |2 d2 b; Q) R/ m2 `4 {, s
   and al,08h   ! g# w/ t$ u) Q! ^6 j4 t: x7 q
   .continue .if (al!=0)  1 @8 v' u) m, W1 x+ t
   jmp @F  
1 w' f! L: F7 n! |: d .else
* m) E* h0 N5 ]; Y* |2 b( @0 T( G2 o  mov dx,base
3 o6 |3 u9 G) S/ H  N% \  z: M  add dx,5h( ^5 P4 b2 `- Y: I6 L
  in al,dx  % c$ o. h3 v6 X6 z3 a
  call binhex + a: `& z1 L2 c, Y
  .break
. Y& j  A) O* j' h7 i2 { .endif
7 l' D; @$ P: ^# @1 j6 K( \* p* s  * e! W) O+ E0 L* q) E
  .until (0)
( e0 |8 ?* w+ e8 K7 T# |5 ~  
! u( W7 [7 ]% e; |# k 4 b# I9 r' e$ o

9 K% V# G# F: p( ~ mov dl,20h ;output a space; v: ^; k1 m' g& @$ P4 A
mov ah,26 [5 R# p9 ?8 x; N8 w. M
pusha
5 Q" F- e9 T* H- L1 j7 | int 21h
5 z4 v4 C. I9 v7 z) \) m popa
" a; q" s/ Y6 q inc num' K$ d. |& t# A

: W% c+ f+ Y& a/ l3 D cmp num,80h ;get first spd 128 bytes 5 [% r. q; ~/ z% s1 z# _. }
jnz Again
7 Z/ e9 E8 U; e  P/ | 3 F+ T5 ^6 U6 U; x3 n
@@:
* Z5 m" C: `9 ]' w5 M- i5 [2 l popa
# O! D7 y# J* r* D ret
9 M$ V8 T  ]2 V1 h) lReadSpd endp' ~- `, b1 b" o) C( F2 c

5 l9 }. L2 Q9 R( f( m+ _% o
2 H$ S; V8 s: P2 p) n( R; I& b- Z3 C4 d, |- ^! I0 A5 f" w2 |
binhex proc * Z& V" @' `1 p4 O% V7 X
pusha - T5 ^! p8 ?, ]. C- q
% ?# A7 I  B; C& a' a6 e3 L  i
mov ch,2 ;2 hexadecimal digits to be printed0 d  ^0 \* v8 c! U0 u
loop3:/ u+ I* Z9 [) b/ L5 D
mov cl,4 ;bits to be shifted
8 E0 C" S0 V  C rol al,cl
8 _1 C1 r& ]7 @" i+ U8 Q mov bl,al
8 M3 w, A! z" u and bl,0fh ;mask the 4-bit Msb
/ e3 q5 u6 }$ [2 ^* Z& ]5 i" x- ] add bl,30h
% V7 p1 |! b1 {4 ?( Z* u3 q4 c$ ?- m cmp bl,3ah
% r' ?/ {" J9 c8 q( g+ U jl next1  ;number or alpha?
9 q' n5 M$ l# U: j% p2 } add bl,7
9 W8 N# `9 Z" |next1: 3 g& H. P8 \! [4 \% s, I- ^
mov ah,2  ;print one hexadecimal digit
" q  h8 ?5 E: N, i mov dl,bl5 Z: q4 a' M9 j0 x
pusha
* {# ]! b# g* Z" J# A int 21h
/ o& m* g7 g. e; Q  Y popa1 ]: @% W! y& g& M
dec ch
9 S6 _: t9 y  {6 v& I0 p+ S jnz loop3
7 d  y9 T% T; t+ h8 Q popa& I. P; c, S6 ~! W; ?
ret0 i" M4 G" Y; ^, f7 j) ^
binhex endp
0 w  w2 J  C1 O& ~* Z! U   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-5-16 07:34 , Processed in 0.062724 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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