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

Intel ICH9 Memory SPD读取

[复制链接]
发表于 2009-7-21 09:57:34 | 显示全部楼层 |阅读模式
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
* P8 B) k3 I+ b
0 _$ z' f9 E% K' G; v7 U& t# M  .model small
4 m+ g+ v# a8 O. C# A  .386
; q( f1 _0 x$ A) z/ W4 e  CFG_ADDR EQU 0CF8h
) t. {9 f+ l' h+ K& y6 w; p  CFG_DATA EQU 0CFCh
- I5 }/ E& M7 Q4 G8 [; J  SMBUS_BUS EQU 0( O  G" ~% H. W* {. `* D) H
  SMBUS_DEVICE EQU 31
. n' V9 x% n2 ?6 q6 \6 X6 ?  SMBUS_FUNC EQU 3
6 R$ e; r  R; F  T# M  6 [, E( L# ^& b, ^
  .stack 100h
! u# u1 v. Y/ o$ H+ o* Y  .data
: V/ u) U0 g, _2 s4 k7 ibase dw ?  ;smbus I/O space, m9 L, o7 x! b, B( e; L/ o
num  db 0  ;byte select& w  k7 p/ ]5 @
SmbStatus db ?' W0 h7 y+ s* ~/ ^: l# @# F! p4 o2 g/ }
0 Y( ]/ l$ r/ L6 Z# F. ^9 T7 S
  .code6 g! F% U% B1 g

& ~$ `+ _- t" w2 U' F0 [LF_CR MACRO1 m* b8 D3 |, u3 M; {
  pusha
0 i9 Z/ _& i& k/ Y: D  mov     dl,0dh      9 r8 U$ T* F' K( E
mov     ah,2( j4 L* Y; E  ]' Z& |# J$ H
  int     21h: e1 T" W! t- w% n
  mov     dl,0ah   ;next line   
- O1 O" t( w5 L. b8 W" _8 P+ ~  mov     ah,2; {/ w- s  W0 H2 m
  int     21h2 n5 X, x. s( t# t
  popa  
* N" ?8 ^9 e3 x* I     ENDM
% s2 @, B, }0 q3 p  u( f* H+ m. E5 [% D/ _! z1 u% v# b
# _; x  |" D6 g
main proc far
0 G) S8 Y) H( S6 o1 t5 D% D: r  o mov ax,@data. K4 X* ~1 `4 D" P
mov ds,ax9 O* q* q2 U1 D* x! ^

( C% h1 A* i9 U3 ~  k% D mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h+ U0 f" m, _4 W' k' m- e
mov dx,CFG_ADDR
* \9 F! f+ S! Q out dx,eax, U* i7 Z" |! e9 ]" i
mov dx,CFG_DATA5 e; q; d( r# p! t7 P. z; y3 ]
in eax,dx
6 Q9 x; |" v( f8 g. ^0 X5 c- l  ) g9 T7 Q, y7 ^/ @
shr ax,5     ;bit 15-5,the base address
! i- D3 S$ C8 j5 y& _8 b2 v# [ and ax,0000011111111111b7 k9 K9 |$ l, \. }+ U4 `
mov base,ax, o( j& L6 p3 J# N9 v, G: Z' c
  
; f4 @+ o3 t% }- P: {, X& K call ReadSpd$ \$ B' b/ R5 m6 i0 |
exit:: R# Q* R% ^) j  X( q0 l  n- k
mov ax,4c00h
0 K4 I5 u; {, | int 21h, n  J) M5 R8 i
main endp
$ @9 U, y; I. E6 d3 W) R. w
/ b& q7 S0 n& v( [5 K1 Q* Z3 w
: A. P* Z9 z! {, ^7 L, H/ p& Y
; S2 F* ~+ Y/ I5 JReadSpd proc2 s# i* F+ U* w
pusha. m- d8 k" O# X& V7 X4 k7 v4 E
Again:6 M( b5 D% n4 V# n5 A7 I8 R
mov ah,num
7 J+ Z4 g9 r: f% I$ _7 s) u8 M! C  and ah,00001111b5 l6 T+ T# i$ f
.if(ah==15d) ;CR_LF
  ^; g- q% J. [4 ~7 B  q/ m2 g  LF_CR) K7 i% q1 T: H8 B$ x
.endif
% l1 F  N  k3 _( d& C1 y $ B9 Q# y  g  J5 I3 S/ C: X: y
.repeat
. A" X. K8 a) A7 ?6 L7 k. X( m; C0 ~  mov dx,base   ;reset host,claim host in use
1 S7 H9 i/ O6 ?' H9 Y% Q( A, x# O& X  add dx,0, D: s5 P, }- Y- K" @$ U! F
  mov al,40h
0 q/ i6 m3 e' I/ n  A6 d8 l# B  out dx,al
& k: p5 R/ X( k5 n7 A7 v- x- ~! \  $ E1 U4 C8 l8 U
  mov dx,base   8 W+ l( i" z2 F; A! j: o  a8 u
  in al,dx. _: ^# f; m7 m2 X
  mov SmbStatus,al6 F" Y) Q( [* H2 C9 |: z7 N
  1 R8 O2 z0 |; ~
  mov dx,base   ;clear all status bits
" C6 Q+ [5 e# ^) S7 E  mov al,1Eh   ;host status register% J9 @' b, W# J! q. Z# A
  out dx,al
' r) g$ A8 ^  Z  4 y6 q- \- x' p( Y, p. f! o
  mov dx,base   ;set offset to read ( X  P5 L; t* l2 F% z% \( Y1 ^( x6 _
  add dx,3    ;host command register
. A, {( j6 m; j+ `  mov al,num
0 v+ E  Y0 w" W0 {! a) h  out dx,al/ F: Q1 n$ j$ f% ~  A
  
6 o5 E/ N) T( H9 t6 ]  mov dx,base   ;Transimit Slave Address register
6 A0 M0 `( p; C- x! |  add dx,4
# b" u) w, u% M. |, y" {  mov al,0a1h
4 j9 C( p$ _' g- q$ E% `  out dx,al) k$ S9 ^9 ]. i" E2 }
  
# H$ C0 V- c/ T. m# C  mov dx,base   ;set "Read Word" protocol and start bit
0 L8 ?1 M, h4 E+ [& L; ?- |  add dx,2    ;Host Control register
' h2 j" l% p% B8 N  mov al,48h  + t/ B. p$ E) M5 \
  out dx,al
: H# |, _& I* K; {* X- ^
7 {1 Z# L$ J1 g5 w6 h7 Z3 `9 b' x2 x( g, h) ]) R
  
. n' E4 `9 k; H  b) f+ Q  mov dx,base/ V2 C7 s* n* V7 Q+ a1 o1 }/ j
  in al,dx
! Z( t/ H0 r! o7 U# _8 |  mov SmbStatus,al) d8 U1 g3 C- Y! U
  and al,1Eh
: w1 O) J) k. e. M  .while (al==0) ;check repeatly until any of
6 |4 `9 J' f: b( `# j: Q8 E% o; g    mov dx,base      ;FAIL,BERR,DERR,INTR, c9 y, s& `4 u6 y6 m6 z
    in al,dx
% d& Q- \/ o1 i% x; s1 K( G    mov SmbStatus,al
- C; l1 Y& v* `% k$ x& e2 {    and al,1Eh
+ g, l9 ?5 x' A! m; Y" d& D  .ENDW1 m- a2 l/ j$ e0 `: K2 [9 }
  
! B1 G" X+ q" L. K- C, W: h' p8 ?  mov al,SmbStatus   
/ q1 {% i" @; h6 u  and al,1Ch. |" f3 D" Z; H4 X
  .if (al!=0)    ;check for errors  
4 Q" e  t) [+ `   mov al,SmbStatus
2 h/ G& n; A2 D   and al,08h   3 n/ ]& [3 Q5 |! I- m. K
   .continue .if (al!=0)  ) `( r/ Z) p( V3 P6 }, |& C
   jmp @F  & A" D+ L  v( j/ U
.else2 h! q8 ^4 Q+ R
  mov dx,base8 z$ a+ v6 f% S4 D# K2 _
  add dx,5h+ f4 J" ?$ \# U' L5 k
  in al,dx  ) X, |( U* y6 R3 l! B2 ]" L% s
  call binhex $ \3 r! `# o' f; j1 Z
  .break
& {; t/ y5 o; Y  |& N/ ^ .endif! |5 n+ }9 w5 A" S
  , k8 T- t8 f: z
  .until (0)
# f0 V1 k  p9 x* @  
+ g$ O8 w; S2 k+ L+ f
- \# y" O. O" q) \) e' Q: e! N& o
3 y! E5 Y, v3 r% I2 B mov dl,20h ;output a space+ v# I7 }% D2 m& _
mov ah,2
$ s* l) B  B3 o, U& n. H( V pusha; }& G4 m0 p& J# k6 O
int 21h
) Q6 i+ o' j8 k# B+ F8 y popa; p3 g! S! b8 k8 d4 l3 z0 B
inc num
1 {7 D3 W; z9 N. G# j+ Y; N5 }& y) s" M" k3 S
cmp num,80h ;get first spd 128 bytes 3 G. B$ y; L5 r5 Z# [% K8 R9 h- T' A
jnz Again
$ j. f& n4 j* P' e2 i! @5 R# A  e : X/ C( b  z" _9 b' q* z
@@:
& o8 _8 T/ C4 h$ H/ O( o# m popa
* k, o9 M$ t/ ]1 D- r) w ret
- Y3 l% X1 ~; o: M! M! mReadSpd endp/ ~9 }! [+ a8 e" O% j* N4 h) d

5 T  |. w( O* B8 Z( C" H5 H; {3 s1 \+ h! b

% ]' w/ d# |( b1 m$ I5 ~/ d; Sbinhex proc 1 l; J) I6 L  ~' H  ^! n
pusha ' Z/ @- j7 y4 B& P, B
4 @+ Q. K' c, U7 a" b6 b. K, R
mov ch,2 ;2 hexadecimal digits to be printed" u8 x7 m: G7 P4 d/ b9 ~
loop3:! Z4 ^2 g. ?6 Y" ]4 |
mov cl,4 ;bits to be shifted: ?% u/ ?; S$ H" x" f% L" T6 ^  F
rol al,cl
& F* B7 ?* [/ T1 L  @( f8 J3 h mov bl,al3 U& P( X7 w% M5 M; \# E- h! x
and bl,0fh ;mask the 4-bit Msb+ z+ ]. f4 S3 v1 T& ]
add bl,30h
, `% b. S* U( o9 n cmp bl,3ah
0 M5 J9 D& P! A7 ?3 z' y5 o# D jl next1  ;number or alpha?  k4 q0 p  f; w, p+ I- n& @
add bl,7 9 s! q4 ]9 N$ i6 _3 N
next1: 1 g: \# Z" f, E' h8 w2 K) ~. t
mov ah,2  ;print one hexadecimal digit
5 Y6 y3 J, N1 ^5 H# [8 T mov dl,bl. K6 ?/ N) l1 Q# X8 e
pusha
  }/ z! Y; `9 L* C0 q4 f int 21h9 `& V5 k% c/ x0 t# j! \
popa* S! V2 N" ~3 @. j2 @" T
dec ch5 B9 x+ S7 T  O8 c  ^
jnz loop3; l% r& C8 R8 E$ @+ C- S
popa
9 S1 g9 L' V4 [: k+ k7 Z ret% ^* R1 Q% o, \  z
binhex endp
- l2 K$ w, h% s3 F   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-12-1 09:10 , Processed in 0.071901 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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