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

Intel ICH9 Memory SPD读取

[复制链接]
发表于 2009-7-21 09:57:34 | 显示全部楼层 |阅读模式
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
5 l( ^- B, a7 |( G. C$ C& T$ t& g; k: }3 C+ I8 t; y
  .model small5 g/ @6 {& Z! Q' Q& ~3 V& ^6 @* j
  .386
( l0 D* q" O( A" L# l  CFG_ADDR EQU 0CF8h
) o0 k' q! U8 G+ y& Z5 D* W  CFG_DATA EQU 0CFCh& a* E7 k2 I% O& j: T' P
  SMBUS_BUS EQU 0+ V. Z4 G5 j% o0 o7 P9 d
  SMBUS_DEVICE EQU 31
' C, P8 j7 y2 v6 `/ O  SMBUS_FUNC EQU 3
$ x' K2 ~! q! {    }2 p; F  ?) @' C6 J9 Q% Y. R2 Z& d
  .stack 100h/ F, W0 {1 f0 ]1 M4 E9 [
  .data
) j2 ?- F+ D! k% r( Z7 lbase dw ?  ;smbus I/O space/ U9 Y1 Q1 {, C& v9 D  b
num  db 0  ;byte select( C$ x& r$ P/ m3 `1 F
SmbStatus db ?
  ~5 _  L* {3 a' q8 H, ?+ ~) k7 S& o( ^8 F* u! C# S- }/ }- v. }
  .code, T0 D" ^, D- [, v

/ Z5 q' u8 s* P' h1 {LF_CR MACRO
+ u8 H9 C! ^) \# f$ b0 d2 e+ `/ [  pusha
1 h, [6 [7 U2 i! ?, M4 I! a  mov     dl,0dh      + y- H; j% t4 b
mov     ah,25 o* f! f* G$ m- b0 X& ?% ?! j& [
  int     21h
" o$ ?$ r" W0 ~  b) u- d  mov     dl,0ah   ;next line   ) i# {, T: \, G
  mov     ah,2
; E1 N2 s' J8 V5 C0 p  int     21h3 H$ ]( ?& Q- o0 z7 y( B
  popa  3 }+ h% r; S2 c, x$ ?
     ENDM
$ c6 f$ \' c4 j# [! o) G
" u9 @' U' |8 m3 \% W
0 w0 c) y2 _2 ]3 }5 z9 p* u* A; Q" P8 b! Pmain proc far
& x2 }  b/ s( I5 z mov ax,@data
; U. M& r$ _* q mov ds,ax$ J" ~2 b# ~' a, P$ T  J

! ^  ~8 H; `2 b; K7 D mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h# F* p8 h* W/ h4 R
mov dx,CFG_ADDR
1 {) E/ K+ r$ j% x6 ~0 e out dx,eax1 c' x' w6 E1 k7 J( C; a" c9 \
mov dx,CFG_DATA
# A% e, l" ]* J, V in eax,dx. P$ P0 ~9 h7 V! l% |$ g8 [; {
  
+ e, G2 h, x4 t& c) R shr ax,5     ;bit 15-5,the base address: i+ Z! m( b2 l* w9 ~, b
and ax,0000011111111111b( u7 W6 r! l% E. r# R
mov base,ax
) @9 E! |6 K( M8 C7 V- `  
& e+ u, ]# L6 S( ?' E( T4 q call ReadSpd( _, c; _( h  o" m0 K2 W
exit:
* f, j9 {" I. T/ X. _# o mov ax,4c00h# {9 Y- O: n( Q) ?
int 21h
7 V' ^5 M: f- _4 M2 B( Pmain endp5 `1 i8 h% _2 K5 \% f/ x" q5 G
, F! P3 q5 O8 J+ `' L1 p

0 @/ r9 Z  _  j- x+ J+ g6 d( t$ D6 U  N2 K, A, R( b7 e
ReadSpd proc
  l% p- x7 r" D# C( W pusha
! F' e3 f8 A. {3 H1 h: P$ JAgain:8 G% ?( _8 n5 x7 `7 w
mov ah,num
+ o; N' o% T& k  and ah,00001111b3 P1 m6 ^  R: X, b) Y. O9 w. \
.if(ah==15d) ;CR_LF
; a. M) o% a5 C1 b% b  LF_CR3 P# |  y  I& M* T, u/ b2 ^- m' x
.endif
$ I- K( a. s. Q, F6 i* G4 G& s! M5 e
  j: A6 j' E: U9 \6 D1 ~ .repeat8 `: I4 S  y! y4 y1 k) F8 t
  mov dx,base   ;reset host,claim host in use
: }) J  Q8 n5 X) z8 {  m8 n  add dx,0
* {2 i* `( }0 E3 e' ^1 w( S; }: S8 ]4 Q  mov al,40h6 H. ]3 o! y& G( E, s+ h
  out dx,al
9 `/ f! T7 Y/ Q1 a8 o6 d  0 j1 E" A$ f% q2 H" r* u8 Y- k
  mov dx,base   
4 H% W1 n0 g6 y: n: s  in al,dx
) {& E" h0 x0 M7 f& P  mov SmbStatus,al
1 o/ T6 z: R5 w. T8 H; j3 p: H    G- B+ c. W! V1 v0 ?' l
  mov dx,base   ;clear all status bits3 a3 v. x- p/ d. ?
  mov al,1Eh   ;host status register
; i" P3 P* t  B+ V  out dx,al- w$ o9 H% D, S" b$ `
  
! J. r& Q# `% Y+ G2 r% L0 p  mov dx,base   ;set offset to read
5 r! |, L  j) @! w7 r  add dx,3    ;host command register$ ~$ w8 q( f3 V+ I2 Q
  mov al,num
4 |  I* |8 B- w) A, G. m  out dx,al
$ }) H3 w% w) H7 u; ^8 U  ! L7 d1 C" E4 z1 L4 `
  mov dx,base   ;Transimit Slave Address register
