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

Intel ICH9 Memory SPD读取

[复制链接]
发表于 2009-7-21 09:57:34 | 显示全部楼层 |阅读模式
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: 3 u7 \9 N7 k7 i& L$ Y
3 ^0 d1 y% k2 M# h, Y2 f% ?
  .model small* T  P: }: _+ I% E
  .386& U) k( x2 @2 U  o+ @# O9 l
  CFG_ADDR EQU 0CF8h
' r0 O3 D7 z. P4 y) s9 F' g  CFG_DATA EQU 0CFCh0 ]/ a; e) m5 H5 r' a
  SMBUS_BUS EQU 0
" f* G# E% Q$ a: x1 H  SMBUS_DEVICE EQU 310 S: J9 v$ [  L/ o; |
  SMBUS_FUNC EQU 31 w' r1 v- a" a8 ~6 |3 ^, Y5 r
  # D4 j& z2 u, `+ ]1 }2 T( c
  .stack 100h
5 p/ @0 c. u7 o% N  .data% Z+ Z. _5 {8 B6 V, X! D) x
base dw ?  ;smbus I/O space3 ]5 ?2 o% W/ ^& F+ }; `
num  db 0  ;byte select
( {" [. d* k3 s  d  W$ C. K$ c! WSmbStatus db ?
5 U4 |( {2 N7 l7 F
; v. T" ]' i" K  .code% K& i6 y4 X; x
, x/ p5 `0 |$ K9 c' W; U
LF_CR MACRO
$ a6 T! Y1 ]) K1 W6 C( |  pusha
: u% p5 i+ g, I3 ~+ Q( ]) P  mov     dl,0dh      
. f1 {( {  r/ m$ f mov     ah,2
% G$ E+ l' y. M5 ]  ~  int     21h& Q) T- J3 N; I7 d. }# m
  mov     dl,0ah   ;next line   
- R) g* I3 G5 ^( l. M% C  mov     ah,2& O' n6 M8 m' o/ T
  int     21h+ H4 }1 @4 u' c9 n0 y& F  e
  popa  ( z, Q2 j9 a" U/ @" C1 g+ i' c
     ENDM
- o' Y- ^3 `; {7 @2 c. h
6 V3 j9 g0 D( H2 N6 Q
7 D7 Q, H6 h$ J% tmain proc far
1 R; Z* P: V  {; M7 B4 ` mov ax,@data8 ?. B* b, Y7 {- H5 D3 z4 \& `
mov ds,ax
! m2 Y- M5 d% Q2 E8 T5 p- \  x7 u ) l4 {* M% e% A" W+ v9 u4 v  N
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h+ ~4 a% ~8 g- x5 n3 K, o& h8 A
mov dx,CFG_ADDR
+ h& C) L7 K& M  V out dx,eax
  h. [6 M) Y  f' E. b) S mov dx,CFG_DATA
. ?$ ~6 b$ L+ ? in eax,dx
& {& {( v/ g& E7 ?5 |" x0 R  6 E3 g- W- l8 P; t5 x
shr ax,5     ;bit 15-5,the base address
5 Z+ G; a9 ?  J) e- E$ k) C  ^ and ax,0000011111111111b9 h8 ^' l: M0 e  u1 k% A
mov base,ax
, e, E/ K6 Y1 ^- k4 t  
) J. h1 k/ r6 g5 ~6 t; N call ReadSpd, u# |1 x9 L) `6 r
exit:
4 Z/ w0 \# e. `+ Z5 _( i* ` mov ax,4c00h. z1 \7 y) N6 T% [; Y0 N3 _
int 21h+ d+ z! |. _4 B, ?5 \9 a
main endp
! C+ O' g$ F2 a' h/ [# Z( _# Z
' T+ u* H$ [" }. `9 E
4 e% C' L* P1 L. ]
ReadSpd proc- H- G4 e# v1 M6 Q8 m, b
pusha& o! p8 |/ X  z' ~" E
Again:
9 d& u# A5 q, D' c mov ah,num
6 r3 G* ^! G3 ]  and ah,00001111b8 o, S, z" d2 F$ u: I# I1 W- b9 [
.if(ah==15d) ;CR_LF
9 d! G: X% {  ^  LF_CR2 m/ I1 N7 |4 n; s6 g
.endif5 p4 @) {! o  R9 N" X$ I4 Z+ c; [
! B! k2 A% P& L
.repeat
* `7 L. Z; n# p2 a  mov dx,base   ;reset host,claim host in use
) A9 m, D- U( q/ x# p  add dx,0& I7 }+ p. y9 v4 N  |
  mov al,40h
* G/ N+ N6 p/ L& h+ k  out dx,al  D( W3 y6 Q, R% H4 w5 p
  
) `+ y; @- v0 d" V; L& l, ?  {  mov dx,base   
8 k3 O  c* y  H2 ~9 i2 M) b  in al,dx* f# P0 ~6 W  `  F2 T: _$ ?
  mov SmbStatus,al8 h" h& D0 E# g* g: u8 @
  3 u3 a9 p. o) i- ?. b# c- D* ]
  mov dx,base   ;clear all status bits
* D& ]' a6 Q* T/ x1 I) [$ K1 H  mov al,1Eh   ;host status register+ L1 e, R. q( g$ i7 ]1 ~9 s
  out dx,al
. U/ I& R( k5 C& p0 E% \5 d  
, q4 d/ U0 B0 p9 u  mov dx,base   ;set offset to read ; t* |4 q4 z8 X" ^
  add dx,3    ;host command register( m5 T) }, B) r' n
  mov al,num3 `% G3 e; M2 Q# _# j* H7 r
  out dx,al1 P; H, Q, @5 u. l: K. s3 P# M: |
  
$ F% p. v& j4 `$ d4 r9 E  mov dx,base   ;Transimit Slave Address register
1 E+ g; d; D9 g: v5 a/ r2 k8 X  add dx,4
3 K* B  }7 [+ j0 a/ c5 X  mov al,0a1h' {  b$ ]0 ~  x6 w
  out dx,al; I9 ~7 \& n3 M9 y+ T- T* v2 \- h
  / g* V( ]; g2 [6 z+ D2 l
  mov dx,base   ;set "Read Word" protocol and start bit1 |* A) O4 J. |
  add dx,2    ;Host Control register, C# x5 N0 h, I' p) g* l. F' C& e
  mov al,48h  
* L' \3 q) ~! y' A  out dx,al
) A. Z% ^0 h5 T/ q- T/ \: ] * A/ Q6 a7 \- Y, ?/ {
6 k2 W; k7 D5 d
  4 d, t" p/ c, G, q: ~
  mov dx,base* j$ `% }7 q3 O! m' n
  in al,dx
) i  D' a4 e. L3 I4 _; D. ?; \  mov SmbStatus,al$ ]& ~, ]) T; r# m* _
  and al,1Eh
6 `+ x) l/ p7 |! i/ _+ f2 P5 W  .while (al==0) ;check repeatly until any of
, D, v2 F4 R  U9 u    mov dx,base      ;FAIL,BERR,DERR,INTR$ X& b6 i! L! v9 x& W: }4 l
    in al,dx
