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

Intel ICH9 Memory SPD读取

[复制链接]
发表于 2009-7-21 09:57:34 | 显示全部楼层 |阅读模式
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下: : n* w$ a  U& d4 Y; W7 j/ b  K

/ M* X# H% z1 L: t& ?. i2 r  .model small
. |+ o4 C7 N$ R) [1 c  .386: h1 U+ T2 o/ B* S1 Y5 P' R
  CFG_ADDR EQU 0CF8h* X, ~" A4 t7 X8 k
  CFG_DATA EQU 0CFCh% q: `+ @6 e$ A; V. ?6 Y5 `  L
  SMBUS_BUS EQU 0
$ c$ U9 a1 P3 ]  SMBUS_DEVICE EQU 31
6 T) `+ v9 _9 E5 S; `& W' Y7 F  SMBUS_FUNC EQU 3
0 R% m$ W" p# c! C  ; r  D4 u6 Q! v  J7 N" g
  .stack 100h: m- y% i0 N7 `. S, w
  .data' A  |6 I: U7 Q
base dw ?  ;smbus I/O space
( ~( J1 o2 _0 w: `5 H/ O; t% F6 Anum  db 0  ;byte select- m* k" _5 p( Y
SmbStatus db ?
- ^  F% Q" e! ?, [8 P; e" Z0 e* ~: C6 O
  .code
! G, K0 O$ l6 S. N0 m: z2 e2 s ; s5 V4 J0 }& r% i6 o
LF_CR MACRO1 j/ {2 L9 N) k: L
  pusha
  h; ?* u$ J9 c7 T; O$ [- r; m  mov     dl,0dh      * j7 t4 p$ |5 y' V$ ?1 [* `  Q+ V9 B
mov     ah,2
* Y' t& S( d- A$ p9 L0 r' n3 C  {  int     21h
. x- P, `% X. N0 I3 |+ T  mov     dl,0ah   ;next line   9 x2 I3 d1 H$ F7 C2 E
  mov     ah,2+ f, a% v' _5 [5 P# S! |6 u% w) H
  int     21h' l$ b$ O7 a/ E6 W" L' |3 F
  popa  
) L- W% x7 s! o1 s  o" H8 [2 B( w; a     ENDM
* w8 V) k+ J8 p0 `/ J. C9 \0 C! |: ]7 |! O
; O; n: R' y7 v6 B) R
main proc far- }7 {  u8 R) T) T  ~
mov ax,@data: [6 f' j; w; n6 F  }* e2 k- G- M* J
mov ds,ax
4 d5 e2 ?. L- A. g+ T, \2 h: F' N! E
0 _$ ~. Z/ U  K; X mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
, i2 ^, y2 g! s8 l: ]7 G mov dx,CFG_ADDR5 l+ }  _+ V  [# O- h8 @
out dx,eax$ ^4 N6 e  Q; C+ V3 i
mov dx,CFG_DATA
( Y% P5 ^6 y) v( R0 i in eax,dx5 e1 G4 y/ i2 B# l  C. C; N
  8 Z* K2 M; Z& v2 \, g, ?' _. B
shr ax,5     ;bit 15-5,the base address
" h$ c; ~. ?; ?* ^% v; x and ax,0000011111111111b
5 [2 ]' W3 o$ p7 x mov base,ax
- k; L' @$ i0 y- U, }) }9 j  
9 [  s' m/ t1 K* T( t call ReadSpd3 i3 {4 ]  @! ?1 M4 F
exit:
7 }% }( `- ~3 p8 J mov ax,4c00h
% {) N5 D& |8 d9 h& S/ K* @9 b int 21h
$ ^- s$ u* N0 U+ Kmain endp
# ?% Y; E0 h( }7 @9 C( v0 ^6 M$ z" ~
& G1 Z1 _, ?0 P. Z2 v) r0 D
1 D# C7 g# A8 \" k6 @
ReadSpd proc
+ I9 Y. K7 f  Z  A8 u6 A9 c pusha
2 q5 M& }# x; C3 O  [Again:
$ H+ F# A: w. s* R7 y3 e mov ah,num
! l' _" Z$ U0 J8 {8 ?5 {# b  and ah,00001111b/ R! P# G& p4 j
.if(ah==15d) ;CR_LF* _& Y7 G4 v6 N
  LF_CR% i9 t$ b, X2 p1 T" I% c+ e
.endif
: c" u! F  S& U+ E) c' S0 [3 h* y  I' M
% d+ [+ W8 ?3 N, b) y- _ .repeat
& d* X' I  h3 h* E1 ]# ^* S$ e; y8 t8 u  mov dx,base   ;reset host,claim host in use3 c. z- w( }0 ^/ g# n! V
  add dx,0+ S/ N3 D& t! P+ z2 x
  mov al,40h
3 ~6 W2 Q2 `; @8 ~7 [1 z  out dx,al
: ], i8 t) N) ~) E. n  
" E* }) w+ @8 ?- z$ r) j1 _3 |/ n  mov dx,base   
* n# |% P4 R. O  in al,dx! ?( S. l# t$ D/ W4 d
  mov SmbStatus,al( s% d  q- L2 z: m; m
  ) d6 O& Y/ Z+ x' Q6 ?
  mov dx,base   ;clear all status bits8 T  C% w% I& p% n* Z* P4 e
  mov al,1Eh   ;host status register