. z; t' o$ I+ ^. ?  add dx,4
) s# n9 _* k! l3 G  mov al,0a1h. R4 i3 U8 {7 Y% `& ]$ @4 n
  out dx,al
/ C4 f4 E- B1 _: v1 @    {3 i0 H- n5 e) t8 P
  mov dx,base   ;set "Read Word" protocol and start bit
' n$ c3 _8 k; a! b+ X  add dx,2    ;Host Control register" i: Y) X+ C; o% Z) Y, @/ s! r: t
  mov al,48h  # N! z2 U* k* g$ w" y2 p
  out dx,al
9 \9 T+ W& _7 W* B 6 Z; N: F- J6 o5 x, ?+ v

+ V+ Z8 Z3 D6 {4 i  
  d+ c$ J7 }. x6 G7 {1 }* j  mov dx,base
# g3 i* T' ~* q" b  m( R  in al,dx  p0 k! }: f' C7 v, r) l
  mov SmbStatus,al
5 _% D5 q, Q; {# q* F  and al,1Eh
% B  f) h1 Y/ L. [* a7 x6 ^  .while (al==0) ;check repeatly until any of, ~  T4 H' l  c+ w7 D! m3 Z
    mov dx,base      ;FAIL,BERR,DERR,INTR9 i  e: h: Z) p1 ^* i* j
    in al,dx
