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

Intel ICH9 Memory SPD读取

[复制链接]
发表于 2009-7-21 09:57:34 | 显示全部楼层 |阅读模式
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: ( k/ g/ N6 R  z5 k: p7 `; i8 [

+ A  w* e) j, p' W: q  .model small
( c* {! D. ?& |3 h! q% `  .386, @6 s( }, Y+ g) V0 A: r( J
  CFG_ADDR EQU 0CF8h
9 h8 i* I; D& w' l# H2 a, o  CFG_DATA EQU 0CFCh
6 p4 j/ V. p9 P0 P4 n6 n  SMBUS_BUS EQU 0
/ `5 g  y; e( ^% a4 j$ H  {  SMBUS_DEVICE EQU 31
0 @# H1 T) h6 \6 ]. V8 c6 c2 M6 P7 A  SMBUS_FUNC EQU 3
; w3 h8 e( q; z) J! f/ |  
8 D# o0 N0 V5 B& g/ C- y* [  .stack 100h
5 b2 V# Q7 |% U2 x& [: B7 N  .data/ I, D+ U& A+ g7 _6 ]
base dw ?  ;smbus I/O space; [4 [2 g% ]# d! p
num  db 0  ;byte select
/ {5 [. C) v- K1 }; CSmbStatus db ?
3 o( Y& W; U4 Y0 a1 s8 W, m1 Q
: \' V- S; R6 L: N6 B0 C# u1 o  .code9 |& |- U6 b1 r0 ]' G: W9 h

" ]( h# h1 E" V0 k+ O& KLF_CR MACRO
7 S9 C6 \" @$ U- N  pusha
# b% @$ H/ Y4 K  mov     dl,0dh      $ D1 u3 x; ?7 p9 l
mov     ah,21 \) x' M; F1 ]# }$ U6 b: ]2 B) \
  int     21h! _4 G. L* s$ ]; C
  mov     dl,0ah   ;next line   . \6 S2 j$ k6 N$ h6 ?: l! u  x
  mov     ah,2
* s6 B) x! B  ^, D0 M2 s. C% U" {  int     21h5 a6 b0 n! f5 V: t5 k6 R( l
  popa  
6 @1 L) D5 L) P     ENDM
2 p8 `6 O+ Z+ s5 p0 z# f
6 o4 G) C. X9 |
( I7 x) R1 I8 A+ N3 X% x0 mmain proc far$ f" E' {0 l! j$ I+ ?. x
mov ax,@data) J. [. z: U! K7 E
mov ds,ax" b& D$ ^' ~5 n5 _8 k2 t8 u9 D
' v* X. D; c5 r; m
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h8 _$ b% T' Z- \& N0 J" m
mov dx,CFG_ADDR, i- U* {. G! z# x8 k
out dx,eax
9 H4 h; `8 v# A- Z mov dx,CFG_DATA
: a( m; O# S/ k; m. h1 \* H% G/ L in eax,dx
) j2 N+ V+ X' \$ _* |$ L  
. n* @' L1 n0 H shr ax,5     ;bit 15-5,the base address
9 D. f# o2 o( ?) n and ax,0000011111111111b. b7 Q9 Y% Y4 F- h6 }
mov base,ax. Q$ j" A- ~$ b% X
  
; r- C, X+ B/ T- g' R- r; g5 I. r call ReadSpd' u. Y1 E8 w. h( q- P7 ]
exit:
; z0 u' l9 C( j) o  E$ ?: E' z mov ax,4c00h7 b9 v5 H3 B$ B7 n8 c# Z
int 21h- L5 R. X: M8 ?: u$ r
main endp
5 r; s7 |# B5 G) M/ t- `
% K3 z! \4 ]/ F* b9 a, P) Q: t' m- o8 |( g+ [; Z

- h7 [0 ~( w! ]% n/ M* r9 vReadSpd proc3 T& N; w; x- f6 O1 T# U$ i
pusha
) n! O) J: f$ @5 }1 x1 a/ o+ \Again:" q. A4 F* e8 p7 H8 |& `8 }4 j
mov ah,num" k1 k0 W3 c1 C8 E9 k
  and ah,00001111b; v% T" K( v6 a
.if(ah==15d) ;CR_LF' Y8 a, ~/ d& x( {+ R8 |/ e
  LF_CR
$ Q2 i7 K1 J: Y- B! B% | .endif' S3 Z1 i2 W1 O) z4 |8 e

