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

Intel ICH9 Memory SPD读取

[复制链接]
发表于 2009-7-21 09:57:34 | 显示全部楼层 |阅读模式
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
2 B& ^7 h2 m1 j2 V
/ S5 S, G* i; K6 b. l2 l& x  .model small
% F0 @" h! J& I8 ?+ f' ^9 X1 m  .386
1 F# E! v- l* w6 K9 C  CFG_ADDR EQU 0CF8h
0 D) A6 M% |/ s( l, Q- L: y  CFG_DATA EQU 0CFCh! D. F2 `. T5 s1 X5 Z
  SMBUS_BUS EQU 02 i  L1 s+ Z" V8 `8 |
  SMBUS_DEVICE EQU 316 c& y* ^! a2 p  }# }* N' C2 W
  SMBUS_FUNC EQU 3
) O  e1 X2 g1 d0 \' k' f6 f7 Z  ! |2 d: O7 j" l- O) ~$ U1 T
  .stack 100h
* L- ?5 R, @0 K$ C9 T( `( G1 Q  |% m  .data
$ |4 i" E( t* ]% `" ~base dw ?  ;smbus I/O space9 |& d6 ^  T) Y
num  db 0  ;byte select
9 }" R# D# h# xSmbStatus db ?' [! g# @- t# C) M5 t6 o( ?0 G
$ f; t  A; y% U8 V
  .code