- }! ^0 s6 B! s" G4 [    mov SmbStatus,al
) B( \- ~* `5 C+ ~* W    and al,1Eh
" q! k) P! Z9 A; R  .ENDW
  C$ b6 e( Q0 C" u5 r  & `& K! L& h- j, F* W: p
  mov al,SmbStatus   3 T4 Y9 l1 Z, c  Y& ^/ ~+ W
  and al,1Ch0 [, y4 w, V. A% W
  .if (al!=0)    ;check for errors  
3 b- k0 c. l; J9 m# n1 u   mov al,SmbStatus
* V$ f8 O, I" R( f( r   and al,08h   + ?' f; K. X- Y$ M5 }
   .continue .if (al!=0)  9 s5 d& S: q8 `. M9 Y0 ~" \
   jmp @F  . s" L1 y# K' G6 e) T2 t9 b
.else
0 x3 j2 h; U0 @- x1 ?% }  mov dx,base
2 K; O, e5 U+ ~; w* b2 b  add dx,5h) _& O" v0 x# S3 p2 N
  in al,dx  - I7 l( _3 E( Q* N
  call binhex 6 E0 i9 |9 F7 x4 n
  .break% ]1 S% m( }1 Q3 o
.endif
5 o# s( v; V( V6 G( w; X* O  2 }# l: |5 U9 q9 [
  .until (0) * `+ P1 m1 N- L/ n
  
# r8 G+ X9 T3 Q% |& S% z
4 _* r% o: q7 |! a
3 q! d) l9 {! l0 t, H mov dl,20h ;output a space
3 @% b, l* R) P4 E& s, ^ mov ah,2
! P+ s& {5 ?- j. I pusha4 r) q$ u2 b3 l7 _4 B
int 21h
" D+ z& Y! c9 h! ? popa) h- y0 U0 P0 H) a% s
inc num) o6 v$ `* e! l

" h5 X1 M/ W% a9 E cmp num,80h ;get first spd 128 bytes
+ j7 t: z, f/ W) G: k jnz Again5 P5 n; @8 `2 k/ M- G
& l3 n; y. D* ~3 P+ Z, N! \/ r
@@:. p9 [7 Q3 Y% k: m
popa' H. }! y& `+ T0 t# Q
ret
3 }8 _- Q' ?1 W* |ReadSpd endp2 p; _2 f% m2 k  z5 Q& n9 I
+ N" l$ t% ]5 R: o
9 [# J3 G5 y# z# o" _

% i) U; a2 N% Y4 n8 Z. sbinhex proc ' O- _8 S( _8 J3 _( S) t2 n
pusha
8 e: J& |5 _2 X* z  M$ F3 m9 s% Z 9 M8 C: I6 s  n& C
mov ch,2 ;2 hexadecimal digits to be printed: |6 k( l) X  Q0 q: [- G/ v
loop3:, t2 O5 [9 M* D. h# k
mov cl,4 ;bits to be shifted$ O+ g: _! S4 h  X' X  A
rol al,cl
" N2 ~5 f9 h  R  ]& t mov bl,al
/ ]0 S7 D- R5 Z. h and bl,0fh ;mask the 4-bit Msb
; _  p  y/ E: K- o/ b& Q1 [; K" s' R add bl,30h. V- ?6 L2 f# _" ]! ?
cmp bl,3ah" U  p- \$ q4 L7 C, d* y  x
jl next1  ;number or alpha?
0 P4 ^+ R" @! [! x add bl,7
6 y8 f+ j" F$ G7 nnext1:
/ S2 M/ b) U; m/ f- E5 S; n mov ah,2  ;print one hexadecimal digit
" I9 E. ?3 E9 b2 Z. Q0 T mov dl,bl
" C: n* H$ X% ^+ S) s pusha+ x. V" F! U$ W9 w' r* j* L- U) c
int 21h
" A- a% F) {8 N. G5 h% K popa' y. X. v# I$ T' r0 h9 X5 ~
dec ch
. p! U# e' X6 g/ `& x jnz loop3
+ c3 H  v  d7 ?9 L% A( X: I# J% S popa
, z) h( t5 g( z' D# \0 U+ n$ w+ R ret
- [6 t8 z7 S- @binhex endp
8 N0 d2 Y  t5 n9 Y3 x   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-11-4 00:35 , Processed in 5.681353 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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