( J% `. N' l5 k9 N" G' M  out dx,al
$ d$ ]# T8 B  Z  
7 z& [4 m" `! g- @5 r, u: {* u" ]  mov dx,base   ;set offset to read
) A4 g* u3 i/ B7 Q% ~  add dx,3    ;host command register
/ o  R( `3 Z6 a: ?  mov al,num4 ?( I0 Z: C/ N$ [) D
  out dx,al
8 N- V0 G5 D, E: K. g- A  / s& {1 j: r# U+ Q( j+ Z& n  p
  mov dx,base   ;Transimit Slave Address register: V0 F2 N' w4 `' N6 `- n
  add dx,4
/ B2 @* s1 A/ f8 v  {  mov al,0a1h
- ?+ T3 _; f+ a1 a1 H' {  out dx,al" B* B" \6 Q' d! Q3 r2 k7 n
  ' [9 N9 |$ b9 q# p% B+ J2 e
  mov dx,base   ;set "Read Word" protocol and start bit/ X: K$ n3 _: ?: O) w
  add dx,2    ;Host Control register
7 L8 o/ ]# i4 u  mov al,48h  
- A! _: h; f/ D- }  out dx,al
2 z, w8 ]2 k8 I0 z9 N
* m- q" A/ e' s- ^2 {
5 T3 K6 Q3 L4 @3 d. i  A! o  
$ w' O- O# ^2 Z" B: d/ m$ V  mov dx,base
2 h6 T" L! ^- Q; n" V: H) U  in al,dx' F8 p7 y1 S4 G( k' J* Q4 _
  mov SmbStatus,al