9 _& O. N/ c& c  w ) I9 K1 F0 z6 O  W4 k
LF_CR MACRO
$ W% s& w) m  B7 {, a; q  pusha
' g! e8 a# a$ V! ^" y2 k6 k  mov     dl,0dh      
6 E$ [% J6 O3 d7 b+ ]. B mov     ah,2
- i( D' s- T" _. S+ r  int     21h
- m; c+ ^6 H4 _& e% R# C  mov     dl,0ah   ;next line   
7 P7 B4 r5 m6 M- N6 A8 _  mov     ah,2
3 i  m% ?/ [" a5 e3 }3 I8 O2 C, v  int     21h, d" b% L1 \6 M& P+ c
  popa  
1 R  e8 y- W' }9 ^1 k" @     ENDM( E8 ^* \+ P% z
; e2 C" t- t8 }! S2 \

3 S* {6 F- c" d# R3 F3 p1 imain proc far+ S/ Z3 W5 H  c) ~4 U8 Y$ O
mov ax,@data; J! m( H, q" o! D# ~+ ~4 x- \
mov ds,ax
6 T9 X4 W5 Y) ]1 p4 M * _7 Z3 q, o/ V$ P# i0 y$ {
mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
8 d$ O; H! t% x8 ], p mov dx,CFG_ADDR  `$ e/ K* a: R  ]
out dx,eax
5 N* c1 W7 S  v/ f mov dx,CFG_DATA
0 S+ X' `4 j# h1 A in eax,dx
& ^' o7 n: B0 P  
% g+ U; e6 {* Y& C8 N5 Z1 e shr ax,5     ;bit 15-5,the base address
! j# S" Q8 L. w/ s; D- ~6 _ and ax,0000011111111111b- c3 o# a. N6 Z& F( V! @' r  X6 Y
mov base,ax
/ i3 Z/ R5 Z# |, Y3 M2 X/ t    l$ v' |1 {0 Z- a0 P4 S. b1 s6 V
call ReadSpd
2 C4 ?: [/ H4 U: d& kexit:
- c- H. [' u8 `$ E- { mov ax,4c00h
6 Q4 h$ v/ n2 h4 ` int 21h
# u& ]" ^- K$ E1 Wmain endp- B, G/ z6 e9 h! B" L3 K: o
/ a5 X0 j, Y+ |/ d* _

' A: g# M- g) k- C- ]9 e
9 G4 S. |3 s9 p1 q& o/ m+ \ReadSpd proc
/ B$ s/ O% R' g- M! A& P* g pusha
" e. ^2 L5 ^8 S: w# yAgain:6 C7 Q, y: y6 j1 R
mov ah,num
- K' `2 Z/ M) A# Y  and ah,00001111b5 x  m! \& S& L1 z0 \2 w  B! h5 ^' O& x6 Y
.if(ah==15d) ;CR_LF
& i: J4 G2 D# y& {' M" F  LF_CR0 b4 a9 y  j4 }& I) U% F# S; X% l
.endif
7 Y' S7 m1 Q6 D# g9 W ' _# Q6 i9 i+ Z* L( P
.repeat0 D. c5 O7 j" A
  mov dx,base   ;reset host,claim host in use, i  k0 k2 F' J
  add dx,07 a1 M% w! k/ D' v
  mov al,40h
1 r! S* X, y% R! ^; R4 V5 w  out dx,al
+ n3 f  r9 a( r6 k" S9 Y! [, `  ; n$ U4 v* f0 j/ Q! u; N
  mov dx,base   
4 n( {1 v0 o$ f, O# D  in al,dx- d5 E! D( F% Q' |$ a9 m7 K6 s
  mov SmbStatus,al) Y/ @9 u& D  [9 F* ^0 i5 p
  ) }# g2 Q3 n+ Q! Z
  mov dx,base   ;clear all status bits
7 o1 ?' u4 n- B8 s, o7 N  mov al,1Eh   ;host status register
  D5 ^- H! E/ s. _6 z$ e7 C* J# S  out dx,al
; n, {" t4 f# J1 x" D1 ^  & H# s  P* n4 ?9 W) M! a
  mov dx,base   ;set offset to read 8 Y6 ^% u* J+ l' l, Z6 |9 b
  add dx,3    ;host command register& m; k8 |, l4 B! Y3 @" e# m/ Q
  mov al,num) f2 G/ w, R0 @. b# @
  out dx,al
3 k3 b* j' p3 L8 B+ F, e( N* f* u  
, l0 A' R. B* ~% O/ h, C  mov dx,base   ;Transimit Slave Address register9 N6 T9 E; N8 _7 s9 ?0 ^
  add dx,4+ |$ @  A1 \1 p" C( V5 e
  mov al,0a1h9 V' r) s+ A& A, t/ K  ~/ @+ A# u
  out dx,al
9 j" M4 w! [# C, R  / V8 x& a/ {2 _( N9 T2 n
  mov dx,base   ;set "Read Word" protocol and start bit
; i$ Y( U) N8 t; i5 a1 ]) v  add dx,2    ;Host Control register) t+ E; |0 O5 P- U% D' @
  mov al,48h  : e0 @1 a3 {6 }
  out dx,al
" C2 E7 G) r) ^% {: F, l" r& {6 @  s0 ^ ) H8 l& x, w+ S% @) a

  h0 ^# E: N  l6 H$ }$ X  
2 F! @/ y7 \6 J- h6 o  mov dx,base
3 I7 ?. B9 c$ r+ G' ]! F/ N" H  in al,dx
9 Z2 Y4 G: Y- @  q' Q* S$ `/ K  mov SmbStatus,al
# O% P% ~- u" o% P; j; d' g9 y  and al,1Eh  V, n6 r" O0 U. X1 ]4 u) S6 q
  .while (al==0) ;check repeatly until any of
! }3 P$ p+ _* o# K  z    mov dx,base      ;FAIL,BERR,DERR,INTR
" ^* p( h" `/ N. q0 A( F. w    in al,dx
2 y) x( C+ O5 y/ O/ s) T/ K    mov SmbStatus,al) B/ |, ^& L+ [+ C* x
    and al,1Eh ( ~/ U, u7 \/ S7 b# l
  .ENDW
7 Y1 B) H8 N* e1 V7 P: s  
' ~5 |& w  A( K' i0 V. J( W  mov al,SmbStatus   / a  L# E! [# H) U. _+ |
  and al,1Ch
# n# F5 |. K' }0 ]. {8 G$ v  .if (al!=0)    ;check for errors  
" C/ {1 _# m& T, g& l$ Z, L$ d+ l* B$ ?   mov al,SmbStatus
9 s* n* p0 u9 |4 h2 {3 b& f   and al,08h   
! e' @. K% w( L   .continue .if (al!=0)  
$ ?" T  ?8 [, F& `, p& |   jmp @F  ! j9 Z# j+ [3 Q, `4 A
.else. e- D) Q* f% ^4 H2 O- Z1 ^
  mov dx,base# I+ ]# f8 y# `& a0 L
  add dx,5h