+ }- j# R7 E3 a% b# J    mov SmbStatus,al/ q& x; j9 e' {2 [( N8 _
    and al,1Eh
8 U5 ~8 k7 V2 p0 y* b0 R9 I! }: ~  .ENDW' A8 f( S& Y& `
  ) c& T2 B& R6 {% t+ U
  mov al,SmbStatus   
7 ^  c( t" r+ `! g: K3 |  and al,1Ch
6 Z5 V# x& c+ G$ ?/ i6 k1 c8 x3 l) b  .if (al!=0)    ;check for errors  4 W2 z- k, @$ r+ @: _, _
   mov al,SmbStatus  H( L8 c" O) g, n+ I, A" a9 i$ j" N
   and al,08h   
$ y/ e) n$ D; V# k; q   .continue .if (al!=0)  
% H5 q2 j( c: C* U7 H: ]+ s7 G   jmp @F  
8 _. ?3 i0 S$ {, R9 s .else2 Y% |' @6 a) v7 T
  mov dx,base
; X( ]% @; X+ W- M! x2 v  M8 D  add dx,5h- s) `& o% n0 U6 |) B2 W! o
  in al,dx  
0 J5 \, e8 F" d+ V  call binhex 6 \( o. i' j. z' G+ ^0 G+ I
  .break
0 ~& L* R3 @: @" M. ]  o; y .endif% m& Z5 R# X8 c
  
6 x# y' ^* c7 I  d  D6 _# |, @2 M- ]  .until (0)
* S' a( ]% w; B/ h  c  3 \) p4 |; R& s1 L2 |
  F; l; f5 k% f& P% R7 c

/ m+ [; O" _' ?: `/ F mov dl,20h ;output a space
  D0 p3 v( P3 B- G mov ah,2
9 O; t# b! K7 e1 E1 }* y) { pusha
1 [* A- h% W' N int 21h* L* K  ?* u+ \' y) ]6 G
popa
- L, F4 T: k0 D& ]1 | inc num& R* d% p0 y0 v, O3 g; U

3 N! k+ l* f' f2 a0 y8 Y cmp num,80h ;get first spd 128 bytes ) S: A/ J' B* j: j8 H1 j0 Z; B3 c( s( g
jnz Again
% k8 Z5 {  W6 U7 { - P) @) a+ _/ @2 d4 H
@@:
, m- b6 K( r4 _$ U6 H- b! f# c popa
% w: a4 C) O1 `. V$ n5 x ret9 W4 d% p; p+ |, [3 t
ReadSpd endp6 w; y  N& p6 ?; ]! {& m

# F8 f+ p) y; U' y; p
7 H  k1 y  X7 Z1 n9 a/ N" t
. ?+ a& ^; Y6 u  n. xbinhex proc : ^, C$ V9 E6 \
pusha * F1 a/ Y9 C! W3 e  \( O: n

) b$ B' C3 @2 q0 s& e1 E- N mov ch,2 ;2 hexadecimal digits to be printed
3 f2 B5 I& ^7 c: K9 c" c+ E& aloop3:
/ t  F! h, K5 R6 C5 Q mov cl,4 ;bits to be shifted
5 [: L; O! e* t, _+ [+ Q- p4 h: a+ \ rol al,cl
: l7 {: V) k, v" P mov bl,al
% A; l3 C1 T. ]+ J; f# T1 s1 i; K; B and bl,0fh ;mask the 4-bit Msb
% _% I( a+ q# W6 E* h5 ^ add bl,30h
1 z, ?2 `0 E* p' n cmp bl,3ah$ _- x" E. X' @1 k/ |2 J
jl next1  ;number or alpha?
" G8 {8 m8 q9 z0 v8 ? add bl,7
) G& ^2 M$ B$ u# `1 ~7 \next1:
9 Y. g9 c! Y( \! W) {; C6 V# m mov ah,2  ;print one hexadecimal digit- R$ ~& x' v4 o3 \+ j9 R' m& p
mov dl,bl( F3 k0 b1 J: p) L9 @/ z
pusha6 R7 i* ?( H2 V* b
int 21h
) h/ C1 F3 ^. F2 K4 W+ S" j popa
6 E( t. u: F( N+ r: W dec ch, ?( Y2 t- x4 T& y) z# l; H# t
jnz loop3# R1 [# g6 [; q1 y
popa
/ ?3 T1 o: t6 ?% \5 ^ ret
3 X0 E$ g$ ]8 [" [2 j  I9 _binhex endp9 `9 Y6 L0 _" s8 {
   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-8-11 16:58 , Processed in 0.050734 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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