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

Intel ICH9 Memory SPD读取

[复制链接]
发表于 2009-7-21 09:57:34 | 显示全部楼层 |阅读模式
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
9 v  y, @% B* \* Z' {7 t8 R: j1 Q. z" Z4 l; A4 S
  .model small, H/ o" f. O5 q8 [5 N
  .386
) B$ _* ~' L! u4 |* B& g) W# R) o/ w6 ]  CFG_ADDR EQU 0CF8h  R  \% A: T2 J5 j
  CFG_DATA EQU 0CFCh
; P& D' {! s7 K/ z3 L( v; I3 z  SMBUS_BUS EQU 0& f) Y* l# X9 I- J0 }2 W
  SMBUS_DEVICE EQU 31
& N" a7 ]5 ~$ F( ]0 {/ b( J  SMBUS_FUNC EQU 3' p8 Y4 R: u3 D4 U# P# S
  2 Z! R9 u- l) {; Y/ h8 ~2 u4 F& ^) y& O
  .stack 100h
! g7 n' y! e  t* \9 m# p7 \6 H  .data
( h1 m0 n9 A6 k: f% sbase dw ?  ;smbus I/O space
" D9 ^* |/ E3 b, E9 unum  db 0  ;byte select  n/ C6 O% o' j0 z
SmbStatus db ?' f4 ~. y! ?3 W( n
4 E9 [+ B9 V7 I4 t3 O
  .code: }& \& v1 J8 a- L% l

8 t; Z+ N1 Q: v% ?- DLF_CR MACRO! Y' A; @* \9 {1 k/ E8 W! K
  pusha( ]8 B" ~$ [2 s2 \
  mov     dl,0dh      1 F6 n0 c. o8 |  N1 M  x
mov     ah,2
9 K& w' q8 N5 k; v( e  int     21h+ D2 r1 }8 e  D+ v& a
  mov     dl,0ah   ;next line   
- o; N3 Y" B. u, m  mov     ah,2
! ~$ V; V. d$ `  W# j6 d8 ~/ I  int     21h3 A( ~1 L7 P7 l/ x, G" a
  popa  
! J% e* d' ?, n     ENDM8 J+ K9 i9 I+ s# e* W2 {
; R- N- e+ B" e
0 t% U% X) l0 Y  K6 t" ]
main proc far
% ~1 }8 s4 W5 O( u; h mov ax,@data+ o, k; L& V! G/ P
mov ds,ax2 W/ U* j5 a7 ]
. m/ D# K7 N* W' \+ e" A3 `  Q
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
: F( L6 a" m1 J9 @2 j  J) L mov dx,CFG_ADDR5 J2 J0 H5 `0 f; h3 D
out dx,eax
6 h$ |/ r/ H" _) H1 x& | mov dx,CFG_DATA: W; m, H+ i2 f; K- r  @. {
in eax,dx. s. [* e1 o- z8 m; Z$ u) D
  : N' i" _, Q7 @# S% _/ `8 Y
shr ax,5     ;bit 15-5,the base address0 W2 e: h  x8 Q  z$ |4 c: L
and ax,0000011111111111b
$ R- G# W  t; [1 } mov base,ax. G7 L# q8 j4 f  O2 L- P0 e. n, l$ j( R
  
5 H: `/ `, m- Z call ReadSpd' k  b( ^5 }# {' |  C) f
exit:! G5 O$ t6 h5 {
mov ax,4c00h" [. O" g3 |+ P2 n& Y% F
int 21h
' A6 q# d+ ^3 ~% x) ymain endp
+ t% j6 }& ?; o' d, q
& R! @) \0 r+ [( u# V1 C3 w. D- ?+ L$ f
3 h* J) s/ _, H0 L$ e! ^3 f
ReadSpd proc
5 {: h; ?3 N9 K0 X pusha
) d  s( q/ @1 o1 sAgain:
( `( G- H) r8 \/ P$ P mov ah,num
1 B" D; x/ K& m( O3 b$ v# d  D/ F# E  and ah,00001111b5 ~0 T, i% g9 X6 I
.if(ah==15d) ;CR_LF
7 o: X9 [( ]7 N% P4 y# D- W  LF_CR6 P' A8 W- P7 c) Z1 A  K: B
.endif
3 S6 l+ _) w! N, q# m: m  X! ]
' X$ t; f) `9 G! H3 @6 K4 U .repeat9 j: h' v6 |! S8 @
  mov dx,base   ;reset host,claim host in use
2 X: g2 H$ h3 w# C0 i& ]4 ]5 b) u  add dx,0
' D4 J. X5 S2 V; t9 f+ [  ^  mov al,40h+ _  Z9 [4 p( f
  out dx,al
/ u" _' E. y8 U" P; V) Q  
! o# r6 H0 G" |# o) Q# B0 Q  mov dx,base   ! R1 j% f- q+ C3 a) H
  in al,dx
3 T# ~6 o, O. W  z& S7 x  mov SmbStatus,al+ O/ e% V1 C8 G( s! ~
  
* I( c1 T. G1 G" x5 M  mov dx,base   ;clear all status bits; `! _( J; m8 ~* ~* ]  Z
  mov al,1Eh   ;host status register
. a: V, f: D0 u+ l. V$ t  out dx,al7 v% D* w8 k3 r7 l& m
  - j6 ~3 Y5 D4 ^- |/ D3 ^0 z' q
  mov dx,base   ;set offset to read
2 F8 m. |2 ~6 L. c2 T( j1 J0 F  add dx,3    ;host command register
, K$ m: v1 d3 P1 b% ^5 u; j  mov al,num; \) g& z8 I; ^) c# y" G
  out dx,al+ H6 q% }6 w8 V
  
( X* v3 n9 q# _  ]) C  mov dx,base   ;Transimit Slave Address register: E* U8 }, O4 t2 s$ v3 [
  add dx,4
0 b3 \: s+ I; w( C' T# ]  mov al,0a1h
! Y2 B3 a2 e, z$ m) z# U0 y  out dx,al
  g# }' f0 K3 ?& I; }! i  3 s% A! A2 o) [/ m! n( U1 f
  mov dx,base   ;set "Read Word" protocol and start bit
9 e! O7 _$ p' |; m% n  add dx,2    ;Host Control register$ u- l; F5 d- a9 L" y% k
  mov al,48h  
6 A8 @0 T4 z3 o  out dx,al8 {4 _2 D6 O5 \/ o) J; y) [
2 p1 R3 N0 n0 q2 I- Y( [0 M( p7 d

6 j: O$ N3 }5 b+ s4 l5 K  
$ z+ M: h( c% d/ F9 L9 P' N  mov dx,base
+ X/ i/ f1 E" c' _: }  in al,dx( s6 i( H" [9 B$ X* P  j5 y; c
  mov SmbStatus,al
& u0 s8 Z/ n8 r! P  and al,1Eh
' ~* }) k+ G1 t1 Z+ y4 S" V  .while (al==0) ;check repeatly until any of
/ ]" h4 S: N) Y: U7 [    mov dx,base      ;FAIL,BERR,DERR,INTR
6 _) x! e1 y/ X3 V# ^    in al,dx
" t/ @$ M4 \' n# j* l* D9 S) m7 H: G    mov SmbStatus,al, \) [( {* K- H% \
    and al,1Eh
) k, q: B/ a5 B$ M2 e' a+ q: C3 Z* [: V  .ENDW) I0 @9 v2 x1 }, o: K
  . {# ~3 U+ q* X
  mov al,SmbStatus   
& O2 s3 H. o9 U: ^  and al,1Ch
4 x+ M; C, N4 F8 m6 _+ r) x  .if (al!=0)    ;check for errors  7 E$ {* U8 L$ H; z
   mov al,SmbStatus
$ y  f( L* q6 n   and al,08h   
7 q; n/ E  c! B! ?3 ~   .continue .if (al!=0)  ( X0 T) o0 m# `( n
   jmp @F  0 n' `- O! n! M
.else5 a4 O* S6 j. W; Q# M- `
  mov dx,base
. A' E7 Z+ u) Z- q" j  add dx,5h
/ J2 _! Q! D! X) K# k& T  in al,dx  
" J; N. A, `, T- h- w3 Z6 I  call binhex ; K9 d3 w! b. M
  .break. [& E# }! S( Q* T3 N2 m
.endif
1 t7 }2 }1 z! Y! q  
- L- h. @# ~5 \; a$ H8 h1 O  .until (0) / }0 c* L: L9 A$ t) M; J3 n
  
; f" S: V. z* h/ `: r5 l* P! i 5 |9 B' p; ~0 l3 D3 V; M
* a2 [' [$ F: z
mov dl,20h ;output a space
7 j& @1 {+ F6 ^4 V# E" S8 z mov ah,2  `" @' d( K% x* `& o5 b# o" ~
pusha
8 t0 x% h5 A5 ^) T" J int 21h
1 K+ c% j( t- c popa
0 c* }0 Q4 ]/ l: `0 @ inc num
5 L# @4 Z. @' I. m8 @0 A! `$ |* G) p: y1 K9 }
cmp num,80h ;get first spd 128 bytes 2 }. y9 O2 b0 S$ ]4 ]8 q- e4 o( q
jnz Again& c' ]' j" B+ l! i

( W$ }* N4 g& Q; y7 P7 x3 @@@:
# G5 ^# w1 z* h$ a1 d: p/ c popa
8 N& i' d2 _: C' T- W1 k- {2 V ret
3 z- Z+ x$ ?9 B' rReadSpd endp
0 h+ ^4 l/ F2 ?/ s& q3 r
( j6 _3 O* b! ^, f+ l
2 o2 D+ R* f' G) @7 r) u/ ]- Y/ y$ o6 E( a/ B# ]' T
binhex proc 5 `% T" H3 D& G" y, L2 n
pusha / U7 `" z( w0 A: a

/ a" M# \5 a7 L0 y# z mov ch,2 ;2 hexadecimal digits to be printed: t, P% Q" @8 j; o$ l3 }- M( C
loop3:
- X4 M) v8 L  q: p# L5 t8 _1 y mov cl,4 ;bits to be shifted' m. h! ]# r" y( a7 M3 ?; K
rol al,cl
# t. y& P2 {8 {- C mov bl,al, t; @1 ^" S. d  `1 j$ d7 S* N
and bl,0fh ;mask the 4-bit Msb% L1 `) V  x5 x: ~. ~
add bl,30h+ d9 L% ]2 y) N
cmp bl,3ah/ \* X% f. C/ D
jl next1  ;number or alpha?
, O8 d" n9 H7 l5 q" _6 j add bl,7
, a$ g9 z( a( o, q' g/ @next1: ) p/ v) B. S9 l
mov ah,2  ;print one hexadecimal digit9 N' q$ W; R, d# Y2 w! k
mov dl,bl
) _) W! o- D* S9 X pusha
/ S$ Q) ^& L! ?- B' G  w int 21h4 F' \; O, I$ B3 Q' r
popa
) a* d0 Z+ x( K9 G2 H- x dec ch
1 E% c! P$ Y; o3 |* T jnz loop3- A# g) r1 V3 G4 T0 [7 G# J! d8 h
popa
# U* ^4 l) j  J' s; G ret  ~7 L5 z2 w8 |1 k/ T9 G
binhex endp
9 d5 l( T: n0 P- Z1 o5 W8 x. Y   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, 2025-4-12 06:29 , Processed in 0.030026 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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