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

Intel ICH9 Memory SPD读取

[复制链接]
发表于 2009-7-21 09:57:34 | 显示全部楼层 |阅读模式
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
) J6 |* u: C* F
2 H' Y1 q! K5 E) C  R& l  .model small
+ b) ?+ V# O1 V  .386/ `4 v, E1 ^% o1 Y; U% V
  CFG_ADDR EQU 0CF8h
( P6 F% K  l% n+ Q1 B  CFG_DATA EQU 0CFCh6 G# c. x* n6 U! t* a% R
  SMBUS_BUS EQU 0
" I: V, Q# r9 a; s' z( c3 [  SMBUS_DEVICE EQU 31
& f$ }0 w  H- i" _" K: u  Z  SMBUS_FUNC EQU 37 Y/ g$ e" C& C4 ^. O
  
0 Y6 k3 j! e6 m+ c' t  .stack 100h# C  c% b: u/ u$ u7 M
  .data& d8 |. Q9 z) r
base dw ?  ;smbus I/O space& e3 ^5 s/ {' ?' D7 C2 G+ v5 H. }
num  db 0  ;byte select! [# a8 S1 I9 x
SmbStatus db ?
9 R7 L, Y, ?8 V% a$ |1 |$ I
, M! M! J) ~* w0 M$ ]. k  .code+ |# L9 j9 E# ~7 k
  C0 f4 o( t. _* ]! G% I
LF_CR MACRO4 ?  [2 `! c  N/ R/ d
  pusha
% B. @$ o. {% f; H+ v& P# y3 c- ^  mov     dl,0dh      
- p- g; |5 Y! \" @- s- y" h mov     ah,2
$ P) N* G, B8 k% s% t* u  int     21h
; z& ]6 c* z' r; f) p  mov     dl,0ah   ;next line   
: N5 K6 {) r( ?* Y& w  mov     ah,2) V- p8 R3 s4 z& R/ Z2 R
  int     21h- C! l9 Q% v7 B/ |4 t
  popa  
6 ^/ L" L" M7 I6 k# S  I     ENDM
& g7 a9 G& w' v! H! [" V3 B9 o9 A/ I, _! f

$ \" e2 e* E; Y0 F( Fmain proc far
6 O9 E: W/ |. i5 n mov ax,@data
, s' _6 @+ g. m/ D mov ds,ax
: p$ Z0 A( R9 X0 v& |+ k+ W1 L4 v% ]
4 p' K3 `+ m8 a9 x+ w mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
5 e! R: u/ C# Q mov dx,CFG_ADDR. J- i) ]4 l' A/ `8 b
out dx,eax
# q8 W& Q: G7 W/ E1 E5 ~ mov dx,CFG_DATA* a; W; x, P6 j" E* {6 t2 e
in eax,dx9 a, z' H0 u: ~3 w7 K# d" J/ H
  7 o" B8 q0 w4 b
shr ax,5     ;bit 15-5,the base address2 x& O) m; P: R0 M
and ax,0000011111111111b# f  F4 K7 `  `2 q- j. `! n
mov base,ax: q. z2 p5 p$ S( G
  
9 Z. A3 k9 c( g3 R7 i: N, P7 L call ReadSpd
1 k7 T$ Z8 N# [8 v9 Vexit:2 U) t# g6 H! T) q% V
mov ax,4c00h
, S* Y6 K) H6 s! N& C int 21h
! g. T7 F. M+ g: omain endp/ G* g/ w: o/ D9 Q' M8 u. x
0 P' N, G2 e7 {: a! S0 s' r; W) H

