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

Intel ICH9 Memory SPD读取

[复制链接]
发表于 2009-7-21 09:57:34 | 显示全部楼层 |阅读模式
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: * Q6 k$ m+ j+ P2 \! r

- `' \# z2 G" v3 M0 R( F" z; ]  .model small
  ?, d# u/ x- ^, q" d  .386
2 p5 H6 v4 i2 [- Q. D  CFG_ADDR EQU 0CF8h1 e2 I( ]1 q% N7 p
  CFG_DATA EQU 0CFCh0 j+ U% k) t: G2 i
  SMBUS_BUS EQU 0+ e" L$ d. y1 E2 [" H/ h/ R, K
  SMBUS_DEVICE EQU 31
" I* N8 E2 y( p6 {. Y6 I8 U  SMBUS_FUNC EQU 3! d& `7 T3 H( [1 I! K
  
  f$ e: B* l% {% |* g5 \  U  .stack 100h3 C+ s" h4 ~' P& L$ K, h
  .data  H2 n8 j' c* N# _
base dw ?  ;smbus I/O space
8 i4 x) M( {1 B8 Q& gnum  db 0  ;byte select
5 G% Y/ Z: ?4 r# Y. K/ g# c, ySmbStatus db ?
1 l, _8 D: V+ c* X8 b6 U
" m2 X8 V! p( E$ t, A' J3 z; V9 D' m+ j  .code
9 b% U$ S" l2 C: c1 z/ e, w 4 ~- U( ^2 B' x* Z7 Z
LF_CR MACRO; T$ S! ?, ]+ Q: j; O2 Y( _$ U
  pusha
( F) u" {% M9 v$ R  mov     dl,0dh      
$ ^/ W( w+ J4 U: M. l! H3 q/ p6 I mov     ah,26 ^- r2 x1 A7 F
  int     21h& T$ S! F. J1 K
  mov     dl,0ah   ;next line   3 s8 @" k4 U7 B$ z" q
  mov     ah,2) z1 r% ^' P  ]
  int     21h/ V+ f2 Q' M( K7 {9 j8 S5 F  I
  popa  
1 H' x- u) }1 y" A     ENDM" _/ b5 n! b4 B+ w: _

( E* s) d8 m0 L  r, Q) L8 T: P) C- n" F
main proc far
/ b1 V" N9 J8 p( r, k* B mov ax,@data
4 E5 f# \. n* E# |9 @3 n5 L( t8 y- g mov ds,ax
4 ]: G, y7 b% j* y  o# t2 h6 [  H+ j . H( M) M; g  a! K1 l( W
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
( x$ m% {6 a$ G0 D$ \9 } mov dx,CFG_ADDR& Y9 a1 ^; K1 ]9 }: W( `
out dx,eax2 [8 K& T" `' [/ J( E$ d
mov dx,CFG_DATA' H& L5 o" P) h
in eax,dx
5 ]1 B$ j% c( i' G8 r  w. \  
0 h7 Q+ G/ D  _/ C$ J" q& g' i shr ax,5     ;bit 15-5,the base address
# E, h3 [* Q, l and ax,0000011111111111b2 l# {8 m) q1 a3 r, y
mov base,ax
8 w9 ?2 B* ~1 f, n  
) ^; V# i. M) q! {1 i call ReadSpd% o1 g" k, p* v- S3 k  ?$ G9 j
exit:  W2 V5 b5 D0 L( o- D! b
mov ax,4c00h
: r' L. g" b2 e( S; }  ?3 [0 D int 21h
* S8 ^- Y& M1 h3 f# U+ u1 Tmain endp
- J: s- W* l/ \- C. L( v2 w; }4 Q5 a* i- Y. s

6 V' L" k0 p, I' O
3 v; t% U- Z+ |- PReadSpd proc
) i( y1 U% A. q2 x5 ~ pusha
, R; e) t8 u5 k6 w7 V) wAgain:
6 y: I0 V9 _0 D+ X" ^) d$ _/ t mov ah,num
7 b, T' y5 g; f7 u6 `8 B  and ah,00001111b
2 ]' e1 F9 z/ q+ K' g9 [! Z# M% m, h3 p .if(ah==15d) ;CR_LF% P* F7 u% P7 \+ P. D
  LF_CR
( a7 [, e! ]; \ .endif
- w7 _* b) O. h
' v% i! _( M) V& o .repeat
8 S: X( ?- j7 B: n  mov dx,base   ;reset host,claim host in use
7 P6 ^7 Z" }9 l* d4 R; x  add dx,0! E# s% w6 p2 v0 z0 h
  mov al,40h
+ w* C1 V! `9 B+ j5 @+ |8 z  out dx,al
, J6 P- x; W/ B" O' ?) ^  / _2 Z8 k( {8 y
  mov dx,base   
' K5 F% X. K' c, }- T  in al,dx8 }4 q/ ~& t7 t+ ^* j1 W; }) C, j
  mov SmbStatus,al# Q7 |1 N& M" t" r: F+ @
  & N" Z) W+ Y7 s+ ~9 @
  mov dx,base   ;clear all status bits
4 x6 Q' L/ ]* O# U( ~8 e  mov al,1Eh   ;host status register0 G+ H$ {7 ]; W4 r
  out dx,al! S5 e) E, q9 H/ T4 ~
  
4 ^" {8 Y7 O, o; N3 |( X  mov dx,base   ;set offset to read . `+ q: O5 u4 B0 }. |* S8 _
  add dx,3    ;host command register, D8 H. `& o" ~. }
  mov al,num
- {3 a$ L5 ^. u- I  out dx,al
$ V9 c  p; l) s. {& @- ]  
9 v5 F4 Y7 ]( ~$ u" i. X  mov dx,base   ;Transimit Slave Address register. ^! |8 e, U" J0 {1 I) R
  add dx,40 _5 @- j1 n5 ~4 p+ t
  mov al,0a1h8 J3 Q" ~3 R3 s$ a
  out dx,al
( k+ M, Y! M6 K- Q  
0 m6 q$ F& r; c* V" s' r  mov dx,base   ;set "Read Word" protocol and start bit6 n: n2 V7 E0 k, d
  add dx,2    ;Host Control register: E/ p1 _0 o  z9 B4 X. W; F1 T
  mov al,48h  
2 k7 p  \% P/ v) B: {1 j  out dx,al
* [8 I. A5 ]' w0 a7 N' v 5 y# L! s) H8 E3 C. i
8 X' E! o' P2 Y# q4 f  j9 i
  
# J) f/ R+ L' `6 v  mov dx,base
& K! a: Q6 u0 {1 g( \9 W( h  in al,dx
3 @8 U0 e, V) B$ _/ k& z  mov SmbStatus,al: N6 _! s7 o  V( w
  and al,1Eh2 V9 n& D, Z! D$ R9 P; p2 [
  .while (al==0) ;check repeatly until any of" d' t( f2 ]6 r2 S$ `, g
    mov dx,base      ;FAIL,BERR,DERR,INTR+ ]& C8 O( y6 Y/ x' y( {3 j
    in al,dx
$ c7 R! _! ^& z2 l/ U8 R3 |    mov SmbStatus,al
4 t- R( a5 U2 B* }  P8 G  z$ q, O    and al,1Eh
$ Q& O8 v1 x5 m, _9 b2 y+ f  .ENDW
4 T; M7 v+ w. v( f+ o* G  * y4 R* r9 @) v( n( ]! O9 t
  mov al,SmbStatus   
5 g1 T) T4 f" K9 f4 U  and al,1Ch
) q4 _, C/ U* @  .if (al!=0)    ;check for errors  
0 s, I+ t: h: a3 I0 g' I   mov al,SmbStatus: H) r; g/ M7 R$ ^. r1 I, ?
   and al,08h   
$ H: s6 o, S9 Y: K9 \   .continue .if (al!=0)  
* d) O  P8 I" _6 D4 m9 m' y   jmp @F  . \! Y( i( o7 _% |; _1 t
.else
$ N+ Y5 |6 u7 _) w2 `8 C  mov dx,base: K. B6 X4 F7 F" ]  C5 T1 x
  add dx,5h
; ]) m8 ]8 t: s, o: \* R  in al,dx  , F2 n% M- ~5 W: ^, n( E
  call binhex
" L7 l. P3 i; p  .break
6 @. S' Q+ [6 s8 z8 K .endif6 f5 E" m# X9 i1 m
  
8 h$ @( ?' j, L, V* Z. @+ U7 C4 u  .until (0)
, z: b' J7 F8 H: G2 F( E. a( x2 @  ) e0 \& Z" h) K
. e# K' L0 C6 H8 x

( H% O3 j8 ^% _ mov dl,20h ;output a space6 t$ y) Y  n: b* Q3 {! K, X
mov ah,24 x6 f# u4 |' M9 e( q& q( H$ b
pusha
1 L  ?8 I) w; o. M+ n int 21h
( B! f( ]  ^5 V: b popa; [" b. k1 z7 ^# O. G% c
inc num
# t. y2 d0 `# X$ Y. ?. ?6 O) X7 C! b$ |) M4 N: I$ A( F  i8 T4 r% X2 Z
cmp num,80h ;get first spd 128 bytes
" e+ d7 w. j! B2 W jnz Again
% z" K2 F0 [6 `1 z* U2 B
: T' D1 _  i) f3 |@@:
9 C" @5 U1 H2 I popa
0 Q: G9 [+ |- @* l: ^- d" `$ V5 g ret
$ ~7 d# h+ M; S# ZReadSpd endp. P& @' @- }3 u, t! |& U

# A* _: _1 z' \; M- U; U) [9 u6 h3 h2 |* n4 J7 A/ r. S

  N% \. S8 N# Z' u" wbinhex proc . n  [& y8 ?. @4 s
pusha ) T& P6 `4 d1 J7 a2 B- p4 q
6 i5 N# q* `  w' k& W% g
mov ch,2 ;2 hexadecimal digits to be printed
  i( |  e) I% z& Qloop3:3 `/ {; R5 ^) t5 H+ w9 a, P
mov cl,4 ;bits to be shifted
2 }- Q( r# c8 k- Z/ t  a3 m rol al,cl3 \& z; c. T# w& l: W8 w% e7 L3 S
mov bl,al9 Z5 b: g5 w0 P% ~8 W
and bl,0fh ;mask the 4-bit Msb6 ^% M4 a8 j$ w2 W2 r
add bl,30h/ ^+ b  q$ z% R1 I
cmp bl,3ah6 K& L: v) |( m. u4 Q. ~) L
jl next1  ;number or alpha?' {# D6 o" m* K
add bl,7 ; ^  p) ]* ^2 L6 U8 K: @; c9 _
next1: ! Q& U7 @5 V: K8 K1 V, e% V$ O
mov ah,2  ;print one hexadecimal digit; n9 P% E5 g0 e0 M  P' Z
mov dl,bl4 e: D, C* Z8 \: [; p
pusha
+ o: x/ t6 g% m8 j  ^ int 21h* A+ B+ W8 h2 X5 a+ _" L  ?% o8 P
popa
) t" R# c9 }: p6 n1 t8 e  @1 q) ^ dec ch# u, `* L. X% D4 n8 N
jnz loop36 ]6 J. e. e7 [3 `& q" n0 h2 g. n
popa# I8 ~+ d$ ?% Y' [
ret
# o, m5 F  m$ y6 [! v. B: ]* J" d! fbinhex endp3 z1 e+ s6 w6 E5 P6 z8 L- W2 n
   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-3-5 17:41 , Processed in 0.119346 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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