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

Intel ICH9 Memory SPD读取

[复制链接]
发表于 2009-7-21 09:57:34 | 显示全部楼层 |阅读模式
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
+ C. Y4 k" i, n0 V& \
5 }- Y& W0 n3 ]  .model small
! f" {0 m1 A) O  .386
5 ?. F! w3 a1 u( A( }  S  CFG_ADDR EQU 0CF8h4 l$ U4 `) d2 o
  CFG_DATA EQU 0CFCh
0 N8 Z6 R7 I  {/ o' G9 R  SMBUS_BUS EQU 0
4 x8 o5 G3 u; h5 V' E" f  SMBUS_DEVICE EQU 31
( Y- h: `& Q- s# N  SMBUS_FUNC EQU 3
' v' B; e2 \$ R1 `, |. j, n9 _  
9 j( p& x3 Z- t3 _- [3 J9 e  .stack 100h. w4 a+ \2 X: Y+ I
  .data
9 \; A1 n- O( [- X- S/ Ibase dw ?  ;smbus I/O space
5 r* T3 w4 A% Wnum  db 0  ;byte select
" g% Q3 @0 C6 ZSmbStatus db ?
8 d1 c5 r5 H% c& K) [2 p/ f# c" p7 [& |: }
  .code
6 g" T8 R8 i8 c- k  Y' U 4 M; k4 _. M# {4 p( k% Y6 J) I
LF_CR MACRO* m1 |2 W7 R, m& u8 v/ A9 C
  pusha5 L! F# f' x6 _7 z+ K
  mov     dl,0dh      6 J: j" h# f: S
mov     ah,2
$ {4 p" H  m( d  int     21h
% _) p8 z4 _) O! }+ K7 Q' }1 g  mov     dl,0ah   ;next line   
& v. {" a2 f2 D# x  mov     ah,2
, r; b; [/ X* W+ i6 o' a  int     21h0 P( i5 ~! f# L9 G+ [2 Y
  popa  + E3 U1 `8 D: p5 n! o5 ^$ e
     ENDM* e; z+ w! x7 i6 \- t! s; O

4 l2 }, ?& T& N! D( F: ?4 W, G4 v5 g+ r
main proc far
) o: `; a5 o1 ^! t$ n mov ax,@data
7 i9 Z5 E8 J5 [  s% c mov ds,ax
1 w) w6 S1 @& G- s5 a . Z9 q  Z, l! |
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
4 [6 N8 P! `" Z# T) f8 R# ^9 U mov dx,CFG_ADDR
: ?2 H1 X  m, V: y# i out dx,eax! K, J/ y% t  Z4 T+ u9 M0 f% ]
mov dx,CFG_DATA
9 V6 Y! S# d# H8 ?% k in eax,dx
+ j7 B  ?7 e% F: {4 {9 \8 A  ' f6 o2 |1 x) }/ N* j' q  E
shr ax,5     ;bit 15-5,the base address7 h& d- X9 b. X- C
and ax,0000011111111111b
  u6 o; t* T2 E7 Y; C, F6 q0 w mov base,ax
3 B2 z9 J, e, a8 x6 G: t, P- ^+ O  5 m, k7 S8 Y) z& J% i/ R
call ReadSpd4 e; D3 F0 N% [5 C# N7 _& L
exit:* T' b8 d+ p+ t6 D* T  f
mov ax,4c00h9 o( O7 `) A& N" \: Z3 e6 m
int 21h
1 {; l* u, Y9 A8 E/ W4 b" hmain endp
( F8 m/ Z' Q' S" u  N5 Z  z: s1 \) w& L% {. D  H  K! h

# j! ]: a" j( f" A+ p* v
7 {  J+ K( o, X5 wReadSpd proc
7 [& l2 t; I) s* R; o" D pusha+ i6 p! f- y0 _
Again:
" e& ?1 R0 r1 C6 Q3 k% {, v& d mov ah,num
( j# {! o5 f6 U* @  and ah,00001111b
" P  a6 v+ ^" R! F" p .if(ah==15d) ;CR_LF
$ N$ ~" V/ ~" t/ v  LF_CR
2 ^; A- ~" U; r" e( B .endif
7 H+ m: B- r# c) i# ^
3 M5 ]6 h- z. @3 t1 ^  ] .repeat: Z( S+ q7 Z. p" A- U
  mov dx,base   ;reset host,claim host in use
% c( ?/ g, @, Z" U  add dx,0
% e2 k! E3 P, I0 A" n$ k6 u4 m( ^% I  mov al,40h7 U9 M; J& v) s/ O% o
  out dx,al
: d8 y# s, s0 g3 [( R2 l2 ~% U  M  
; r0 \# U$ c- p. ^# L+ O4 X( v  mov dx,base   3 ]6 \8 o0 `1 V
  in al,dx
0 p* f9 ^! `* |9 L  mov SmbStatus,al
$ h1 B8 T* p- i9 [/ k8 V' S) B  , F+ C/ b8 G! C* Y% @- x- q4 g2 j
  mov dx,base   ;clear all status bits9 [$ x/ U0 T6 V# J$ K; ]9 V# a
  mov al,1Eh   ;host status register* q* ~+ y+ |- F' o3 w3 h! |$ q5 a  q
  out dx,al0 w+ u& c% @& ]* j
  
' P9 l/ N- q3 v8 c; X/ q  mov dx,base   ;set offset to read
+ Y# Y2 z# t; ~* \  K+ H  add dx,3    ;host command register
! a( [% b- t( t: _  mov al,num
( L/ ~  ]  y$ L) ^" x  out dx,al- q* F: B2 [& w) q2 W1 i: E
  
8 J2 }' {9 [6 V8 ?+ s8 g/ O$ q  mov dx,base   ;Transimit Slave Address register
. p$ ~: ^4 m( p3 j* g) o  add dx,4+ E3 Y/ z/ k) I7 d, l: g" _
  mov al,0a1h% C' F" c" L$ ^; _# R( q; y" Y% W
  out dx,al1 w. W; |( n. x0 g* Q% a+ z8 h3 u3 p
  + e9 ~( b" a* p$ z* E9 `# P+ v' c! p
  mov dx,base   ;set "Read Word" protocol and start bit
$ c0 o7 |& i7 Y. B! w  add dx,2    ;Host Control register
! h. h) w/ ~# v& E% A  mov al,48h  7 H& Q3 j# X& s, H" N
  out dx,al! y5 I9 L. l- N6 G: _' O, t5 z. H! A

, Z3 u  H6 }. I" m, m' d
, q: {/ m' q7 u$ |: _& u7 z  / M5 p# H* K# [( Q2 ~
  mov dx,base
8 k! }7 [5 @; w; c8 S5 R$ }  in al,dx6 K; W4 H! n! m" `( ^) \. W- A: }0 \9 V
  mov SmbStatus,al  i, @: Z8 v" |* ]8 e
  and al,1Eh
6 f1 K5 ^! n0 `1 V! E& m$ U4 W1 }  .while (al==0) ;check repeatly until any of! t6 K: J( g/ z7 f! X( P
    mov dx,base      ;FAIL,BERR,DERR,INTR& E1 L" N) G; h, _! [/ {3 C
    in al,dx
& M- d$ ^4 ^  y7 b- V    mov SmbStatus,al! P/ u& \: Z8 l# A' o- b
    and al,1Eh 0 T5 z( V$ n+ Z) m- X9 J
  .ENDW
) |) a3 I) o% h) ]" y+ h  
; o0 D( [, w" l  mov al,SmbStatus   6 `$ |( }+ X) A# B9 @% x" v1 @
  and al,1Ch