; q$ ~* q$ R* {8 e- G2 x" a, a7 e  and al,1Eh
/ {; `: z6 G! R9 R3 w9 X  .while (al==0) ;check repeatly until any of$ P4 _9 `. v: g
    mov dx,base      ;FAIL,BERR,DERR,INTR
4 ~- b9 |, z) Y+ D& @    in al,dx& @7 d3 H, j8 @, Z8 k0 k5 V1 x
    mov SmbStatus,al/ o+ \' m: M4 J: ^) R$ a0 q/ b! z
    and al,1Eh
% W+ }, `/ {  [7 C2 L" Q. |( P  .ENDW" j$ n- o3 f5 r/ g/ ^& H$ f
  
! f; ~9 V, F) {, Z0 S4 S1 @  mov al,SmbStatus   
/ H( `/ u, t( {1 \/ |9 a  ]5 f  and al,1Ch( O0 O4 v2 |' {' e9 e0 {& v! z- g
  .if (al!=0)    ;check for errors  
& C4 Y) I3 K# M. l   mov al,SmbStatus
3 p% t3 f1 b( E5 {* o, y   and al,08h   
8 a3 W- q: V8 ]5 Q# N8 @   .continue .if (al!=0)  ' t4 r2 E3 C* F1 G( ?
   jmp @F  
% ^! B0 l9 `: q' I& X5 x5 R9 o/ P .else
$ t& e: d3 Y! e. @" k  mov dx,base" g+ Q2 N& }" G, {2 ~
  add dx,5h
' ?/ G# V, p- N4 x/ `6 J! N  in al,dx  
" }. t4 H" i: K, U, Q$ _  call binhex
6 t; X+ W1 ?' K  ~+ `  .break: r. ^: V4 N; y- `
.endif
2 x: V4 g* j" W) Q8 V% q  
; A- y# x# X, L, e( @  .until (0)
8 A, [. j' i/ s  J# ^  
/ P. S  K7 _& C
: N7 c9 d7 s: F6 }# K
% X; C5 m8 O3 r! a mov dl,20h ;output a space; I* b1 `9 c0 h0 S8 z+ U$ g
mov ah,2* R% V1 O( ~* {( H" {7 b
pusha) _% L  E7 |$ [) t
int 21h
& w1 O4 o0 _0 x# x8 V: h/ {8 O popa. b1 x2 v4 k: B. s
inc num' K- S& A; X* k# n7 x
) _( b, w  @) S; |4 S( C4 |
cmp num,80h ;get first spd 128 bytes 3 b- n3 J5 ?5 N: n
jnz Again  ?3 ]( M5 E- l' R7 ]5 L
! V/ y$ {* L  o
@@:( b& [2 P0 b/ h$ P% g7 m
popa
: A! ?, t# R6 f4 J# e ret
( h# u; F8 r* TReadSpd endp
- n( o" N0 X( W' `/ X5 P) _2 w8 \( A( g' h  m0 h( }9 f
: ?; S" o% ^- F' f% w" d
4 K! z6 k' ~6 p. T
binhex proc
$ d" a) v# E5 j& X3 y pusha 7 r% ?. d6 x' o- z
* A7 X* c6 M) i; `. j* K
mov ch,2 ;2 hexadecimal digits to be printed5 |9 ]& g$ N+ m# Z9 w% u
loop3:+ b% m4 M% V8 z9 J  ]$ G% b
mov cl,4 ;bits to be shifted) u" ^2 ~: D9 n
rol al,cl& k* x# B, z% _1 Y/ O& t
mov bl,al' y4 @# @% y% K! {3 ?" a- ~
and bl,0fh ;mask the 4-bit Msb& }0 g' Q/ B2 R6 o% O: c; z
add bl,30h5 X0 M# ~0 V- G
cmp bl,3ah( f7 a4 D# L; k* f: U6 i
jl next1  ;number or alpha?) q  N- g  w% O/ k
add bl,7
8 G& x6 I3 ]) Z. ^next1:
6 }  }7 O% e1 h" }  l; L$ F/ \. _; T mov ah,2  ;print one hexadecimal digit/ Y5 w) c) U0 c5 C/ W8 c& L
mov dl,bl- b4 i, p  F8 |+ A, y. m- Z& m% z
pusha
3 ~$ D2 x) N2 y int 21h! h4 ^' W2 I- Z% ?
popa, @4 D- v- ?. I  v0 k. ?
dec ch
( ~  ~1 U7 \0 g- z: w8 |0 h jnz loop3
3 g3 c' ~; Q! W' V4 D( s7 r popa6 s5 u" h( x; k9 t( J, g
ret. b; c3 @, ~7 s3 Z7 U
binhex endp. e6 y6 A  A% f& g% D8 `( l
   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-12 05:37 , Processed in 0.066834 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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