0 a5 Q) f3 v3 ]" |8 O' a  in al,dx  4 G: x1 C6 G1 i' C: O3 C" `
  call binhex
- ~4 i* L  P" x/ {- S  .break
7 T. c* @/ S( c! _- |% m .endif
& o! _! \+ H' y0 [' ^( G( I  ; \! N4 x' M- u# Y. V3 Y( H
  .until (0)
8 Z! i+ {' W/ x1 _! A  
2 R. j; d) l, E, {3 k1 M6 T8 T
9 p. C. G( J& |, s0 \ 8 F4 ?3 Y; G+ @; b
mov dl,20h ;output a space
% ?9 ^: s- j! p& b mov ah,2
! b1 O! k/ {* x2 O! x pusha
0 ?# W' Z' x$ F8 u9 b int 21h
- s% b% K; y0 l' F5 q: r+ h popa
$ q, z" Q+ n+ T9 B! X& O. A inc num
3 N! s$ h( c' H( J: H0 ]/ k$ k$ O
cmp num,80h ;get first spd 128 bytes
$ K  O' O% M( K6 q/ G9 o jnz Again) {" Y: [# n. T* A7 G
$ |2 F3 O, |" p5 f& J1 @' D
@@:$ g! O. t5 ~4 J3 c. m$ @
popa
" D" @, V1 ^4 J" W, ], ]' O ret, w, X! Y" b" O  ~
ReadSpd endp
* S3 J4 F# \9 p- ~& j2 x: ]6 Z. l2 h% V- J; ]% U4 ?/ M. r0 B' W

% v3 G- r' n5 k0 G7 C% i4 I1 T# U8 X% T# B; I
binhex proc & n9 {8 l# U& S! q
pusha
" }  g8 t  D& x, I" Q, J, v" Z / S8 W  q3 i" {7 v
mov ch,2 ;2 hexadecimal digits to be printed% J3 p( J9 L  {* v
loop3:" w  M! B& U- v8 y
mov cl,4 ;bits to be shifted. K9 b9 r. l1 e4 @
rol al,cl9 N9 g3 c  u' y6 W" K
mov bl,al- j2 `/ q. B4 c: p0 L( f4 D, ^
and bl,0fh ;mask the 4-bit Msb
; r2 d  E- G! Q2 e/ Y add bl,30h
6 c. a' h' v' A& \ cmp bl,3ah2 X* v9 S' R1 M
jl next1  ;number or alpha?4 s. K1 Z" O5 E1 J2 j. I
add bl,7 1 |# k; v! |( `) J9 R, j9 p3 D
next1:
+ _3 \. F( a3 B) F) b2 C8 f mov ah,2  ;print one hexadecimal digit
' P0 u8 F- G: o7 L+ J mov dl,bl, p1 I1 A- r9 Q
pusha
: Q: L7 ^/ ^% I6 X int 21h( Q3 v  D8 H3 a2 M, K% r" e
popa
$ g0 i" H& O5 a5 n5 ^4 i dec ch& ?- o; [0 x2 u  G2 t! F
jnz loop33 Q5 Y/ b' u" s. {' u% t
popa8 y2 ^3 i8 C* B% m' J
ret* P( h1 k3 v! q
binhex endp  R3 _9 Q5 J3 ]+ i$ u8 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 08:34 , Processed in 0.121325 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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