/ W4 ]. a: \! p  .if (al!=0)    ;check for errors  $ _6 H0 X& M% Q4 I; d1 a  `) K' `
   mov al,SmbStatus7 L, F: n+ t3 T1 c8 r
   and al,08h   / @- [1 I; j# t' N
   .continue .if (al!=0)  1 J2 p( W9 J4 d) q& H( E
   jmp @F  % q: W4 B5 Z, b7 R
.else7 W3 N4 B! L6 L5 {( U
  mov dx,base
; W& V+ q1 e( i' f  add dx,5h
3 V! K/ J  l1 h6 X  in al,dx  
* t: h/ @) {8 v9 D2 `  call binhex
! C) h& I' H+ f" p  .break
6 q7 k8 e7 l* _7 \  E% O! I) Y .endif2 c* O9 b: d! S4 s# u% Z# [5 w4 q4 x
  / K& n  e+ Z& ^  J0 b. K7 a
  .until (0) 0 U( y/ Z# g, s1 [+ Y& i. W
  
6 V1 V) v6 `- g# D1 }9 b8 b; I ' s- Q9 {" m, d0 `( L

( T! @5 X( I% r% ? mov dl,20h ;output a space
- f$ L5 H: A3 \+ d mov ah,29 s. _# C4 P$ J; o1 v) M
pusha
) w: D" v; p% A/ R1 V& t9 c% z1 ^9 ~/ x int 21h7 t- f3 t' ?: r( ^, p
popa$ X, X7 Z8 {3 `) r9 _- w4 B3 w
inc num5 x1 s0 E  t# M5 i6 R( U6 t' H8 Z

0 ^2 ?" b& s* Q5 s" { cmp num,80h ;get first spd 128 bytes
5 I4 A9 p( Q! m2 }  U( N jnz Again
1 ]1 Y7 r8 x& b) | % F. [: u$ V; e
@@:
1 }* E1 a( W% M- `0 O6 ?/ j popa
1 |! o0 J$ g8 o# N( Y% V$ L ret
- G& N0 U1 k  m2 k2 GReadSpd endp. j: m/ S0 u& R% l1 M) a3 O

+ j, T3 D. J$ g
* ~+ k5 m9 K0 y' U# e' ~5 F6 V+ U% Y
binhex proc % `0 K4 i2 W* o6 o7 p, R7 ^
pusha
2 `. u, g: q; e' C# C
- W, `- V. E9 s9 p; h1 m mov ch,2 ;2 hexadecimal digits to be printed; M/ b2 l  l1 A  d& R: E0 @# K3 @
loop3:! m  Z" M1 m0 x( \; x0 f
mov cl,4 ;bits to be shifted
6 h: N/ X. [1 y  N7 \: f; q rol al,cl
( @" `" L' [: D$ p mov bl,al- u/ k+ |6 K3 k# W7 l! B8 p' M* f
and bl,0fh ;mask the 4-bit Msb
9 J# s! n5 |( o  k2 r5 ~ add bl,30h
+ D& z# I$ K+ ~ cmp bl,3ah
, B7 a( Z8 F8 P: w9 X: k jl next1  ;number or alpha?
) ~1 Q! x% D; o: u/ L# ?. q9 r8 L" l add bl,7
4 L- }; {& q3 O, O& \next1:
+ {1 @8 Z5 W, r. ] mov ah,2  ;print one hexadecimal digit+ ~* t/ {- n  i9 N4 z, ]
mov dl,bl
9 f  b! C+ v3 s! H/ z pusha
4 _# I+ T7 @# B) h* a& p3 B int 21h) o- }- o1 [% g
popa
# m7 o$ U+ f  ^: N3 D5 q. s" U dec ch7 h: _5 U0 {9 b6 p. v
jnz loop3
( x0 s7 B5 M( `; t- {, R+ {5 K popa' S; n4 O6 }6 @0 P0 z
ret
/ r$ l: B3 c1 K' qbinhex endp
3 a2 m/ }8 h- `$ V1 s   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-1-18 22:41 , Processed in 0.227277 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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