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

Intel ICH9 Memory SPD读取

[复制链接]
发表于 2009-7-21 09:57:34 | 显示全部楼层 |阅读模式
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
3 h2 g9 \7 J  [0 a  f) S* x" _% J9 `% h
  .model small
: e8 S2 D) w. q5 s/ Y9 t5 I  .386- T& n# [: ?9 t/ Q$ G+ @( d+ g7 \
  CFG_ADDR EQU 0CF8h3 I/ ^" z9 d% U- n! W/ [( w
  CFG_DATA EQU 0CFCh
6 g( Z. T7 V1 ^/ |6 @$ F  SMBUS_BUS EQU 0
3 E. \% x, T& Y2 k  SMBUS_DEVICE EQU 31
, v. F% p. E" Y, h  SMBUS_FUNC EQU 3
. n9 ]9 a7 J. Q, w' l  
: X& ^& @0 H# K( E  .stack 100h
, }# G/ g3 ?! |, M+ ~" u. M6 O7 F) j1 Q  .data
, ]5 t* K. k1 f5 e, d9 xbase dw ?  ;smbus I/O space
$ M7 U- m: r% x+ B# B: znum  db 0  ;byte select
( @% V8 z9 |) @' mSmbStatus db ?: `2 j2 f5 e: }* C  B1 E2 e