9 `' J2 f8 o: |
3 C/ }: N, _) o6 Q9 RReadSpd proc
* K! N5 f  K5 u9 {, n0 x2 h pusha- v" |$ [7 r8 W/ l+ e6 B
Again:
# A6 V; }) [7 O' V" P mov ah,num* y/ m7 k9 R0 S2 W/ ^( L4 w' g
  and ah,00001111b
" n" e' b, E, l5 `7 M9 [ .if(ah==15d) ;CR_LF
( y( H$ K& J9 J+ J6 ^  m8 V  LF_CR
4 V8 g  S1 d7 U2 N$ V .endif; ?2 W" \2 z0 B; ]( S* `8 m% z2 H" k
# H  P- C! g. w9 g2 v- p
.repeat8 @: P% j/ W- ?% T( f$ x& [
  mov dx,base   ;reset host,claim host in use4 W( X6 u8 ^# \5 C$ O( Q  I
  add dx,0- e1 A- B7 y, N
  mov al,40h
# q/ A. j- Y6 D5 L8 U# j  ^% q  out dx,al2 k7 t* D1 P3 y+ r% x0 m
  : {0 q: h: y0 U9 Y# w$ y
  mov dx,base   1 g1 C1 B  s, w! v, E9 H
  in al,dx, r' j1 R- `8 X9 ^- J4 S  g% [
  mov SmbStatus,al
" M4 |3 t( ?) l) x) ^  j  
' a* l3 Z# q6 u0 x. f  mov dx,base   ;clear all status bits
* m, F6 r; D8 V. Z  mov al,1Eh   ;host status register
( e  g8 @# Z# g1 @  out dx,al, [4 ~5 K( A) V4 d: g
  , i8 l4 Q+ n/ W, N; ?" A+ a
  mov dx,base   ;set offset to read , N* W# y& F3 i; T; G4 w
  add dx,3    ;host command register# v0 `: C+ [+ L0 Y) ^( N
  mov al,num" ~. [2 M& q7 T- j6 w
  out dx,al, i- L6 H9 U" _! m) W: X$ M
  $ I' @) C( X. ]+ K' |1 ]) }  q# h
  mov dx,base   ;Transimit Slave Address register/ A( @3 X* @9 ~5 Y$ A/ Y' L3 N
  add dx,4; Y) f6 `, z6 \! D( l6 v
  mov al,0a1h- m. Y) V; |& q# r4 ?$ o$ j
  out dx,al
; c6 V: Y9 W9 A4 `* }8 X; K  
% x' D) q" B  G; Q* X  mov dx,base   ;set "Read Word" protocol and start bit
: t0 N# b$ A# p: R3 v  add dx,2    ;Host Control register" ?: w9 O( W$ p
  mov al,48h  + r! M& W8 N! u
  out dx,al
$ o  m+ A9 N# i) w0 P- B. t5 N 1 D( [) L1 O0 g4 V) B0 O9 W

& E# [  w0 i& y$ ^- o* s  
8 I1 h/ H! [+ v# m6 f4 H  mov dx,base2 f0 m- i3 P/ M7 w  J/ b
  in al,dx1 m1 |4 V4 A5 J3 r6 d; d0 E, j3 Z) o( e
  mov SmbStatus,al
" f; x$ {2 a7 k! {5 U& R  and al,1Eh1 h/ P, O3 g8 u/ ~+ s; ^- Z
  .while (al==0) ;check repeatly until any of
5 T/ A9 m% x+ G    mov dx,base      ;FAIL,BERR,DERR,INTR
5 i% j9 d$ v/ t& q    in al,dx
, @4 u0 V* m, ~, v% s    mov SmbStatus,al
" V% {& h9 A; {1 n: G    and al,1Eh
4 F% C! G9 t! U% J: O% g  .ENDW: j9 y) _0 W3 o* h
  
& A$ k7 o) y# g  mov al,SmbStatus   
6 s: p9 z9 C. G/ J# G, G  and al,1Ch4 |. @4 h8 n, T, C; Z( Z- l
  .if (al!=0)    ;check for errors  2 A9 q0 h. J( {2 W( x3 H/ ]# V
   mov al,SmbStatus
0 }7 N1 ]+ A  [# m, b1 B! z8 z   and al,08h   
' t9 Y6 T3 E6 a3 i9 e8 z. R   .continue .if (al!=0)  
! Q3 \; m' T* E8 M. A0 c5 c   jmp @F  6 W  k; m1 c! V! D3 M; V; ~. I
.else6 G4 X. b4 p4 R5 D2 j2 N
  mov dx,base
( z1 t( O& O) [: P' j  add dx,5h
6 k& `9 |, V+ z0 o% g' a  in al,dx  
4 C. p, e* b( ]9 ]2 T  call binhex 3 s* z9 E% ^& a( ?0 \3 x
  .break
+ `/ w9 I' l% \! ^ .endif
& o) X& q9 n  r+ f  " m, {: W1 ]. |9 x. b+ Z( b1 H
  .until (0) . ]0 U0 F3 o2 k. b5 b) @
  - [& W7 a  L% e! x  w: q6 v

0 u6 G$ Y. E" E ; L5 m* ~. W8 v
mov dl,20h ;output a space
8 a/ f, u$ d( N; h3 n7 I mov ah,2' h  e4 a) J+ X9 _! f& f$ e! o
pusha6 D9 ^. R/ u1 }7 i
int 21h2 I/ R4 {4 ~' d
popa, b/ u. a' U9 S8 W$ D" T1 \  n
inc num7 x! a9 j% z+ z9 F  S

' ^4 G- f, O5 u- b cmp num,80h ;get first spd 128 bytes / k* \; X7 O1 W7 z5 \* T6 g$ j6 y
jnz Again! L  ]  A' h6 c7 \8 v
3 w) [/ M" w! c) S: n' u
@@:$ J8 n! t" M: w0 e9 v
popa
  ^! b" b# K" D ret
( x8 ~' t( u) `" \4 EReadSpd endp% e3 n% N# `* n3 S5 s0 G/ o  K

5 y; r% O: B3 w" s) X- v/ m4 N( d" c; Y6 G, O2 h; l

9 b2 J% }) Y3 {/ E5 fbinhex proc ! b1 I/ C5 K5 b6 \3 {% Z! F
pusha ( G, H2 d! `4 k% N- `+ A- w, ^; v

& ~! ]5 i8 m7 I9 X- T1 W mov ch,2 ;2 hexadecimal digits to be printed
0 H2 T& }" y0 i5 s5 W) M2 K) Rloop3:
! L! F# N9 Z, a0 p# E* k1 B3 y mov cl,4 ;bits to be shifted  S* r9 a9 x3 X( t  X8 F' U3 M! s7 c
rol al,cl! z1 D6 M. ^* [  V% G
mov bl,al
5 A# g0 w5 j6 w5 ^3 C and bl,0fh ;mask the 4-bit Msb
  ]# t3 K! o* u+ I% u3 |; a add bl,30h0 X$ f2 W' Z% b9 y  ?
cmp bl,3ah
/ \' Q( {) M% q2 x- N$ k3 w jl next1  ;number or alpha?
+ ^  [5 q; K( g* ]) i! V& z; u, q2 ? add bl,7
7 P. b4 O) _! u% cnext1: " |4 i: f! G8 z2 y5 F3 z) ?
mov ah,2  ;print one hexadecimal digit' S5 v3 u# N% t! O; H
mov dl,bl
5 ]% o7 g+ |$ n' U: q! i pusha
7 [, G- c* o/ ?; r3 T& J int 21h8 {2 \" m; |  g) ]) `3 B, Z
popa
; `7 D" b) X& M4 a- ^% Q7 a; ?4 | dec ch/ u- _3 D' F0 a; d2 U
jnz loop3* O5 n# O- t' _8 l& H5 q
popa% O6 @* r% [& U7 N( J+ ^* n3 c
ret
* F. D4 k  M" b- P" sbinhex endp
5 G1 k+ Q/ N  J) w' 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, 2025-4-12 06:17 , Processed in 0.041004 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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