7 q  h! ?7 X3 d, Y- m .repeat
8 V) W3 b+ s& z( n  mov dx,base   ;reset host,claim host in use6 N7 N4 _+ r& G* e( b2 H
  add dx,0
8 v' ?7 V) A) D$ L  mov al,40h
- Z2 g6 r5 T& K! u" z  out dx,al) [4 `% F( S3 o( _
  
8 |9 ]( a& g" y; {5 v  mov dx,base   
, Y. W% U) T) b1 T' z  in al,dx7 {( X* @/ E5 t3 U
  mov SmbStatus,al6 h4 [" E+ C; z% x! W2 u: R" @
  : q7 O9 K/ D8 Z  Y: A
  mov dx,base   ;clear all status bits3 J, {) E, b4 y, P
  mov al,1Eh   ;host status register
$ V2 ], L2 ^7 p( o4 b7 B  out dx,al  N! e2 S% B; u- G# x. m& ]
  ( g9 V, D4 e( l% v
  mov dx,base   ;set offset to read   t7 X* o5 n0 o- t
  add dx,3    ;host command register. A5 d$ ~% `1 I2 D$ f: K/ t
  mov al,num
+ a# h% W2 c- X$ O. f% ?  out dx,al6 ]6 l2 ^" z5 C0 Y
  
8 o1 }3 }- [5 b  n" [4 R) N5 {  mov dx,base   ;Transimit Slave Address register) }% t" q" N& E% K+ H( r* I
  add dx,4
+ u9 o2 z5 O& Y4 V: S9 J. J. S  mov al,0a1h
) Z0 R) s! A: B+ B  out dx,al# g' N5 \. \: M: e& q
  3 y* O/ {' e( w4 a
  mov dx,base   ;set "Read Word" protocol and start bit
8 P0 x( B$ T& D# x- S1 T. ^; P4 ^6 O4 s  add dx,2    ;Host Control register
% a" f4 j& X3 t7 H, p( R9 s, m  mov al,48h  
: m% A' F' c+ {# \8 q# g/ Z  out dx,al  W( r. F% d2 e; L. U
& @  @, S7 W* h  ]0 g  i  H

  f5 V5 D; x4 c2 c; o  ; x+ n8 D! [5 _3 {
  mov dx,base/ t6 }. F1 X: e
  in al,dx
2 Y; A& X$ C' D" ]5 A# L  mov SmbStatus,al
& ~1 k- |; {* I4 j7 D  and al,1Eh
& B! {8 v0 v3 \  .while (al==0) ;check repeatly until any of
$ V! x/ E) d. Y1 v    mov dx,base      ;FAIL,BERR,DERR,INTR- k, f5 k5 h6 ]" U& S" Q
    in al,dx
$ V: w+ o7 @- U5 K$ m- I    mov SmbStatus,al1 q% y/ [* L6 m5 {; |/ q
    and al,1Eh
) U3 z8 O; l( [9 z  .ENDW& B  t$ K* A, y- T1 ?
  * `0 q$ V' ^& ]9 F
  mov al,SmbStatus   ; U, p& c* d6 z
  and al,1Ch1 A0 _' w9 [! a0 A6 G
  .if (al!=0)    ;check for errors  
# u4 y; B9 @/ y. r# u9 X   mov al,SmbStatus
/ J  D" {- T4 ^9 q   and al,08h   ( z6 d" [5 r/ Z3 S* K
   .continue .if (al!=0)  
2 r; H3 x! m. q0 d. l9 \   jmp @F  ; f- I, b. w- w2 U/ s6 U6 u4 o, o. O0 B
.else/ [$ x% k8 T$ d$ c) E
  mov dx,base
( l* r. }/ A7 J' f  add dx,5h
! X& z/ b  X- z! J  in al,dx  9 Q/ a. o# p5 y0 @0 s; C0 K
  call binhex
2 S+ ~1 O1 A( \# ~- W5 d  .break
& E# o+ _) e% N1 k# ?$ J .endif  G5 @+ H) ^4 R7 G  _  s1 z' N
  " Z( l7 Y* k5 z4 D. |9 o/ x
  .until (0)
* B; j2 |# v, O  
& a6 d5 z) k9 d$ ?, u0 }% ^
, ]/ h# `& o) Z
& f+ |% n0 N& F3 W( L1 C mov dl,20h ;output a space
$ g/ s7 E% D% }6 \9 E2 A& b mov ah,27 n0 T* {. T2 f/ o7 `, r5 Q* e
pusha
+ E! x( v" j3 b int 21h
7 \- o, D: q, @  W3 \; B popa
( X/ [" K9 u! S" g5 M inc num
: L$ t, j" m2 I/ A; }) e/ z1 I/ c& }$ u
cmp num,80h ;get first spd 128 bytes 5 [: f/ S2 _5 H& q. \/ G  t
jnz Again
# f: U9 g' a1 E- f3 g: C
; P, c: b" C( j! m0 B@@:
+ `; q# X# F: ^2 I3 n/ P popa, T- @! V  Z& T! N' x
ret
; d$ n& p/ ]4 b# p* PReadSpd endp% \( s) N4 v9 n2 G9 f: x

1 N4 |) ]/ W8 Z7 n0 x6 A# C5 W( e& Z# f4 N* n/ ?# M
7 B/ c$ o/ J: D' Y: p& X
binhex proc - O  T: x% }0 Z- w3 x7 W5 B
pusha 3 t& J2 m# p  P; O) J, `3 B( f* `2 k

- i& h& M0 {: ^# V, k; {: K mov ch,2 ;2 hexadecimal digits to be printed
& D0 s% P' ?' h( |: Lloop3:
4 o" X4 K$ M$ T mov cl,4 ;bits to be shifted
' c( _( u6 Y4 a. w2 I6 q rol al,cl4 l9 O  @: g& U
mov bl,al  \- F1 r  |' R  b9 i6 ?  g0 r& ]
and bl,0fh ;mask the 4-bit Msb' v& v. p  _3 A  L5 Q; J
add bl,30h* @; k7 a% p6 i. H
cmp bl,3ah5 s6 V9 b2 c: x3 Q2 V
jl next1  ;number or alpha?
' l7 t8 B8 t& X  V, l, N add bl,7
1 C/ a/ p8 |! bnext1:
& v4 R4 V$ I* r3 m' u( }$ `$ n3 n  O mov ah,2  ;print one hexadecimal digit
  c$ S/ L& q- Y& g mov dl,bl
# s7 Z* X* ^; X. N1 ~ pusha4 q8 K7 R  @0 a# ]: \
int 21h
* L$ t' [6 O7 J- @ popa
/ {: g# l3 M9 L$ _* L$ ^+ \ dec ch
  Z$ A: A: |1 j7 E8 m9 p; ^3 G jnz loop3
5 S" j+ S) ^  Y( T1 [ popa. d' T( _# H3 X2 a! n  W9 X' n
ret
" c  O# A" [2 P" fbinhex endp
0 g  x; n% ?/ o; u8 @, q   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-4-25 03:39 , Processed in 0.113280 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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