, \% ]8 L( w% _  .code3 [  }0 f( o; \! Q

0 b4 G& M% n) z6 O) y$ a; oLF_CR MACRO
4 v+ h( s7 {7 A" w8 B$ e  pusha2 q5 Z1 N- [' S7 y6 _
  mov     dl,0dh      
6 d  K: C7 t  m mov     ah,2
, u# r* l) W6 s; u- W/ j" l2 m  int     21h
+ W: I: H2 [& {* g  mov     dl,0ah   ;next line   
* k1 [9 a: y( u% s1 u1 n" {! R4 n  mov     ah,2% i( ^& W* x  Z* z5 s
  int     21h
- K- E3 w5 n) d3 ~" G2 y1 R  popa  8 m& b% q; g' V: G: z9 M
     ENDM, r  F5 Z; `: {2 T
; R' h6 N+ o& B6 z9 j
2 R- i& @8 L4 R& B9 v6 x
main proc far! _  C. i8 ?% E+ J1 Q
mov ax,@data$ c# ~8 @' @6 X: l# j3 X" j; P" [" U4 n4 b
mov ds,ax
* w0 G2 ]& ~* Z  T( r$ y9 j) o
1 F: z- ]/ f/ R; F mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
  F6 E6 {$ X+ Q; w+ }/ E+ U/ F mov dx,CFG_ADDR
* h1 i1 I2 l) S; ~& } out dx,eax3 j; B5 d. r; U  ^, H* n
mov dx,CFG_DATA" j1 c5 `" {  }  ^% h% \
in eax,dx
) m3 u0 H) q( T, G0 X  + K4 c9 Y! Y) {- F! F
shr ax,5     ;bit 15-5,the base address) R2 [4 H( X4 L$ C/ A! L& D
and ax,0000011111111111b
0 k0 i9 ?/ D0 l& O' V mov base,ax1 {" _  ^) E& |; W4 K$ @
  6 g* N' |: y. x: d- A2 k
call ReadSpd1 n/ Y9 ?* f- q! d
exit:
1 z7 _- ^7 {7 \8 Z mov ax,4c00h2 g1 L& B, X  p" `( S
int 21h/ ?( v# ]" y& [% R
main endp( F  }6 V$ C: H3 w

+ @3 B: @, M$ O) C) [& f6 I  j2 R! l

& W% g: _9 V3 bReadSpd proc
' }# e  b, W* I3 z9 M1 g, f pusha
8 t. \" v: V: Y3 UAgain:0 m( z0 g% Q* k  |: Q
mov ah,num
( D- s+ G- L9 m- s" q  and ah,00001111b3 h0 r* J8 c' u
.if(ah==15d) ;CR_LF0 b3 Z0 Z. {- H7 z
  LF_CR
, A2 x) ?+ g% ^% n2 h+ `; X .endif
% L) B4 h3 P" D 3 B& I# r4 E4 O* d4 w7 n! F: F
.repeat8 ~" `6 V! f! v: @9 @' M$ y6 P3 v
  mov dx,base   ;reset host,claim host in use" p; w( T8 p8 _: `2 V' Y# t+ X
  add dx,0
9 @/ ?1 k" j  u) a  mov al,40h
! ?" Q: |: v. Q2 w6 x* q  out dx,al
3 F: Q& }  j+ K% o0 J  
$ i5 a$ k, W: _( a  mov dx,base   
2 m9 Q" ]0 e+ N  in al,dx
2 Y% p2 w5 s; X* M' @  mov SmbStatus,al( c  {) j" F# s8 L
  + M5 }' W) @, T5 }( j
  mov dx,base   ;clear all status bits( \5 s) a; D- Q( ]! Y( ?9 q
  mov al,1Eh   ;host status register
+ H* M  j& Q* g1 D: x% t# C0 ^7 o  Y3 K  out dx,al
: d' T3 |- N2 F' \: Q% @  
& q! s, t( _4 c3 I  mov dx,base   ;set offset to read ' F0 Q! k. m- c1 E& [7 C/ B
  add dx,3    ;host command register5 I4 x! U6 _4 M- f/ C: r# _3 X
  mov al,num
2 w' ~" b4 E# o  out dx,al1 O1 W: u7 ~4 G( d5 h/ i; I
  # L9 M5 g) Z+ I5 W5 i
  mov dx,base   ;Transimit Slave Address register
$ R  \1 c. [/ P0 s3 Y! I; E3 n  add dx,4
- V* p( q) O9 @* [% f7 l  mov al,0a1h' A5 q( \5 o$ C8 S/ W; T6 J
  out dx,al- E' n) t& A+ G
  / g& C% l6 Z2 {, y: _- [
  mov dx,base   ;set "Read Word" protocol and start bit
3 H( z# U. u( l+ s  add dx,2    ;Host Control register5 Y  L5 |/ [8 _+ Y
  mov al,48h  , T2 T" b" h; I& C
  out dx,al
8 B) \. r! B2 k1 _( f# z5 B) j
3 U0 E8 F1 m3 Q) b, m3 ~5 C9 c9 o
  
8 K, C: J# _& P: V' g. k  mov dx,base
  j+ C6 W7 R9 ^1 _; G5 `  in al,dx. H6 z) `( B& I& I* H
  mov SmbStatus,al6 m, B- j9 T, ^9 R
  and al,1Eh
4 V  ~6 L7 w5 ?) n) l  .while (al==0) ;check repeatly until any of" {" x, K; U4 G  n9 C+ b+ Q9 P
    mov dx,base      ;FAIL,BERR,DERR,INTR  t: z3 |( `6 E( |/ p3 d' A5 w
    in al,dx
( v! z$ |$ Q5 j6 m* Z, n( _    mov SmbStatus,al/ R' E% Y8 E/ P/ h4 T( U3 W4 a
    and al,1Eh
' y( W- e! h: o# T  .ENDW
$ o# g0 i$ _4 D! i/ t" [: A9 t! o  
  u7 J" f2 v1 V8 O& y  c; W1 O# c  mov al,SmbStatus   7 d1 \/ C$ S1 l, s* @
  and al,1Ch. O, Z. [/ X, J0 D2 F" D+ y0 T2 V
  .if (al!=0)    ;check for errors  , M$ o5 c- G$ o5 A) H2 S+ r
   mov al,SmbStatus4 g+ i$ y8 [7 F8 e* ^
   and al,08h   
# z) w3 o7 \4 H, _8 k; R$ m0 K/ I: c   .continue .if (al!=0)  " ]: C6 @% T( h: ~& M2 r: T1 j
   jmp @F  
2 U9 E: R; k/ [5 j6 H" i' q- C$ O .else0 T5 m2 E+ F9 }6 q3 x( ~& a
  mov dx,base' J3 G! z6 O' C
  add dx,5h; z8 y$ O: E. C
  in al,dx  
% d! J6 B& w) s, o% \' [  call binhex 4 a! B3 U1 ?4 \0 S% V
  .break
4 x  S% @* d3 b7 C$ T0 l) N! G .endif4 x7 ^8 j; _" R; k# D8 s' w, h
  
8 y& y! a) B( R9 v% N( W" `  .until (0)
, ^3 I; P+ A2 @1 N# j8 ]  + F% G! a+ I* r

( K# s" X' R0 H4 w+ {. A# J$ |
2 T( k" v0 _- }$ ^" ]$ } mov dl,20h ;output a space
( E7 ]! {$ g7 w mov ah,2
/ x$ P/ ?$ ]! i! s/ x" m pusha
. e# m9 \; e' L, s. I4 T int 21h
6 w0 ]1 E" c6 ^- V/ t( r! c; B1 s popa2 ?, K6 a1 J7 D
inc num
8 a4 i, u% _* l( _* \- m, ^
1 G! a! M/ e1 M7 R2 m0 G5 o- |! m: V cmp num,80h ;get first spd 128 bytes
; Y, {. \( J3 x" S jnz Again
, h+ i( X6 T) G  g2 h. o
6 j' ]6 N% I* m@@:
) c8 y+ w* |% e( C% j popa8 C7 ~3 E5 D# _) v* t
ret
# {8 c, M; F* U! gReadSpd endp7 g. i+ V6 Z9 N- t1 p

! _* t4 |2 h7 C- y) j8 }# J+ }
) V  y$ @- h0 i( {# `' B" w5 |
- p9 \: O6 p2 C% `* ebinhex proc
4 [8 N6 t3 F* f# L pusha 0 s# J/ ], W8 b7 a: O
) z; d- h1 E: l/ x9 ?$ v
mov ch,2 ;2 hexadecimal digits to be printed! V& m: z# j! \
loop3:- g6 O" h! Q0 V' {
mov cl,4 ;bits to be shifted
: B2 g. X) |5 A' d% V0 W3 ?3 N. F rol al,cl
8 N( I- P7 `' U. F4 K0 Q mov bl,al  p6 R! {6 a! y  O
and bl,0fh ;mask the 4-bit Msb, M7 r4 X/ O3 x! s5 J; c1 J+ A
add bl,30h& t2 Q( f' T, h3 v2 i1 S9 U* N8 p
cmp bl,3ah
. P1 W; p4 w, P$ ?" i jl next1  ;number or alpha?
8 G, c) u! L9 G7 l) h6 e- M add bl,7 & ?, @' a, Q" {9 z/ [9 p' b
next1: 7 w0 t% ]( t" y' o% ^
mov ah,2  ;print one hexadecimal digit
' Z8 t9 S4 u( y% I: ]4 U mov dl,bl& f: H7 z) n9 F( d
pusha
4 ?' H, _0 `: f+ i, r2 E int 21h) W( U" B( G8 d. q
popa
) J: }$ r9 @7 D- H3 q* g+ u& w dec ch
$ g$ D9 E( e* w jnz loop3
1 V; ]: |) h. b6 t4 \ popa5 T3 Z$ m" G3 Y: C" T, s
ret+ N6 }0 G4 E8 G% Z/ u
binhex endp2 t+ p  y0 I0 ^! n2 m' w  G2 a  t
   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-4 16:22 , Processed in 2.815068 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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